diff options
author | FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp> | 2016-05-10 14:10:43 +0900 |
---|---|---|
committer | FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp> | 2016-05-10 14:10:43 +0900 |
commit | f9a9c410c3b221b515bad9fcf154990be7bb70fa (patch) | |
tree | 3c30aa3cf8c5394bd18c87721c7e47ea2b34e19f /server/rpki.go | |
parent | d7e1add28af9aec2ad61d2779651b17f5e6ab7ac (diff) |
Refactoring GRPC API
Let's follow the conventions of GRPC
- Stop using one method for multiple operations like add, delete,
etc. IOW, remove all the ModHoge APIs.
- Stop abusing Streaming RPC API.
Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
Diffstat (limited to 'server/rpki.go')
-rw-r--r-- | server/rpki.go | 87 |
1 files changed, 53 insertions, 34 deletions
diff --git a/server/rpki.go b/server/rpki.go index af2c4bb2..1463fd9b 100644 --- a/server/rpki.go +++ b/server/rpki.go @@ -77,9 +77,9 @@ func (r *ROA) Equal(roa *ROA) bool { return false } -func (r *ROA) toApiStruct() *api.ROA { +func (r *ROA) toApiStruct() *api.Roa { host, port, _ := net.SplitHostPort(r.Src) - return &api.ROA{ + return &api.Roa{ As: r.AS, Maxlen: uint32(r.MaxLen), Prefixlen: uint32(r.Prefix.Length), @@ -91,7 +91,7 @@ func (r *ROA) toApiStruct() *api.ROA { } } -type roas []*api.ROA +type roas []*api.Roa func (r roas) Len() int { return len(r) @@ -214,20 +214,45 @@ func (m *roaManager) deleteAllROA(network string) { } } -func (m *roaManager) operate(op api.Operation, address string) error { +func (m *roaManager) Enable(address string) error { for network, client := range m.clientMap { add, _, _ := net.SplitHostPort(network) if add == address { - switch op { - case api.Operation_ENABLE: - client.enable(client.serialNumber) - case api.Operation_DISABLE: - case api.Operation_RESET: - client.reset() - case api.Operation_SOFTRESET: - client.softReset() - m.deleteAllROA(network) - } + client.enable(client.serialNumber) + return nil + } + } + return fmt.Errorf("roa server not found %s", address) +} + +func (m *roaManager) Disable(address string) error { + for network, client := range m.clientMap { + add, _, _ := net.SplitHostPort(network) + if add == address { + client.reset() + return nil + } + } + return fmt.Errorf("roa server not found %s", address) +} + +func (m *roaManager) Reset(address string) error { + for network, client := range m.clientMap { + add, _, _ := net.SplitHostPort(network) + if add == address { + client.reset() + return nil + } + } + return fmt.Errorf("roa server not found %s", address) +} + +func (m *roaManager) SoftReset(address string) error { + for network, client := range m.clientMap { + add, _, _ := net.SplitHostPort(network) + if add == address { + client.softReset() + m.deleteAllROA(network) return nil } } @@ -412,11 +437,9 @@ func (c *roaManager) handleRTRMsg(client *roaClient, state *config.RpkiServerSta } } -func (c *roaManager) handleGRPC(grpcReq *GrpcRequest) { +func (c *roaManager) handleGRPC(grpcReq *GrpcRequest) *GrpcResponse { switch grpcReq.RequestType { - case REQ_RPKI: - results := make([]*GrpcResponse, 0) - + case REQ_GET_RPKI: f := func(tree *radix.Tree) (map[string]uint32, map[string]uint32) { records := make(map[string]uint32) prefixes := make(map[string]uint32) @@ -442,6 +465,7 @@ func (c *roaManager) handleGRPC(grpcReq *GrpcRequest) { recordsV4, prefixesV4 := f(c.Roas[bgp.RF_IPv4_UC]) recordsV6, prefixesV6 := f(c.Roas[bgp.RF_IPv6_UC]) + l := make([]*api.Rpki, 0, len(c.clientMap)) for _, client := range c.clientMap { state := client.state addr, port, _ := net.SplitHostPort(client.host) @@ -459,7 +483,7 @@ func (c *roaManager) handleGRPC(grpcReq *GrpcRequest) { return 0 } - rpki := &api.RPKI{ + rpki := &api.Rpki{ Conf: &api.RPKIConf{ Address: addr, RemotePort: port, @@ -484,20 +508,16 @@ func (c *roaManager) handleGRPC(grpcReq *GrpcRequest) { ResetQuery: sent.ResetQuery, }, } - result := &GrpcResponse{} - result.Data = rpki - results = append(results, result) + l = append(l, rpki) } - go sendMultipleResponses(grpcReq, results) - + return &GrpcResponse{Data: &api.GetRpkiResponse{Servers: l}} case REQ_ROA: if len(c.clientMap) == 0 { - result := &GrpcResponse{} - result.ResponseErr = fmt.Errorf("RPKI server isn't configured.") - grpcReq.ResponseCh <- result - break + return &GrpcResponse{ + ResponseErr: fmt.Errorf("RPKI server isn't configured."), + Data: &api.GetRoaResponse{}, + } } - results := make([]*GrpcResponse, 0) var rfList []bgp.RouteFamily switch grpcReq.RouteFamily { case bgp.RF_IPv4_UC: @@ -507,6 +527,7 @@ func (c *roaManager) handleGRPC(grpcReq *GrpcRequest) { default: rfList = []bgp.RouteFamily{bgp.RF_IPv4_UC, bgp.RF_IPv6_UC} } + l := make([]*api.Roa, 0) for _, rf := range rfList { if tree, ok := c.Roas[rf]; ok { tree.Walk(func(s string, v interface{}) bool { @@ -517,17 +538,15 @@ func (c *roaManager) handleGRPC(grpcReq *GrpcRequest) { } sort.Sort(roaList) for _, roa := range roaList { - result := &GrpcResponse{ - Data: roa, - } - results = append(results, result) + l = append(l, roa) } return false }) } } - go sendMultipleResponses(grpcReq, results) + return &GrpcResponse{Data: &api.GetRoaResponse{Roas: l}} } + return nil } func validatePath(ownAs uint32, tree *radix.Tree, cidr string, asPath *bgp.PathAttributeAsPath) config.RpkiValidationResultType { |