mirror of
https://github.com/osrg/gobgp.git
synced 2024-05-11 05:55:10 +00:00
api: Fix StartServerAPI
Currently, StartServerAPI accepts few parameters and setting such as BGP confederation and graceful restart cannot be configured via gRPC API. This commit fixes this API to accept all the parameters which is configurable in a configuration file/ Signed-off-by: Satoshi Fujimoto <[email protected]>
This commit is contained in:
+634
-498
File diff suppressed because it is too large
Load Diff
@@ -820,6 +820,7 @@ message GracefulRestart {
|
||||
uint32 deferral_time = 4;
|
||||
bool notification_enabled = 5;
|
||||
bool longlived_enabled = 6;
|
||||
uint32 stale_routes_time = 7;
|
||||
}
|
||||
|
||||
message MpGracefulRestartConfig {
|
||||
@@ -857,6 +858,7 @@ message RouteSelectionOptionsConfig {
|
||||
bool advertise_inactive_routes = 4;
|
||||
bool enable_aigp = 5;
|
||||
bool ignore_next_hop_igp_metric = 6;
|
||||
bool disable_best_path_selection = 7;
|
||||
}
|
||||
|
||||
message RouteSelectionOptionsState {
|
||||
@@ -866,6 +868,7 @@ message RouteSelectionOptionsState {
|
||||
bool advertise_inactive_routes = 4;
|
||||
bool enable_aigp = 5;
|
||||
bool ignore_next_hop_igp_metric = 6;
|
||||
bool disable_best_path_selection = 7;
|
||||
}
|
||||
|
||||
message RouteSelectionOptions {
|
||||
@@ -1153,6 +1156,11 @@ message Vrf {
|
||||
uint32 id = 5;
|
||||
}
|
||||
|
||||
message DefaultRouteDistance {
|
||||
uint32 external_route_distance = 1;
|
||||
uint32 internal_route_distance = 2;
|
||||
}
|
||||
|
||||
message Global {
|
||||
uint32 as = 1;
|
||||
string router_id = 2;
|
||||
@@ -1160,6 +1168,17 @@ message Global {
|
||||
repeated string listen_addresses = 4;
|
||||
repeated uint32 families = 5;
|
||||
bool use_multiple_paths = 6;
|
||||
RouteSelectionOptionsConfig route_selection_options = 7;
|
||||
DefaultRouteDistance default_route_distance = 8;
|
||||
Confederation confederation = 9;
|
||||
GracefulRestart graceful_restart = 10;
|
||||
ApplyPolicy apply_policy = 11;
|
||||
}
|
||||
|
||||
message Confederation {
|
||||
bool enabled = 1;
|
||||
uint32 identifier = 2;
|
||||
repeated uint32 member_as_list = 3;
|
||||
}
|
||||
|
||||
message TableInfo {
|
||||
|
||||
+132
-30
@@ -2408,6 +2408,134 @@ func (s *Server) GetServer(ctx context.Context, arg *GetServerRequest) (*GetServ
|
||||
}, nil
|
||||
}
|
||||
|
||||
func NewGlobalFromAPIStruct(a *Global) *config.Global {
|
||||
families := make([]config.AfiSafi, 0, len(a.Families))
|
||||
for _, f := range a.Families {
|
||||
name := config.IntToAfiSafiTypeMap[int(f)]
|
||||
rf, _ := bgp.GetRouteFamily(string(name))
|
||||
families = append(families, config.AfiSafi{
|
||||
Config: config.AfiSafiConfig{
|
||||
AfiSafiName: name,
|
||||
Enabled: true,
|
||||
},
|
||||
State: config.AfiSafiState{
|
||||
AfiSafiName: name,
|
||||
Enabled: true,
|
||||
Family: rf,
|
||||
},
|
||||
})
|
||||
}
|
||||
|
||||
applyPolicy := &config.ApplyPolicy{}
|
||||
ReadApplyPolicyFromAPIStruct(applyPolicy, a.ApplyPolicy)
|
||||
|
||||
global := &config.Global{
|
||||
Config: config.GlobalConfig{
|
||||
As: a.As,
|
||||
RouterId: a.RouterId,
|
||||
Port: a.ListenPort,
|
||||
LocalAddressList: a.ListenAddresses,
|
||||
},
|
||||
ApplyPolicy: *applyPolicy,
|
||||
AfiSafis: families,
|
||||
UseMultiplePaths: config.UseMultiplePaths{
|
||||
Config: config.UseMultiplePathsConfig{
|
||||
Enabled: a.UseMultiplePaths,
|
||||
},
|
||||
},
|
||||
}
|
||||
if a.RouteSelectionOptions != nil {
|
||||
global.RouteSelectionOptions = config.RouteSelectionOptions{
|
||||
Config: config.RouteSelectionOptionsConfig{
|
||||
AlwaysCompareMed: a.RouteSelectionOptions.AlwaysCompareMed,
|
||||
IgnoreAsPathLength: a.RouteSelectionOptions.IgnoreAsPathLength,
|
||||
ExternalCompareRouterId: a.RouteSelectionOptions.ExternalCompareRouterId,
|
||||
AdvertiseInactiveRoutes: a.RouteSelectionOptions.AdvertiseInactiveRoutes,
|
||||
EnableAigp: a.RouteSelectionOptions.EnableAigp,
|
||||
IgnoreNextHopIgpMetric: a.RouteSelectionOptions.IgnoreNextHopIgpMetric,
|
||||
DisableBestPathSelection: a.RouteSelectionOptions.DisableBestPathSelection,
|
||||
},
|
||||
}
|
||||
}
|
||||
if a.DefaultRouteDistance != nil {
|
||||
global.DefaultRouteDistance = config.DefaultRouteDistance{
|
||||
Config: config.DefaultRouteDistanceConfig{
|
||||
ExternalRouteDistance: uint8(a.DefaultRouteDistance.ExternalRouteDistance),
|
||||
InternalRouteDistance: uint8(a.DefaultRouteDistance.InternalRouteDistance),
|
||||
},
|
||||
}
|
||||
}
|
||||
if a.Confederation != nil {
|
||||
global.Confederation = config.Confederation{
|
||||
Config: config.ConfederationConfig{
|
||||
Enabled: a.Confederation.Enabled,
|
||||
Identifier: a.Confederation.Identifier,
|
||||
MemberAsList: a.Confederation.MemberAsList,
|
||||
},
|
||||
}
|
||||
}
|
||||
if a.GracefulRestart != nil {
|
||||
global.GracefulRestart = config.GracefulRestart{
|
||||
Config: config.GracefulRestartConfig{
|
||||
Enabled: a.GracefulRestart.Enabled,
|
||||
RestartTime: uint16(a.GracefulRestart.RestartTime),
|
||||
StaleRoutesTime: float64(a.GracefulRestart.StaleRoutesTime),
|
||||
HelperOnly: a.GracefulRestart.HelperOnly,
|
||||
DeferralTime: uint16(a.GracefulRestart.DeferralTime),
|
||||
NotificationEnabled: a.GracefulRestart.NotificationEnabled,
|
||||
LongLivedEnabled: a.GracefulRestart.LonglivedEnabled,
|
||||
},
|
||||
}
|
||||
}
|
||||
return global
|
||||
}
|
||||
|
||||
func NewGlobalFromConfigStruct(c *config.Global) *Global {
|
||||
families := make([]uint32, 0, len(c.AfiSafis))
|
||||
for _, f := range c.AfiSafis {
|
||||
families = append(families, uint32(config.AfiSafiTypeToIntMap[f.Config.AfiSafiName]))
|
||||
}
|
||||
|
||||
applyPolicy := NewApplyPolicyFromConfigStruct(&c.ApplyPolicy)
|
||||
|
||||
return &Global{
|
||||
As: c.Config.As,
|
||||
RouterId: c.Config.RouterId,
|
||||
ListenPort: c.Config.Port,
|
||||
ListenAddresses: c.Config.LocalAddressList,
|
||||
Families: families,
|
||||
UseMultiplePaths: c.UseMultiplePaths.Config.Enabled,
|
||||
RouteSelectionOptions: &RouteSelectionOptionsConfig{
|
||||
AlwaysCompareMed: c.RouteSelectionOptions.Config.AlwaysCompareMed,
|
||||
IgnoreAsPathLength: c.RouteSelectionOptions.Config.IgnoreAsPathLength,
|
||||
ExternalCompareRouterId: c.RouteSelectionOptions.Config.ExternalCompareRouterId,
|
||||
AdvertiseInactiveRoutes: c.RouteSelectionOptions.Config.AdvertiseInactiveRoutes,
|
||||
EnableAigp: c.RouteSelectionOptions.Config.EnableAigp,
|
||||
IgnoreNextHopIgpMetric: c.RouteSelectionOptions.Config.IgnoreNextHopIgpMetric,
|
||||
DisableBestPathSelection: c.RouteSelectionOptions.Config.DisableBestPathSelection,
|
||||
},
|
||||
DefaultRouteDistance: &DefaultRouteDistance{
|
||||
ExternalRouteDistance: uint32(c.DefaultRouteDistance.Config.ExternalRouteDistance),
|
||||
InternalRouteDistance: uint32(c.DefaultRouteDistance.Config.InternalRouteDistance),
|
||||
},
|
||||
Confederation: &Confederation{
|
||||
Enabled: c.Confederation.Config.Enabled,
|
||||
Identifier: c.Confederation.Config.Identifier,
|
||||
MemberAsList: c.Confederation.Config.MemberAsList,
|
||||
},
|
||||
GracefulRestart: &GracefulRestart{
|
||||
Enabled: c.GracefulRestart.Config.Enabled,
|
||||
RestartTime: uint32(c.GracefulRestart.Config.RestartTime),
|
||||
StaleRoutesTime: uint32(c.GracefulRestart.Config.StaleRoutesTime),
|
||||
HelperOnly: c.GracefulRestart.Config.HelperOnly,
|
||||
DeferralTime: uint32(c.GracefulRestart.Config.DeferralTime),
|
||||
NotificationEnabled: c.GracefulRestart.Config.NotificationEnabled,
|
||||
LonglivedEnabled: c.GracefulRestart.Config.LongLivedEnabled,
|
||||
},
|
||||
ApplyPolicy: applyPolicy,
|
||||
}
|
||||
}
|
||||
|
||||
func (s *Server) StartServer(ctx context.Context, arg *StartServerRequest) (*StartServerResponse, error) {
|
||||
if arg == nil || arg.Global == nil {
|
||||
return nil, fmt.Errorf("invalid request")
|
||||
@@ -2416,36 +2544,10 @@ func (s *Server) StartServer(ctx context.Context, arg *StartServerRequest) (*Sta
|
||||
if net.ParseIP(g.RouterId) == nil {
|
||||
return nil, fmt.Errorf("invalid router-id format: %s", g.RouterId)
|
||||
}
|
||||
families := make([]config.AfiSafi, 0, len(g.Families))
|
||||
for _, f := range g.Families {
|
||||
name := config.AfiSafiType(bgp.RouteFamily(f).String())
|
||||
families = append(families, config.AfiSafi{
|
||||
Config: config.AfiSafiConfig{
|
||||
AfiSafiName: name,
|
||||
Enabled: true,
|
||||
},
|
||||
State: config.AfiSafiState{
|
||||
AfiSafiName: name,
|
||||
},
|
||||
})
|
||||
}
|
||||
b := &config.BgpConfigSet{
|
||||
Global: config.Global{
|
||||
Config: config.GlobalConfig{
|
||||
As: g.As,
|
||||
RouterId: g.RouterId,
|
||||
Port: g.ListenPort,
|
||||
LocalAddressList: g.ListenAddresses,
|
||||
},
|
||||
AfiSafis: families,
|
||||
UseMultiplePaths: config.UseMultiplePaths{
|
||||
Config: config.UseMultiplePathsConfig{
|
||||
Enabled: g.UseMultiplePaths,
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
return &StartServerResponse{}, s.bgpServer.Start(&b.Global)
|
||||
|
||||
global := NewGlobalFromAPIStruct(arg.Global)
|
||||
|
||||
return &StartServerResponse{}, s.bgpServer.Start(global)
|
||||
}
|
||||
|
||||
func (s *Server) StopServer(ctx context.Context, arg *StopServerRequest) (*StopServerResponse, error) {
|
||||
|
||||
+1
-7
@@ -179,13 +179,7 @@ func main() {
|
||||
if c == nil {
|
||||
c = newConfig
|
||||
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,
|
||||
},
|
||||
Global: api.NewGlobalFromConfigStruct(&c.Global),
|
||||
}); err != nil {
|
||||
log.Fatalf("failed to set global config: %s", err)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user