mirror of
https://github.com/osrg/gobgp.git
synced 2024-05-11 05:55:10 +00:00
client: support neighbor filtering
Signed-off-by: Wataru Ishida <[email protected]>
This commit is contained in:
+33
-1
@@ -97,7 +97,7 @@ func (cli *GoBGPClient) GetServer() (*config.Global, error) {
|
||||
}, nil
|
||||
}
|
||||
|
||||
func (cli *GoBGPClient) GetNeighbor() ([]*config.Neighbor, error) {
|
||||
func (cli *GoBGPClient) getNeighbor(name string, afi int, vrf string) ([]*config.Neighbor, error) {
|
||||
ret, err := cli.cli.GetNeighbor(context.Background(), &api.GetNeighborRequest{})
|
||||
if err != nil {
|
||||
return nil, err
|
||||
@@ -106,6 +106,18 @@ func (cli *GoBGPClient) GetNeighbor() ([]*config.Neighbor, error) {
|
||||
neighbors := make([]*config.Neighbor, 0, len(ret.Peers))
|
||||
|
||||
for _, p := range ret.Peers {
|
||||
if name != "" && name != p.Conf.NeighborAddress {
|
||||
continue
|
||||
}
|
||||
if vrf != "" && name != p.Conf.Vrf {
|
||||
continue
|
||||
}
|
||||
if afi > 0 {
|
||||
v6 := net.ParseIP(p.Conf.NeighborAddress).To4() == nil
|
||||
if afi == bgp.AFI_IP && v6 || afi == bgp.AFI_IP6 && !v6 {
|
||||
continue
|
||||
}
|
||||
}
|
||||
n, err := api.NewNeighborFromAPIStruct(p)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
@@ -115,6 +127,26 @@ func (cli *GoBGPClient) GetNeighbor() ([]*config.Neighbor, error) {
|
||||
return neighbors, nil
|
||||
}
|
||||
|
||||
func (cli *GoBGPClient) ListNeighbor() ([]*config.Neighbor, error) {
|
||||
return cli.getNeighbor("", 0, "")
|
||||
}
|
||||
|
||||
func (cli *GoBGPClient) ListNeighborByTransport(afi int) ([]*config.Neighbor, error) {
|
||||
return cli.getNeighbor("", afi, "")
|
||||
}
|
||||
|
||||
func (cli *GoBGPClient) ListNeighborByVRF(vrf string) ([]*config.Neighbor, error) {
|
||||
return cli.getNeighbor("", 0, vrf)
|
||||
}
|
||||
|
||||
func (cli *GoBGPClient) GetNeighbor(name string) (*config.Neighbor, error) {
|
||||
ns, err := cli.getNeighbor(name, 0, "")
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return ns[0], nil
|
||||
}
|
||||
|
||||
func (cli *GoBGPClient) AddNeighbor(c *config.Neighbor) error {
|
||||
peer := api.NewPeerFromConfigStruct(c)
|
||||
_, err := cli.cli.AddNeighbor(context.Background(), &api.AddNeighborRequest{peer})
|
||||
|
||||
+16
-33
@@ -30,44 +30,27 @@ import (
|
||||
)
|
||||
|
||||
func getNeighbors(vrf string) (neighbors, error) {
|
||||
ns, e := client.GetNeighbor()
|
||||
if e != nil {
|
||||
fmt.Println(e)
|
||||
return nil, e
|
||||
}
|
||||
var m neighbors
|
||||
for _, n := range ns {
|
||||
if neighborsOpts.Transport != "" {
|
||||
addr, _ := net.ResolveIPAddr("ip", n.Config.NeighborAddress)
|
||||
if addr.IP.To4() != nil {
|
||||
if neighborsOpts.Transport != "ipv4" {
|
||||
continue
|
||||
}
|
||||
} else {
|
||||
if neighborsOpts.Transport != "ipv6" {
|
||||
continue
|
||||
}
|
||||
}
|
||||
if vrf != "" {
|
||||
n, err := client.ListNeighborByVRF(vrf)
|
||||
return neighbors(n), err
|
||||
} else if t := neighborsOpts.Transport; t != "" {
|
||||
switch t {
|
||||
case "ipv4":
|
||||
n, err := client.ListNeighborByTransport(bgp.AFI_IP)
|
||||
return neighbors(n), err
|
||||
case "ipv6":
|
||||
n, err := client.ListNeighborByTransport(bgp.AFI_IP6)
|
||||
return neighbors(n), err
|
||||
default:
|
||||
return nil, fmt.Errorf("invalid transport: %s", t)
|
||||
}
|
||||
if vrf != "" && n.Config.Vrf != vrf {
|
||||
continue
|
||||
}
|
||||
m = append(m, n)
|
||||
}
|
||||
return m, nil
|
||||
n, err := client.ListNeighbor()
|
||||
return neighbors(n), err
|
||||
}
|
||||
|
||||
func getNeighbor(name string) (*config.Neighbor, error) {
|
||||
l, e := getNeighbors("")
|
||||
if e != nil {
|
||||
return nil, e
|
||||
}
|
||||
for _, p := range l {
|
||||
if p.Config.NeighborAddress == name || p.Config.NeighborAddress == name {
|
||||
return p, nil
|
||||
}
|
||||
}
|
||||
return nil, fmt.Errorf("Neighbor %v doesn't exist.", name)
|
||||
return client.GetNeighbor(name)
|
||||
}
|
||||
|
||||
func showNeighbors(vrf string) error {
|
||||
|
||||
Reference in New Issue
Block a user