diff options
author | Marcus Wichelmann <mail@marcusw.de> | 2021-02-14 22:23:54 +0100 |
---|---|---|
committer | Marcus Wichelmann <mail@marcusw.de> | 2021-03-29 20:53:25 +0200 |
commit | c1e7463e361632de60337cfd52dc44eb453d9746 (patch) | |
tree | d3df6e8ed8e99a9e75aca6093f0816c40a57e051 | |
parent | 7ff15bfa54ac1b0ff7b03ee73e2bee4e7a3d3d73 (diff) |
Added ListPeerGroup message to API
-rw-r--r-- | api/attribute.pb.go | 2 | ||||
-rw-r--r-- | api/gobgp.proto | 5 | ||||
-rw-r--r-- | pkg/server/grpc_server.go | 12 | ||||
-rw-r--r-- | pkg/server/server.go | 25 |
4 files changed, 44 insertions, 0 deletions
diff --git a/api/attribute.pb.go b/api/attribute.pb.go index 5500251c..8cbf6096 100644 --- a/api/attribute.pb.go +++ b/api/attribute.pb.go @@ -157,6 +157,8 @@ It has these top-level messages: DeletePeerGroupRequest UpdatePeerGroupRequest UpdatePeerGroupResponse + ListPeerGroupRequest + ListPeerGroupResponse AddDynamicNeighborRequest AddPathRequest AddPathResponse diff --git a/api/gobgp.proto b/api/gobgp.proto index d90b19f8..3263adf8 100644 --- a/api/gobgp.proto +++ b/api/gobgp.proto @@ -46,6 +46,7 @@ service GobgpApi { rpc AddPeerGroup(AddPeerGroupRequest) returns(google.protobuf.Empty); rpc DeletePeerGroup(DeletePeerGroupRequest) returns(google.protobuf.Empty); + rpc ListPeerGroup(ListPeerGroupRequest) returns(stream ListPeerGroupResponse); rpc UpdatePeerGroup(UpdatePeerGroupRequest) returns(UpdatePeerGroupResponse); rpc AddDynamicNeighbor(AddDynamicNeighborRequest) @@ -179,6 +180,10 @@ message UpdatePeerGroupRequest { message UpdatePeerGroupResponse { bool needs_soft_reset_in = 1; } +message ListPeerGroupRequest { string peer_group_name = 1; } + +message ListPeerGroupResponse { PeerGroup peer_group = 1; } + message AddDynamicNeighborRequest { DynamicNeighbor dynamic_neighbor = 1; } message AddPathRequest { diff --git a/pkg/server/grpc_server.go b/pkg/server/grpc_server.go index 2d25734a..1ae58055 100644 --- a/pkg/server/grpc_server.go +++ b/pkg/server/grpc_server.go @@ -102,6 +102,18 @@ func (s *server) serve() error { return nil } +func (s *server) ListPeerGroup(r *api.ListPeerGroupRequest, stream api.GobgpApi_ListPeerGroupServer) error { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + fn := func(pg *api.PeerGroup) { + if err := stream.Send(&api.ListPeerGroupResponse{PeerGroup: pg}); err != nil { + cancel() + return + } + } + return s.bgpServer.ListPeerGroup(ctx, r, fn) +} + func parseHost(host string) (string, string) { const unixScheme = "unix://" if strings.HasPrefix(host, unixScheme) { diff --git a/pkg/server/server.go b/pkg/server/server.go index c5b2b0ff..25fd31cc 100644 --- a/pkg/server/server.go +++ b/pkg/server/server.go @@ -2715,6 +2715,31 @@ func (s *BgpServer) GetBgp(ctx context.Context, r *api.GetBgpRequest) (*api.GetB return rsp, nil } +func (s *BgpServer) ListPeerGroup(ctx context.Context, r *api.ListPeerGroupRequest, fn func(*api.PeerGroup)) error { + var l []*api.PeerGroup + s.mgmtOperation(func() error { + peerGroupName := r.PeerGroupName + l = make([]*api.PeerGroup, 0, len(s.peerGroupMap)) + for k, group := range s.peerGroupMap { + if peerGroupName != "" && peerGroupName != k { + continue + } + pg := config.NewPeerGroupFromConfigStruct(group.Conf) + l = append(l, pg) + } + return nil + }, false) + for _, pg := range l { + select { + case <-ctx.Done(): + return nil + default: + fn(pg) + } + } + return nil +} + func (s *BgpServer) ListPeer(ctx context.Context, r *api.ListPeerRequest, fn func(*api.Peer)) error { var l []*api.Peer s.mgmtOperation(func() error { |