client: support neighbor filtering

Signed-off-by: Wataru Ishida <[email protected]>
This commit is contained in:
Wataru Ishida
2016-11-14 02:15:48 +00:00
parent 1e22e529c9
commit ee8ce99e2d
2 changed files with 49 additions and 34 deletions
+33 -1
View File
@@ -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
View File
@@ -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 {