diff options
-rwxr-xr-x | cli/gobgpcli | 26 | ||||
-rw-r--r-- | table/destination.go | 28 | ||||
-rw-r--r-- | table/path.go | 8 |
3 files changed, 32 insertions, 30 deletions
diff --git a/cli/gobgpcli b/cli/gobgpcli index c2bac48f..77cd4849 100755 --- a/cli/gobgpcli +++ b/cli/gobgpcli @@ -236,33 +236,35 @@ class Show(object): print r.json() return 0 - print(" Network Next Hop AS_PATH Attrs") - if self.args[2] =="local-rib": + f = "{:2s} {:18s} {:15s} {:10s} {:s}" + print(f.format("", "Network", "Next Hop", "AS_PATH", "Attrs")) + if self.args[2] == "local-rib": for d in r.json()["Destinations"]: - self.show_routes(d["Paths"]) + d["Paths"][d["BestPathIdx"]]["Best"] = True + self.show_routes(f, d["Paths"], True) elif self.args[2] == "adj-rib-in" or self.args[2] == "adj-rib-out": rfs = ["RF_IPv4_UC", "RF_IPv6_UC"] for rf in rfs: paths = r.json()[rf] - self.show_routes(paths) - + self.show_routes(f, paths) return 0 - def show_routes(self, paths): + def show_routes(self, f, paths, showBest=False): for p in paths: nexthop = "" AS = "" for a in p["Attrs"]: if a["Type"] == "BGP_ATTR_TYPE_AS_PATH": AS = a["AsPath"] - if p["Best"] == "true": - header = "*>" + if showBest: + if "Best" in p: + header = "*>" + else: + header = "*" else: - header = "*" - print("{:s} {:s} {:s} {:s} {:s}".format(header, p["Network"], - p["Nexthop"], AS, self._format_attrs(p["Attrs"]))) - + header = "" + print(f.format(header, p["Network"], p["Nexthop"], AS, self._format_attrs(p["Attrs"]))) def main(): diff --git a/table/destination.go b/table/destination.go index e602deb0..865ab03e 100644 --- a/table/destination.go +++ b/table/destination.go @@ -96,19 +96,27 @@ func NewDestinationDefault(nlri bgp.AddrPrefixInterface) *DestinationDefault { func (dd *DestinationDefault) MarshalJSON() ([]byte, error) { prefix := dd.getNlri().(*bgp.NLRInfo).Prefix - for _, p := range dd.knownPathList { - if p == dd.getBestPath() { - p.setBest(true) - } else { - p.setBest(false) + + idx := func() int { + for i, p := range dd.knownPathList { + if p == dd.getBestPath() { + return i + } } - } + log.WithFields(log.Fields{ + "Topic": "Table", + "Key": prefix.String(), + }).Panic("no best path") + return 0 + }() return json.Marshal(struct { - Prefix string - Paths []Path + Prefix string + Paths []Path + BestPathIdx int }{ - Prefix: prefix.String(), - Paths: dd.knownPathList, + Prefix: prefix.String(), + Paths: dd.knownPathList, + BestPathIdx: idx, }) } diff --git a/table/path.go b/table/path.go index 276555ee..027630cb 100644 --- a/table/path.go +++ b/table/path.go @@ -40,7 +40,6 @@ type Path interface { setMedSetByTargetNeighbor(medSetByTargetNeighbor bool) getMedSetByTargetNeighbor() bool clone(IsWithdraw bool) Path - setBest(isBest bool) MarshalJSON() ([]byte, error) } @@ -52,7 +51,6 @@ type PathDefault struct { nlri bgp.AddrPrefixInterface pathAttrs []bgp.PathAttributeInterface medSetByTargetNeighbor bool - isBest bool } func NewPathDefault(rf bgp.RouteFamily, source *PeerInfo, nlri bgp.AddrPrefixInterface, nexthop net.IP, isWithdraw bool, pattrs []bgp.PathAttributeInterface, medSetByTargetNeighbor bool) *PathDefault { @@ -73,21 +71,15 @@ func NewPathDefault(rf bgp.RouteFamily, source *PeerInfo, nlri bgp.AddrPrefixInt return path } -func (pd *PathDefault) setBest(isBest bool) { - pd.isBest = isBest -} - func (pd *PathDefault) MarshalJSON() ([]byte, error) { return json.Marshal(struct { Network string Nexthop string Attrs []bgp.PathAttributeInterface - Best string }{ Network: pd.getPrefix(), Nexthop: pd.nexthop.String(), Attrs: pd.getPathAttrs(), - Best: fmt.Sprint(pd.isBest), }) } |