summaryrefslogtreecommitdiffhomepage
path: root/client/client.go
diff options
context:
space:
mode:
Diffstat (limited to 'client/client.go')
-rw-r--r--client/client.go849
1 files changed, 0 insertions, 849 deletions
diff --git a/client/client.go b/client/client.go
deleted file mode 100644
index d159ffed..00000000
--- a/client/client.go
+++ /dev/null
@@ -1,849 +0,0 @@
-// Copyright (C) 2016 Nippon Telegraph and Telephone Corporation.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-// implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// Package client provides a wrapper for GoBGP's gRPC API
-package client
-
-import (
- "fmt"
- "io"
- "net"
- "strconv"
- "time"
-
- "golang.org/x/net/context"
- "google.golang.org/grpc"
-
- api "github.com/osrg/gobgp/api"
- "github.com/osrg/gobgp/config"
- "github.com/osrg/gobgp/packet/bgp"
- "github.com/osrg/gobgp/server"
-)
-
-type Client struct {
- conn *grpc.ClientConn
- cli api.GobgpApiClient
-}
-
-func defaultGRPCOptions() []grpc.DialOption {
- return []grpc.DialOption{grpc.WithTimeout(time.Second), grpc.WithBlock(), grpc.WithInsecure()}
-}
-
-// New returns a new Client using the given target and options for dialing
-// to the grpc server. If an error occurs during dialing it will be returned and
-// Client will be nil.
-func New(target string, opts ...grpc.DialOption) (*Client, error) {
- return NewWith(context.Background(), target, opts...)
-}
-
-// NewWith is like New, but uses the given ctx to cancel or expire the current
-// attempt to connect if it becomes Done before the connection succeeds.
-func NewWith(ctx context.Context, target string, opts ...grpc.DialOption) (*Client, error) {
- if target == "" {
- target = ":50051"
- }
- if len(opts) == 0 {
- opts = defaultGRPCOptions()
- }
- conn, err := grpc.DialContext(ctx, target, opts...)
- if err != nil {
- return nil, err
- }
- cli := api.NewGobgpApiClient(conn)
- return &Client{conn: conn, cli: cli}, nil
-}
-
-// NewFrom returns a new Client, using the given conn and cli for the
-// underlying connection. The given grpc.ClientConn connection is expected to be
-// initialized and paired with the api client. See New to have the connection
-// dialed for you.
-func NewFrom(conn *grpc.ClientConn, cli api.GobgpApiClient) *Client {
- return &Client{conn: conn, cli: cli}
-}
-
-func (cli *Client) Close() error {
- return cli.conn.Close()
-}
-
-func (cli *Client) StartServer(c *config.Global) error {
- _, err := cli.cli.StartServer(context.Background(), &api.StartServerRequest{
- Global: &api.Global{
- As: c.Config.As,
- RouterId: c.Config.RouterId,
- ListenPort: c.Config.Port,
- ListenAddresses: c.Config.LocalAddressList,
- UseMultiplePaths: c.UseMultiplePaths.Config.Enabled,
- },
- })
- return err
-}
-
-func (cli *Client) StopServer() error {
- _, err := cli.cli.StopServer(context.Background(), &api.StopServerRequest{})
- return err
-}
-
-func (cli *Client) GetServer() (*config.Global, error) {
- ret, err := cli.cli.GetServer(context.Background(), &api.GetServerRequest{})
- if err != nil {
- return nil, err
- }
- return &config.Global{
- Config: config.GlobalConfig{
- As: ret.Global.As,
- RouterId: ret.Global.RouterId,
- Port: ret.Global.ListenPort,
- LocalAddressList: ret.Global.ListenAddresses,
- },
- UseMultiplePaths: config.UseMultiplePaths{
- Config: config.UseMultiplePathsConfig{
- Enabled: ret.Global.UseMultiplePaths,
- },
- },
- }, nil
-}
-
-func (cli *Client) EnableZebra(c *config.Zebra) error {
- req := &api.EnableZebraRequest{
- Url: c.Config.Url,
- Version: uint32(c.Config.Version),
- NexthopTriggerEnable: c.Config.NexthopTriggerEnable,
- NexthopTriggerDelay: uint32(c.Config.NexthopTriggerDelay),
- }
- for _, t := range c.Config.RedistributeRouteTypeList {
- req.RouteTypes = append(req.RouteTypes, string(t))
- }
- _, err := cli.cli.EnableZebra(context.Background(), req)
- return err
-}
-
-func (cli *Client) getNeighbor(name string, afi int, vrf string, enableAdvertised bool) ([]*config.Neighbor, error) {
- ret, err := cli.cli.GetNeighbor(context.Background(), &api.GetNeighborRequest{EnableAdvertised: enableAdvertised, Address: name})
- if err != nil {
- return nil, err
- }
-
- neighbors := make([]*config.Neighbor, 0, len(ret.Peers))
-
- for _, p := range ret.Peers {
- if name != "" && name != p.Info.NeighborAddress && name != p.Conf.NeighborInterface {
- continue
- }
- if vrf != "" && name != p.Conf.Vrf {
- continue
- }
- if afi > 0 {
- v6 := net.ParseIP(p.Info.NeighborAddress).To4() == nil
- if afi == bgp.AFI_IP && v6 || afi == bgp.AFI_IP6 && !v6 {
- continue
- }
- }
- n, err := server.NewNeighborFromAPIStruct(p)
- if err != nil {
- return nil, err
- }
- neighbors = append(neighbors, n)
- }
- return neighbors, nil
-}
-
-func (cli *Client) ListNeighbor() ([]*config.Neighbor, error) {
- return cli.getNeighbor("", 0, "", false)
-}
-
-func (cli *Client) ListNeighborByTransport(afi int) ([]*config.Neighbor, error) {
- return cli.getNeighbor("", afi, "", false)
-}
-
-func (cli *Client) ListNeighborByVRF(vrf string) ([]*config.Neighbor, error) {
- return cli.getNeighbor("", 0, vrf, false)
-}
-
-func (cli *Client) GetNeighbor(name string, options ...bool) (*config.Neighbor, error) {
- enableAdvertised := false
- if len(options) > 0 && options[0] {
- enableAdvertised = true
- }
- ns, err := cli.getNeighbor(name, 0, "", enableAdvertised)
- if err != nil {
- return nil, err
- }
- if len(ns) == 0 {
- return nil, fmt.Errorf("not found neighbor %s", name)
- }
- return ns[0], nil
-}
-
-func (cli *Client) AddNeighbor(c *config.Neighbor) error {
- peer := server.NewPeerFromConfigStruct(c)
- _, err := cli.cli.AddNeighbor(context.Background(), &api.AddNeighborRequest{Peer: peer})
- return err
-}
-
-func (cli *Client) DeleteNeighbor(c *config.Neighbor) error {
- peer := server.NewPeerFromConfigStruct(c)
- _, err := cli.cli.DeleteNeighbor(context.Background(), &api.DeleteNeighborRequest{Peer: peer})
- return err
-}
-
-func (cli *Client) UpdateNeighbor(c *config.Neighbor, doSoftResetIn bool) (bool, error) {
- peer := server.NewPeerFromConfigStruct(c)
- response, err := cli.cli.UpdateNeighbor(context.Background(), &api.UpdateNeighborRequest{Peer: peer, DoSoftResetIn: doSoftResetIn})
- return response.NeedsSoftResetIn, err
-}
-
-func (cli *Client) ShutdownNeighbor(addr, communication string) error {
- _, err := cli.cli.ShutdownNeighbor(context.Background(), &api.ShutdownNeighborRequest{Address: addr, Communication: communication})
- return err
-}
-
-func (cli *Client) ResetNeighbor(addr, communication string) error {
- _, err := cli.cli.ResetNeighbor(context.Background(), &api.ResetNeighborRequest{Address: addr, Communication: communication})
- return err
-}
-
-func (cli *Client) EnableNeighbor(addr string) error {
- _, err := cli.cli.EnableNeighbor(context.Background(), &api.EnableNeighborRequest{Address: addr})
- return err
-}
-
-func (cli *Client) DisableNeighbor(addr, communication string) error {
- _, err := cli.cli.DisableNeighbor(context.Background(), &api.DisableNeighborRequest{Address: addr, Communication: communication})
- return err
-}
-
-func (cli *Client) softreset(addr string, family bgp.RouteFamily, dir api.SoftResetNeighborRequest_SoftResetDirection) error {
- _, err := cli.cli.SoftResetNeighbor(context.Background(), &api.SoftResetNeighborRequest{
- Address: addr,
- Direction: dir,
- })
- return err
-}
-
-func (cli *Client) SoftResetIn(addr string, family bgp.RouteFamily) error {
- return cli.softreset(addr, family, api.SoftResetNeighborRequest_IN)
-}
-
-func (cli *Client) SoftResetOut(addr string, family bgp.RouteFamily) error {
- return cli.softreset(addr, family, api.SoftResetNeighborRequest_OUT)
-}
-
-func (cli *Client) SoftReset(addr string, family bgp.RouteFamily) error {
- return cli.softreset(addr, family, api.SoftResetNeighborRequest_BOTH)
-}
-
-func (cli *Client) getRIB(resource api.Resource, name string, family bgp.RouteFamily, prefixes []*api.TableLookupPrefix) (*api.Table, error) {
- stream, err := cli.cli.GetPath(context.Background(), &api.GetPathRequest{
- Type: resource,
- Family: uint32(family),
- Name: name,
- Prefixes: prefixes,
- })
- if err != nil {
- return nil, err
- }
- pathMap := make(map[string][]*api.Path)
- for {
- p, err := stream.Recv()
- if err != nil {
- if err == io.EOF {
- break
- }
- return nil, err
- }
- nlri, err := p.GetNativeNlri()
- if err != nil {
- return nil, err
- }
- nlriStr := nlri.String()
- pathMap[nlriStr] = append(pathMap[nlriStr], p)
- }
- dstList := make([]*api.Destination, 0, len(pathMap))
- for _, pathList := range pathMap {
- nlri, _ := pathList[0].GetNativeNlri()
- dstList = append(dstList, &api.Destination{
- Prefix: nlri.String(),
- Paths: pathList,
- })
- }
- return &api.Table{
- Family: uint32(family),
- Destinations: dstList,
- }, nil
-}
-
-func (cli *Client) GetRIB(family bgp.RouteFamily, prefixes []*api.TableLookupPrefix) (*api.Table, error) {
- return cli.getRIB(api.Resource_GLOBAL, "", family, prefixes)
-}
-
-func (cli *Client) GetLocalRIB(name string, family bgp.RouteFamily, prefixes []*api.TableLookupPrefix) (*api.Table, error) {
- return cli.getRIB(api.Resource_LOCAL, name, family, prefixes)
-}
-
-func (cli *Client) GetAdjRIBIn(name string, family bgp.RouteFamily, prefixes []*api.TableLookupPrefix) (*api.Table, error) {
- return cli.getRIB(api.Resource_ADJ_IN, name, family, prefixes)
-}
-
-func (cli *Client) GetAdjRIBOut(name string, family bgp.RouteFamily, prefixes []*api.TableLookupPrefix) (*api.Table, error) {
- return cli.getRIB(api.Resource_ADJ_OUT, name, family, prefixes)
-}
-
-func (cli *Client) GetVRFRIB(name string, family bgp.RouteFamily, prefixes []*api.TableLookupPrefix) (*api.Table, error) {
- return cli.getRIB(api.Resource_VRF, name, family, prefixes)
-}
-
-func (cli *Client) getRIBInfo(resource api.Resource, name string, family bgp.RouteFamily) (*api.TableInfo, error) {
- r, err := cli.cli.GetRibInfo(context.Background(), &api.GetRibInfoRequest{
- Info: &api.TableInfo{
- Type: resource,
- Name: name,
- Family: uint32(family),
- },
- })
- if err != nil {
- return nil, err
- } else {
- return r.Info, nil
- }
-}
-
-func (cli *Client) GetRIBInfo(family bgp.RouteFamily) (*api.TableInfo, error) {
- return cli.getRIBInfo(api.Resource_GLOBAL, "", family)
-}
-
-func (cli *Client) GetLocalRIBInfo(name string, family bgp.RouteFamily) (*api.TableInfo, error) {
- return cli.getRIBInfo(api.Resource_LOCAL, name, family)
-}
-
-func (cli *Client) GetAdjRIBInInfo(name string, family bgp.RouteFamily) (*api.TableInfo, error) {
- return cli.getRIBInfo(api.Resource_ADJ_IN, name, family)
-}
-
-func (cli *Client) GetAdjRIBOutInfo(name string, family bgp.RouteFamily) (*api.TableInfo, error) {
- return cli.getRIBInfo(api.Resource_ADJ_OUT, name, family)
-}
-
-type AddPathByStreamClient struct {
- stream api.GobgpApi_InjectMrtClient
-}
-
-func (c *AddPathByStreamClient) Send(paths ...*api.Path) error {
- return c.stream.Send(&api.InjectMrtRequest{
- Resource: api.Resource_GLOBAL,
- Paths: paths,
- })
-}
-
-func (c *AddPathByStreamClient) Close() error {
- _, err := c.stream.CloseAndRecv()
- return err
-}
-
-func (cli *Client) AddPathByStream() (*AddPathByStreamClient, error) {
- stream, err := cli.cli.InjectMrt(context.Background())
- if err != nil {
- return nil, err
- }
- return &AddPathByStreamClient{stream}, nil
-}
-
-func (cli *Client) addPath(vrfID string, pathList []*api.Path) ([]byte, error) {
- resource := api.Resource_GLOBAL
- if vrfID != "" {
- resource = api.Resource_VRF
- }
- var uuid []byte
- for _, path := range pathList {
- r, err := cli.cli.AddPath(context.Background(), &api.AddPathRequest{
- Resource: resource,
- VrfId: vrfID,
- Path: path,
- })
- if err != nil {
- return nil, err
- }
- uuid = r.Uuid
- }
- return uuid, nil
-}
-
-func (cli *Client) AddPath(pathList []*api.Path) ([]byte, error) {
- return cli.addPath("", pathList)
-}
-
-func (cli *Client) AddVRFPath(vrfID string, pathList []*api.Path) ([]byte, error) {
- if vrfID == "" {
- return nil, fmt.Errorf("VRF ID is empty")
- }
- return cli.addPath(vrfID, pathList)
-}
-
-func (cli *Client) deletePath(uuid []byte, f bgp.RouteFamily, vrfID string, pathList []*api.Path) error {
- var reqs []*api.DeletePathRequest
-
- resource := api.Resource_GLOBAL
- if vrfID != "" {
- resource = api.Resource_VRF
- }
- switch {
- case len(pathList) != 0:
- for _, path := range pathList {
- reqs = append(reqs, &api.DeletePathRequest{
- Resource: resource,
- VrfId: vrfID,
- Path: path,
- })
- }
- default:
- reqs = append(reqs, &api.DeletePathRequest{
- Resource: resource,
- VrfId: vrfID,
- Uuid: uuid,
- Family: uint32(f),
- })
- }
-
- for _, req := range reqs {
- if _, err := cli.cli.DeletePath(context.Background(), req); err != nil {
- return err
- }
- }
- return nil
-}
-
-func (cli *Client) DeletePath(pathList []*api.Path) error {
- return cli.deletePath(nil, bgp.RouteFamily(0), "", pathList)
-}
-
-func (cli *Client) DeleteVRFPath(vrfID string, pathList []*api.Path) error {
- if vrfID == "" {
- return fmt.Errorf("VRF ID is empty")
- }
- return cli.deletePath(nil, bgp.RouteFamily(0), vrfID, pathList)
-}
-
-func (cli *Client) DeletePathByUUID(uuid []byte) error {
- return cli.deletePath(uuid, bgp.RouteFamily(0), "", nil)
-}
-
-func (cli *Client) DeletePathByFamily(family bgp.RouteFamily) error {
- return cli.deletePath(nil, family, "", nil)
-}
-
-func (cli *Client) GetVRF() ([]*api.Vrf, error) {
- ret, err := cli.cli.GetVrf(context.Background(), &api.GetVrfRequest{})
- if err != nil {
- return nil, err
- }
- return ret.Vrfs, nil
-}
-
-func (cli *Client) AddVRF(name string, id int, rd bgp.RouteDistinguisherInterface, im, ex []bgp.ExtendedCommunityInterface) error {
- arg := &api.AddVrfRequest{
- Vrf: &api.Vrf{
- Name: name,
- Rd: api.MarshalRD(rd),
- Id: uint32(id),
- ImportRt: api.MarshalRTs(im),
- ExportRt: api.MarshalRTs(ex),
- },
- }
- _, err := cli.cli.AddVrf(context.Background(), arg)
- return err
-}
-
-func (cli *Client) DeleteVRF(name string) error {
- arg := &api.DeleteVrfRequest{
- Vrf: &api.Vrf{
- Name: name,
- },
- }
- _, err := cli.cli.DeleteVrf(context.Background(), arg)
- return err
-}
-
-func (cli *Client) getDefinedSet(typ api.DefinedType, name string) ([]*api.DefinedSet, error) {
- ret, err := cli.cli.GetDefinedSet(context.Background(), &api.GetDefinedSetRequest{
- Type: api.DefinedType(typ),
- Name: name,
- })
- if err != nil {
- return nil, err
- }
- return ret.Sets, nil
-}
-
-func (cli *Client) GetDefinedSet(typ api.DefinedType) ([]*api.DefinedSet, error) {
- return cli.getDefinedSet(typ, "")
-}
-
-func (cli *Client) GetDefinedSetByName(typ api.DefinedType, name string) (*api.DefinedSet, error) {
- sets, err := cli.getDefinedSet(typ, name)
- if err != nil {
- return nil, err
- }
- if len(sets) == 0 {
- return nil, fmt.Errorf("not found defined set: %s", name)
- } else if len(sets) > 1 {
- return nil, fmt.Errorf("invalid response for GetDefinedSetByName")
- }
- return sets[0], nil
-}
-
-func (cli *Client) AddDefinedSet(d *api.DefinedSet) error {
- _, err := cli.cli.AddDefinedSet(context.Background(), &api.AddDefinedSetRequest{
- Set: d,
- })
- return err
-}
-
-func (cli *Client) DeleteDefinedSet(d *api.DefinedSet, all bool) error {
- _, err := cli.cli.DeleteDefinedSet(context.Background(), &api.DeleteDefinedSetRequest{
- Set: d,
- All: all,
- })
- return err
-}
-
-func (cli *Client) ReplaceDefinedSet(d *api.DefinedSet) error {
- _, err := cli.cli.ReplaceDefinedSet(context.Background(), &api.ReplaceDefinedSetRequest{
- Set: d,
- })
- return err
-}
-
-func (cli *Client) GetStatement() ([]*api.Statement, error) {
- ret, err := cli.cli.GetStatement(context.Background(), &api.GetStatementRequest{})
- if err != nil {
- return nil, err
- }
- return ret.Statements, nil
-}
-
-func (cli *Client) AddStatement(t *api.Statement) error {
- _, err := cli.cli.AddStatement(context.Background(), &api.AddStatementRequest{
- Statement: t,
- })
- return err
-}
-
-func (cli *Client) DeleteStatement(t *api.Statement, all bool) error {
- _, err := cli.cli.DeleteStatement(context.Background(), &api.DeleteStatementRequest{
- Statement: t,
- All: all,
- })
- return err
-}
-
-func (cli *Client) ReplaceStatement(t *api.Statement) error {
- _, err := cli.cli.ReplaceStatement(context.Background(), &api.ReplaceStatementRequest{
- Statement: t,
- })
- return err
-}
-
-func (cli *Client) GetPolicy() ([]*api.Policy, error) {
- ret, err := cli.cli.GetPolicy(context.Background(), &api.GetPolicyRequest{})
- if err != nil {
- return nil, err
- }
- return ret.Policies, nil
-}
-
-func (cli *Client) AddPolicy(a *api.Policy, refer bool) error {
- _, err := cli.cli.AddPolicy(context.Background(), &api.AddPolicyRequest{
- Policy: a,
- ReferExistingStatements: refer,
- })
- return err
-}
-
-func (cli *Client) DeletePolicy(a *api.Policy, all, preserve bool) error {
- _, err := cli.cli.DeletePolicy(context.Background(), &api.DeletePolicyRequest{
- Policy: a,
- All: all,
- PreserveStatements: preserve,
- })
- return err
-}
-
-func (cli *Client) ReplacePolicy(a *api.Policy, refer, preserve bool) error {
- _, err := cli.cli.ReplacePolicy(context.Background(), &api.ReplacePolicyRequest{
- Policy: a,
- ReferExistingStatements: refer,
- PreserveStatements: preserve,
- })
- return err
-}
-
-func (cli *Client) getPolicyAssignment(name string, typ api.PolicyType) (*api.PolicyAssignment, error) {
- resource := api.Resource_GLOBAL
- if name != "" {
- resource = api.Resource_LOCAL
- }
-
- ret, err := cli.cli.GetPolicyAssignment(context.Background(), &api.GetPolicyAssignmentRequest{
- Assignment: &api.PolicyAssignment{
- Name: name,
- Resource: resource,
- Type: typ,
- },
- })
- if err != nil {
- return nil, err
- }
-
- return &api.PolicyAssignment{
- Name: name,
- Type: typ,
- Policies: ret.Assignment.Policies,
- Default: ret.Assignment.Default,
- }, nil
-}
-
-func (cli *Client) GetImportPolicy() (*api.PolicyAssignment, error) {
- return cli.getPolicyAssignment("", api.PolicyType_IMPORT)
-}
-
-func (cli *Client) GetExportPolicy() (*api.PolicyAssignment, error) {
- return cli.getPolicyAssignment("", api.PolicyType_EXPORT)
-}
-
-func (cli *Client) GetRouteServerImportPolicy(name string) (*api.PolicyAssignment, error) {
- return cli.getPolicyAssignment(name, api.PolicyType_IMPORT)
-}
-
-func (cli *Client) GetRouteServerExportPolicy(name string) (*api.PolicyAssignment, error) {
- return cli.getPolicyAssignment(name, api.PolicyType_EXPORT)
-}
-
-func (cli *Client) AddPolicyAssignment(assignment *api.PolicyAssignment) error {
- _, err := cli.cli.AddPolicyAssignment(context.Background(), &api.AddPolicyAssignmentRequest{
- Assignment: assignment,
- })
- return err
-}
-
-func (cli *Client) DeletePolicyAssignment(assignment *api.PolicyAssignment, all bool) error {
- _, err := cli.cli.DeletePolicyAssignment(context.Background(), &api.DeletePolicyAssignmentRequest{
- Assignment: assignment,
- All: all})
- return err
-}
-
-func (cli *Client) ReplacePolicyAssignment(assignment *api.PolicyAssignment) error {
- _, err := cli.cli.ReplacePolicyAssignment(context.Background(), &api.ReplacePolicyAssignmentRequest{
- Assignment: assignment,
- })
- return err
-}
-
-//func (cli *Client) EnableMrt(c *config.MrtConfig) error {
-//}
-//
-//func (cli *Client) DisableMrt(c *config.MrtConfig) error {
-//}
-//
-
-func (cli *Client) GetRPKI() ([]*config.RpkiServer, error) {
- rsp, err := cli.cli.GetRpki(context.Background(), &api.GetRpkiRequest{})
- if err != nil {
- return nil, err
- }
- servers := make([]*config.RpkiServer, 0, len(rsp.Servers))
- for _, s := range rsp.Servers {
- // Note: RpkiServerConfig.Port is uint32 type, but the TCP/UDP port is
- // 16-bit length.
- port, err := strconv.ParseUint(s.Conf.RemotePort, 10, 16)
- if err != nil {
- return nil, err
- }
- server := &config.RpkiServer{
- Config: config.RpkiServerConfig{
- Address: s.Conf.Address,
- Port: uint32(port),
- },
- State: config.RpkiServerState{
- Up: s.State.Up,
- SerialNumber: s.State.Serial,
- RecordsV4: s.State.RecordIpv4,
- RecordsV6: s.State.RecordIpv6,
- PrefixesV4: s.State.PrefixIpv4,
- PrefixesV6: s.State.PrefixIpv6,
- Uptime: s.State.Uptime,
- Downtime: s.State.Downtime,
- RpkiMessages: config.RpkiMessages{
- RpkiReceived: config.RpkiReceived{
- SerialNotify: s.State.SerialNotify,
- CacheReset: s.State.CacheReset,
- CacheResponse: s.State.CacheResponse,
- Ipv4Prefix: s.State.ReceivedIpv4,
- Ipv6Prefix: s.State.ReceivedIpv6,
- EndOfData: s.State.EndOfData,
- Error: s.State.Error,
- },
- RpkiSent: config.RpkiSent{
- SerialQuery: s.State.SerialQuery,
- ResetQuery: s.State.ResetQuery,
- },
- },
- },
- }
- servers = append(servers, server)
- }
- return servers, nil
-}
-
-func (cli *Client) GetROA(family bgp.RouteFamily) ([]*api.Roa, error) {
- rsp, err := cli.cli.GetRoa(context.Background(), &api.GetRoaRequest{
- Family: uint32(family),
- })
- if err != nil {
- return nil, err
- }
- return rsp.Roas, nil
-}
-
-func (cli *Client) AddRPKIServer(address string, port, lifetime int) error {
- _, err := cli.cli.AddRpki(context.Background(), &api.AddRpkiRequest{
- Address: address,
- Port: uint32(port),
- Lifetime: int64(lifetime),
- })
- return err
-}
-
-func (cli *Client) DeleteRPKIServer(address string) error {
- _, err := cli.cli.DeleteRpki(context.Background(), &api.DeleteRpkiRequest{
- Address: address,
- })
- return err
-}
-
-func (cli *Client) EnableRPKIServer(address string) error {
- _, err := cli.cli.EnableRpki(context.Background(), &api.EnableRpkiRequest{
- Address: address,
- })
- return err
-}
-
-func (cli *Client) DisableRPKIServer(address string) error {
- _, err := cli.cli.DisableRpki(context.Background(), &api.DisableRpkiRequest{
- Address: address,
- })
- return err
-}
-
-func (cli *Client) ResetRPKIServer(address string) error {
- _, err := cli.cli.ResetRpki(context.Background(), &api.ResetRpkiRequest{
- Address: address,
- })
- return err
-}
-
-func (cli *Client) SoftResetRPKIServer(address string) error {
- _, err := cli.cli.SoftResetRpki(context.Background(), &api.SoftResetRpkiRequest{
- Address: address,
- })
- return err
-}
-
-func (cli *Client) ValidateRIBWithRPKI(prefixes ...string) error {
- req := &api.ValidateRibRequest{}
- if len(prefixes) > 1 {
- return fmt.Errorf("too many prefixes: %d", len(prefixes))
- } else if len(prefixes) == 1 {
- req.Prefix = prefixes[0]
- }
- _, err := cli.cli.ValidateRib(context.Background(), req)
- return err
-}
-
-func (cli *Client) AddBMP(c *config.BmpServerConfig) error {
- _, err := cli.cli.AddBmp(context.Background(), &api.AddBmpRequest{
- Address: c.Address,
- Port: c.Port,
- Type: api.AddBmpRequest_MonitoringPolicy(c.RouteMonitoringPolicy.ToInt()),
- })
- return err
-}
-
-func (cli *Client) DeleteBMP(c *config.BmpServerConfig) error {
- _, err := cli.cli.DeleteBmp(context.Background(), &api.DeleteBmpRequest{
- Address: c.Address,
- Port: c.Port,
- })
- return err
-}
-
-type MonitorRIBClient struct {
- stream api.GobgpApi_MonitorRibClient
-}
-
-func (c *MonitorRIBClient) Recv() (*api.Destination, error) {
- return c.stream.Recv()
-}
-
-func (cli *Client) MonitorRIB(family bgp.RouteFamily, current bool) (*MonitorRIBClient, error) {
- stream, err := cli.cli.MonitorRib(context.Background(), &api.MonitorRibRequest{
- Table: &api.Table{
- Type: api.Resource_GLOBAL,
- Family: uint32(family),
- },
- Current: current,
- })
- if err != nil {
- return nil, err
- }
- return &MonitorRIBClient{stream}, nil
-}
-
-func (cli *Client) MonitorAdjRIBIn(name string, family bgp.RouteFamily, current bool) (*MonitorRIBClient, error) {
- stream, err := cli.cli.MonitorRib(context.Background(), &api.MonitorRibRequest{
- Table: &api.Table{
- Type: api.Resource_ADJ_IN,
- Name: name,
- Family: uint32(family),
- },
- Current: current,
- })
- if err != nil {
- return nil, err
- }
- return &MonitorRIBClient{stream}, nil
-}
-
-type MonitorNeighborStateClient struct {
- stream api.GobgpApi_MonitorPeerStateClient
-}
-
-func (c *MonitorNeighborStateClient) Recv() (*config.Neighbor, error) {
- p, err := c.stream.Recv()
- if err != nil {
- return nil, err
- }
- return server.NewNeighborFromAPIStruct(p)
-}
-
-func (cli *Client) MonitorNeighborState(name string, current bool) (*MonitorNeighborStateClient, error) {
- stream, err := cli.cli.MonitorPeerState(context.Background(), &api.Arguments{
- Name: name,
- Current: current,
- })
- if err != nil {
- return nil, err
- }
- return &MonitorNeighborStateClient{stream}, nil
-}