summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorMarcus Wichelmann <mail@marcusw.de>2021-02-14 22:23:54 +0100
committerMarcus Wichelmann <mail@marcusw.de>2021-03-29 20:53:25 +0200
commitc1e7463e361632de60337cfd52dc44eb453d9746 (patch)
treed3df6e8ed8e99a9e75aca6093f0816c40a57e051
parent7ff15bfa54ac1b0ff7b03ee73e2bee4e7a3d3d73 (diff)
Added ListPeerGroup message to API
-rw-r--r--api/attribute.pb.go2
-rw-r--r--api/gobgp.proto5
-rw-r--r--pkg/server/grpc_server.go12
-rw-r--r--pkg/server/server.go25
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 {