diff options
author | Carl Baldwin <carl@ecbaldwin.net> | 2019-07-24 09:01:47 -0600 |
---|---|---|
committer | FUJITA Tomonori <fujita.tomonori@gmail.com> | 2019-08-28 09:06:20 +0900 |
commit | 8faa1a704bc35fedee0d152255308afb3db7a0bf (patch) | |
tree | 70b11409c32218b05db343d4c3091a9408d16c0d | |
parent | d81023dd4d1db3b10215c21275cab75ddda9ec30 (diff) |
Move code to new public config package
-rw-r--r-- | cmd/gobgpd/main.go | 318 | ||||
-rw-r--r-- | pkg/config/config.go | 323 |
2 files changed, 326 insertions, 315 deletions
diff --git a/cmd/gobgpd/main.go b/cmd/gobgpd/main.go index e8d9df4b..e0fcda33 100644 --- a/cmd/gobgpd/main.go +++ b/cmd/gobgpd/main.go @@ -27,7 +27,6 @@ import ( "syscall" "github.com/coreos/go-systemd/daemon" - "github.com/golang/protobuf/ptypes/any" "github.com/jessevdk/go-flags" "github.com/kr/pretty" log "github.com/sirupsen/logrus" @@ -36,323 +35,12 @@ import ( "google.golang.org/grpc/credentials" api "github.com/osrg/gobgp/api" - "github.com/osrg/gobgp/internal/pkg/apiutil" "github.com/osrg/gobgp/internal/pkg/config" - "github.com/osrg/gobgp/internal/pkg/table" "github.com/osrg/gobgp/internal/pkg/version" - "github.com/osrg/gobgp/pkg/packet/bgp" + config_api "github.com/osrg/gobgp/pkg/config" "github.com/osrg/gobgp/pkg/server" ) -func marshalRouteTargets(l []string) ([]*any.Any, error) { - rtList := make([]*any.Any, 0, len(l)) - for _, rtString := range l { - rt, err := bgp.ParseRouteTarget(rtString) - if err != nil { - return nil, err - } - rtList = append(rtList, apiutil.MarshalRT(rt)) - } - return rtList, nil -} - -func assignGlobalpolicy(bgpServer *server.BgpServer, a *config.ApplyPolicyConfig) { - toDefaultTable := func(r config.DefaultPolicyType) table.RouteType { - var def table.RouteType - switch r { - case config.DEFAULT_POLICY_TYPE_ACCEPT_ROUTE: - def = table.ROUTE_TYPE_ACCEPT - case config.DEFAULT_POLICY_TYPE_REJECT_ROUTE: - def = table.ROUTE_TYPE_REJECT - } - return def - } - toPolicies := func(r []string) []*table.Policy { - p := make([]*table.Policy, 0, len(r)) - for _, n := range r { - p = append(p, &table.Policy{ - Name: n, - }) - } - return p - } - - def := toDefaultTable(a.DefaultImportPolicy) - ps := toPolicies(a.ImportPolicyList) - bgpServer.SetPolicyAssignment(context.Background(), &api.SetPolicyAssignmentRequest{ - Assignment: table.NewAPIPolicyAssignmentFromTableStruct(&table.PolicyAssignment{ - Name: table.GLOBAL_RIB_NAME, - Type: table.POLICY_DIRECTION_IMPORT, - Policies: ps, - Default: def, - }), - }) - - def = toDefaultTable(a.DefaultExportPolicy) - ps = toPolicies(a.ExportPolicyList) - bgpServer.SetPolicyAssignment(context.Background(), &api.SetPolicyAssignmentRequest{ - Assignment: table.NewAPIPolicyAssignmentFromTableStruct(&table.PolicyAssignment{ - Name: table.GLOBAL_RIB_NAME, - Type: table.POLICY_DIRECTION_EXPORT, - Policies: ps, - Default: def, - }), - }) - -} - -func addPeerGroups(bgpServer *server.BgpServer, addedPg []config.PeerGroup) { - for _, pg := range addedPg { - log.Infof("PeerGroup %s is added", pg.Config.PeerGroupName) - if err := bgpServer.AddPeerGroup(context.Background(), &api.AddPeerGroupRequest{ - PeerGroup: config.NewPeerGroupFromConfigStruct(&pg), - }); err != nil { - log.Warn(err) - } - } -} - -func deletePeerGroups(bgpServer *server.BgpServer, deletedPg []config.PeerGroup) { - for _, pg := range deletedPg { - log.Infof("PeerGroup %s is deleted", pg.Config.PeerGroupName) - if err := bgpServer.DeletePeerGroup(context.Background(), &api.DeletePeerGroupRequest{ - Name: pg.Config.PeerGroupName, - }); err != nil { - log.Warn(err) - } - } -} - -func updatePeerGroups(bgpServer *server.BgpServer, updatedPg []config.PeerGroup) bool { - for _, pg := range updatedPg { - log.Infof("PeerGroup %s is updated", pg.Config.PeerGroupName) - if u, err := bgpServer.UpdatePeerGroup(context.Background(), &api.UpdatePeerGroupRequest{ - PeerGroup: config.NewPeerGroupFromConfigStruct(&pg), - }); err != nil { - log.Warn(err) - } else { - return u.NeedsSoftResetIn - } - } - return false -} - -func addDynamicNeighbors(bgpServer *server.BgpServer, dynamicNeighbors []config.DynamicNeighbor) { - for _, dn := range dynamicNeighbors { - log.Infof("Dynamic Neighbor %s is added to PeerGroup %s", dn.Config.Prefix, dn.Config.PeerGroup) - if err := bgpServer.AddDynamicNeighbor(context.Background(), &api.AddDynamicNeighborRequest{ - DynamicNeighbor: &api.DynamicNeighbor{ - Prefix: dn.Config.Prefix, - PeerGroup: dn.Config.PeerGroup, - }, - }); err != nil { - log.Warn(err) - } - } -} - -func addNeighbors(bgpServer *server.BgpServer, added []config.Neighbor) { - for _, p := range added { - log.Infof("Peer %v is added", p.State.NeighborAddress) - if err := bgpServer.AddPeer(context.Background(), &api.AddPeerRequest{ - Peer: config.NewPeerFromConfigStruct(&p), - }); err != nil { - log.Warn(err) - } - } -} - -func deleteNeighbors(bgpServer *server.BgpServer, deleted []config.Neighbor) { - for _, p := range deleted { - log.Infof("Peer %v is deleted", p.State.NeighborAddress) - if err := bgpServer.DeletePeer(context.Background(), &api.DeletePeerRequest{ - Address: p.State.NeighborAddress, - }); err != nil { - log.Warn(err) - } - } -} - -func updateNeighbors(bgpServer *server.BgpServer, updated []config.Neighbor) bool { - for _, p := range updated { - log.Infof("Peer %v is updated", p.State.NeighborAddress) - if u, err := bgpServer.UpdatePeer(context.Background(), &api.UpdatePeerRequest{ - Peer: config.NewPeerFromConfigStruct(&p), - }); err != nil { - log.Warn(err) - } else { - return u.NeedsSoftResetIn - } - } - return false -} - -func applyInitialConfig(bgpServer *server.BgpServer, newConfig *config.BgpConfigSet, isGracefulRestart bool) *config.BgpConfigSet { - if err := bgpServer.StartBgp(context.Background(), &api.StartBgpRequest{ - Global: config.NewGlobalFromConfigStruct(&newConfig.Global), - }); err != nil { - log.Fatalf("failed to set global config: %s", err) - } - - if newConfig.Zebra.Config.Enabled { - tps := newConfig.Zebra.Config.RedistributeRouteTypeList - l := make([]string, 0, len(tps)) - for _, t := range tps { - l = append(l, string(t)) - } - if err := bgpServer.EnableZebra(context.Background(), &api.EnableZebraRequest{ - Url: newConfig.Zebra.Config.Url, - RouteTypes: l, - Version: uint32(newConfig.Zebra.Config.Version), - NexthopTriggerEnable: newConfig.Zebra.Config.NexthopTriggerEnable, - NexthopTriggerDelay: uint32(newConfig.Zebra.Config.NexthopTriggerDelay), - MplsLabelRangeSize: uint32(newConfig.Zebra.Config.MplsLabelRangeSize), - SoftwareName: newConfig.Zebra.Config.SoftwareName, - }); err != nil { - log.Fatalf("failed to set zebra config: %s", err) - } - } - - if len(newConfig.Collector.Config.Url) > 0 { - log.Fatal("collector feature is not supported") - } - - for _, c := range newConfig.RpkiServers { - if err := bgpServer.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 _, c := range newConfig.BmpServers { - if err := bgpServer.AddBmp(context.Background(), &api.AddBmpRequest{ - Address: c.Config.Address, - Port: c.Config.Port, - SysName: c.Config.SysName, - SysDescr: c.Config.SysDescr, - Policy: api.AddBmpRequest_MonitoringPolicy(c.Config.RouteMonitoringPolicy.ToInt()), - StatisticsTimeout: int32(c.Config.StatisticsTimeout), - }); err != nil { - log.Fatalf("failed to set bmp config: %s", err) - } - } - for _, vrf := range newConfig.Vrfs { - rd, err := bgp.ParseRouteDistinguisher(vrf.Config.Rd) - if err != nil { - log.Fatalf("failed to load vrf rd config: %s", err) - } - - importRtList, err := marshalRouteTargets(vrf.Config.ImportRtList) - if err != nil { - log.Fatalf("failed to load vrf import rt config: %s", err) - } - exportRtList, err := marshalRouteTargets(vrf.Config.ExportRtList) - if err != nil { - log.Fatalf("failed to load vrf export rt config: %s", err) - } - - if err := bgpServer.AddVrf(context.Background(), &api.AddVrfRequest{ - Vrf: &api.Vrf{ - Name: vrf.Config.Name, - Rd: apiutil.MarshalRD(rd), - Id: uint32(vrf.Config.Id), - ImportRt: importRtList, - ExportRt: exportRtList, - }, - }); err != nil { - log.Fatalf("failed to set vrf config: %s", err) - } - } - for _, c := range newConfig.MrtDump { - if len(c.Config.FileName) == 0 { - continue - } - if err := bgpServer.EnableMrt(context.Background(), &api.EnableMrtRequest{ - DumpType: int32(c.Config.DumpType.ToInt()), - Filename: c.Config.FileName, - DumpInterval: c.Config.DumpInterval, - RotationInterval: c.Config.RotationInterval, - }); err != nil { - log.Fatalf("failed to set mrt config: %s", err) - } - } - p := config.ConfigSetToRoutingPolicy(newConfig) - rp, err := table.NewAPIRoutingPolicyFromConfigStruct(p) - if err != nil { - log.Warn(err) - } else { - bgpServer.SetPolicies(context.Background(), &api.SetPoliciesRequest{ - DefinedSets: rp.DefinedSets, - Policies: rp.Policies, - }) - } - - assignGlobalpolicy(bgpServer, &newConfig.Global.ApplyPolicy.Config) - - added := newConfig.Neighbors - addedPg := newConfig.PeerGroups - if isGracefulRestart { - for i, n := range added { - if n.GracefulRestart.Config.Enabled { - added[i].GracefulRestart.State.LocalRestarting = true - } - } - } - - addPeerGroups(bgpServer, addedPg) - addDynamicNeighbors(bgpServer, newConfig.DynamicNeighbors) - addNeighbors(bgpServer, added) - return newConfig -} - -func updateConfig(bgpServer *server.BgpServer, c, newConfig *config.BgpConfigSet) *config.BgpConfigSet { - addedPg, deletedPg, updatedPg := config.UpdatePeerGroupConfig(c, newConfig) - added, deleted, updated := config.UpdateNeighborConfig(c, newConfig) - updatePolicy := config.CheckPolicyDifference(config.ConfigSetToRoutingPolicy(c), config.ConfigSetToRoutingPolicy(newConfig)) - - if updatePolicy { - log.Info("Policy config is updated") - p := config.ConfigSetToRoutingPolicy(newConfig) - rp, err := table.NewAPIRoutingPolicyFromConfigStruct(p) - if err != nil { - log.Warn(err) - } else { - bgpServer.SetPolicies(context.Background(), &api.SetPoliciesRequest{ - DefinedSets: rp.DefinedSets, - Policies: rp.Policies, - }) - } - } - // global policy update - if !newConfig.Global.ApplyPolicy.Config.Equal(&c.Global.ApplyPolicy.Config) { - assignGlobalpolicy(bgpServer, &newConfig.Global.ApplyPolicy.Config) - updatePolicy = true - } - - addPeerGroups(bgpServer, addedPg) - deletePeerGroups(bgpServer, deletedPg) - needsSoftResetIn := updatePeerGroups(bgpServer, updatedPg) - updatePolicy = updatePolicy || needsSoftResetIn - addDynamicNeighbors(bgpServer, newConfig.DynamicNeighbors) - addNeighbors(bgpServer, added) - deleteNeighbors(bgpServer, deleted) - needsSoftResetIn = updateNeighbors(bgpServer, updated) - updatePolicy = updatePolicy || needsSoftResetIn - - if updatePolicy { - if err := bgpServer.ResetPeer(context.Background(), &api.ResetPeerRequest{ - Address: "", - Direction: api.ResetPeerRequest_IN, - Soft: true, - }); err != nil { - log.Warn(err) - } - } - return newConfig -} - func main() { sigCh := make(chan os.Signal, 1) signal.Notify(sigCh, syscall.SIGTERM) @@ -475,7 +163,7 @@ func main() { loop := func() { var c *config.BgpConfigSet initialConfig := <-configCh - c = applyInitialConfig(bgpServer, initialConfig, opts.GracefulRestart) + c = config_api.ApplyInitialConfig(bgpServer, initialConfig, opts.GracefulRestart) for { select { case <-sigCh: @@ -485,7 +173,7 @@ func main() { } return case newConfig := <-configCh: - c = updateConfig(bgpServer, c, newConfig) + c = config_api.UpdateConfig(bgpServer, c, newConfig) } } } diff --git a/pkg/config/config.go b/pkg/config/config.go new file mode 100644 index 00000000..4a4394df --- /dev/null +++ b/pkg/config/config.go @@ -0,0 +1,323 @@ +package config + +import ( + "github.com/golang/protobuf/ptypes/any" + log "github.com/sirupsen/logrus" + "golang.org/x/net/context" + + api "github.com/osrg/gobgp/api" + "github.com/osrg/gobgp/internal/pkg/apiutil" + "github.com/osrg/gobgp/internal/pkg/config" + "github.com/osrg/gobgp/internal/pkg/table" + "github.com/osrg/gobgp/pkg/packet/bgp" + "github.com/osrg/gobgp/pkg/server" +) + +func marshalRouteTargets(l []string) ([]*any.Any, error) { + rtList := make([]*any.Any, 0, len(l)) + for _, rtString := range l { + rt, err := bgp.ParseRouteTarget(rtString) + if err != nil { + return nil, err + } + rtList = append(rtList, apiutil.MarshalRT(rt)) + } + return rtList, nil +} + +func assignGlobalpolicy(bgpServer *server.BgpServer, a *config.ApplyPolicyConfig) { + toDefaultTable := func(r config.DefaultPolicyType) table.RouteType { + var def table.RouteType + switch r { + case config.DEFAULT_POLICY_TYPE_ACCEPT_ROUTE: + def = table.ROUTE_TYPE_ACCEPT + case config.DEFAULT_POLICY_TYPE_REJECT_ROUTE: + def = table.ROUTE_TYPE_REJECT + } + return def + } + toPolicies := func(r []string) []*table.Policy { + p := make([]*table.Policy, 0, len(r)) + for _, n := range r { + p = append(p, &table.Policy{ + Name: n, + }) + } + return p + } + + def := toDefaultTable(a.DefaultImportPolicy) + ps := toPolicies(a.ImportPolicyList) + bgpServer.SetPolicyAssignment(context.Background(), &api.SetPolicyAssignmentRequest{ + Assignment: table.NewAPIPolicyAssignmentFromTableStruct(&table.PolicyAssignment{ + Name: table.GLOBAL_RIB_NAME, + Type: table.POLICY_DIRECTION_IMPORT, + Policies: ps, + Default: def, + }), + }) + + def = toDefaultTable(a.DefaultExportPolicy) + ps = toPolicies(a.ExportPolicyList) + bgpServer.SetPolicyAssignment(context.Background(), &api.SetPolicyAssignmentRequest{ + Assignment: table.NewAPIPolicyAssignmentFromTableStruct(&table.PolicyAssignment{ + Name: table.GLOBAL_RIB_NAME, + Type: table.POLICY_DIRECTION_EXPORT, + Policies: ps, + Default: def, + }), + }) + +} + +func addPeerGroups(bgpServer *server.BgpServer, addedPg []config.PeerGroup) { + for _, pg := range addedPg { + log.Infof("PeerGroup %s is added", pg.Config.PeerGroupName) + if err := bgpServer.AddPeerGroup(context.Background(), &api.AddPeerGroupRequest{ + PeerGroup: config.NewPeerGroupFromConfigStruct(&pg), + }); err != nil { + log.Warn(err) + } + } +} + +func deletePeerGroups(bgpServer *server.BgpServer, deletedPg []config.PeerGroup) { + for _, pg := range deletedPg { + log.Infof("PeerGroup %s is deleted", pg.Config.PeerGroupName) + if err := bgpServer.DeletePeerGroup(context.Background(), &api.DeletePeerGroupRequest{ + Name: pg.Config.PeerGroupName, + }); err != nil { + log.Warn(err) + } + } +} + +func updatePeerGroups(bgpServer *server.BgpServer, updatedPg []config.PeerGroup) bool { + for _, pg := range updatedPg { + log.Infof("PeerGroup %s is updated", pg.Config.PeerGroupName) + if u, err := bgpServer.UpdatePeerGroup(context.Background(), &api.UpdatePeerGroupRequest{ + PeerGroup: config.NewPeerGroupFromConfigStruct(&pg), + }); err != nil { + log.Warn(err) + } else { + return u.NeedsSoftResetIn + } + } + return false +} + +func addDynamicNeighbors(bgpServer *server.BgpServer, dynamicNeighbors []config.DynamicNeighbor) { + for _, dn := range dynamicNeighbors { + log.Infof("Dynamic Neighbor %s is added to PeerGroup %s", dn.Config.Prefix, dn.Config.PeerGroup) + if err := bgpServer.AddDynamicNeighbor(context.Background(), &api.AddDynamicNeighborRequest{ + DynamicNeighbor: &api.DynamicNeighbor{ + Prefix: dn.Config.Prefix, + PeerGroup: dn.Config.PeerGroup, + }, + }); err != nil { + log.Warn(err) + } + } +} + +func addNeighbors(bgpServer *server.BgpServer, added []config.Neighbor) { + for _, p := range added { + log.Infof("Peer %v is added", p.State.NeighborAddress) + if err := bgpServer.AddPeer(context.Background(), &api.AddPeerRequest{ + Peer: config.NewPeerFromConfigStruct(&p), + }); err != nil { + log.Warn(err) + } + } +} + +func deleteNeighbors(bgpServer *server.BgpServer, deleted []config.Neighbor) { + for _, p := range deleted { + log.Infof("Peer %v is deleted", p.State.NeighborAddress) + if err := bgpServer.DeletePeer(context.Background(), &api.DeletePeerRequest{ + Address: p.State.NeighborAddress, + }); err != nil { + log.Warn(err) + } + } +} + +func updateNeighbors(bgpServer *server.BgpServer, updated []config.Neighbor) bool { + for _, p := range updated { + log.Infof("Peer %v is updated", p.State.NeighborAddress) + if u, err := bgpServer.UpdatePeer(context.Background(), &api.UpdatePeerRequest{ + Peer: config.NewPeerFromConfigStruct(&p), + }); err != nil { + log.Warn(err) + } else { + return u.NeedsSoftResetIn + } + } + return false +} + +func ApplyInitialConfig(bgpServer *server.BgpServer, newConfig *config.BgpConfigSet, isGracefulRestart bool) *config.BgpConfigSet { + if err := bgpServer.StartBgp(context.Background(), &api.StartBgpRequest{ + Global: config.NewGlobalFromConfigStruct(&newConfig.Global), + }); err != nil { + log.Fatalf("failed to set global config: %s", err) + } + + if newConfig.Zebra.Config.Enabled { + tps := newConfig.Zebra.Config.RedistributeRouteTypeList + l := make([]string, 0, len(tps)) + for _, t := range tps { + l = append(l, string(t)) + } + if err := bgpServer.EnableZebra(context.Background(), &api.EnableZebraRequest{ + Url: newConfig.Zebra.Config.Url, + RouteTypes: l, + Version: uint32(newConfig.Zebra.Config.Version), + NexthopTriggerEnable: newConfig.Zebra.Config.NexthopTriggerEnable, + NexthopTriggerDelay: uint32(newConfig.Zebra.Config.NexthopTriggerDelay), + MplsLabelRangeSize: uint32(newConfig.Zebra.Config.MplsLabelRangeSize), + SoftwareName: newConfig.Zebra.Config.SoftwareName, + }); err != nil { + log.Fatalf("failed to set zebra config: %s", err) + } + } + + if len(newConfig.Collector.Config.Url) > 0 { + log.Fatal("collector feature is not supported") + } + + for _, c := range newConfig.RpkiServers { + if err := bgpServer.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 _, c := range newConfig.BmpServers { + if err := bgpServer.AddBmp(context.Background(), &api.AddBmpRequest{ + Address: c.Config.Address, + Port: c.Config.Port, + SysName: c.Config.SysName, + SysDescr: c.Config.SysDescr, + Policy: api.AddBmpRequest_MonitoringPolicy(c.Config.RouteMonitoringPolicy.ToInt()), + StatisticsTimeout: int32(c.Config.StatisticsTimeout), + }); err != nil { + log.Fatalf("failed to set bmp config: %s", err) + } + } + for _, vrf := range newConfig.Vrfs { + rd, err := bgp.ParseRouteDistinguisher(vrf.Config.Rd) + if err != nil { + log.Fatalf("failed to load vrf rd config: %s", err) + } + + importRtList, err := marshalRouteTargets(vrf.Config.ImportRtList) + if err != nil { + log.Fatalf("failed to load vrf import rt config: %s", err) + } + exportRtList, err := marshalRouteTargets(vrf.Config.ExportRtList) + if err != nil { + log.Fatalf("failed to load vrf export rt config: %s", err) + } + + if err := bgpServer.AddVrf(context.Background(), &api.AddVrfRequest{ + Vrf: &api.Vrf{ + Name: vrf.Config.Name, + Rd: apiutil.MarshalRD(rd), + Id: uint32(vrf.Config.Id), + ImportRt: importRtList, + ExportRt: exportRtList, + }, + }); err != nil { + log.Fatalf("failed to set vrf config: %s", err) + } + } + for _, c := range newConfig.MrtDump { + if len(c.Config.FileName) == 0 { + continue + } + if err := bgpServer.EnableMrt(context.Background(), &api.EnableMrtRequest{ + DumpType: int32(c.Config.DumpType.ToInt()), + Filename: c.Config.FileName, + DumpInterval: c.Config.DumpInterval, + RotationInterval: c.Config.RotationInterval, + }); err != nil { + log.Fatalf("failed to set mrt config: %s", err) + } + } + p := config.ConfigSetToRoutingPolicy(newConfig) + rp, err := table.NewAPIRoutingPolicyFromConfigStruct(p) + if err != nil { + log.Warn(err) + } else { + bgpServer.SetPolicies(context.Background(), &api.SetPoliciesRequest{ + DefinedSets: rp.DefinedSets, + Policies: rp.Policies, + }) + } + + assignGlobalpolicy(bgpServer, &newConfig.Global.ApplyPolicy.Config) + + added := newConfig.Neighbors + addedPg := newConfig.PeerGroups + if isGracefulRestart { + for i, n := range added { + if n.GracefulRestart.Config.Enabled { + added[i].GracefulRestart.State.LocalRestarting = true + } + } + } + + addPeerGroups(bgpServer, addedPg) + addDynamicNeighbors(bgpServer, newConfig.DynamicNeighbors) + addNeighbors(bgpServer, added) + return newConfig +} + +func UpdateConfig(bgpServer *server.BgpServer, c, newConfig *config.BgpConfigSet) *config.BgpConfigSet { + addedPg, deletedPg, updatedPg := config.UpdatePeerGroupConfig(c, newConfig) + added, deleted, updated := config.UpdateNeighborConfig(c, newConfig) + updatePolicy := config.CheckPolicyDifference(config.ConfigSetToRoutingPolicy(c), config.ConfigSetToRoutingPolicy(newConfig)) + + if updatePolicy { + log.Info("Policy config is updated") + p := config.ConfigSetToRoutingPolicy(newConfig) + rp, err := table.NewAPIRoutingPolicyFromConfigStruct(p) + if err != nil { + log.Warn(err) + } else { + bgpServer.SetPolicies(context.Background(), &api.SetPoliciesRequest{ + DefinedSets: rp.DefinedSets, + Policies: rp.Policies, + }) + } + } + // global policy update + if !newConfig.Global.ApplyPolicy.Config.Equal(&c.Global.ApplyPolicy.Config) { + assignGlobalpolicy(bgpServer, &newConfig.Global.ApplyPolicy.Config) + updatePolicy = true + } + + addPeerGroups(bgpServer, addedPg) + deletePeerGroups(bgpServer, deletedPg) + needsSoftResetIn := updatePeerGroups(bgpServer, updatedPg) + updatePolicy = updatePolicy || needsSoftResetIn + addDynamicNeighbors(bgpServer, newConfig.DynamicNeighbors) + addNeighbors(bgpServer, added) + deleteNeighbors(bgpServer, deleted) + needsSoftResetIn = updateNeighbors(bgpServer, updated) + updatePolicy = updatePolicy || needsSoftResetIn + + if updatePolicy { + if err := bgpServer.ResetPeer(context.Background(), &api.ResetPeerRequest{ + Address: "", + Direction: api.ResetPeerRequest_IN, + Soft: true, + }); err != nil { + log.Warn(err) + } + } + return newConfig +} |