def _get_routes(target, protocol): xpath="/ietf-routing:routing/ribs" rib = target.get_data(xpath)["routing"]["ribs"]["rib"] for r in rib: if r["name"] != protocol: continue return r.get("routes", {}).get("route",{}) return {} def _exist_route(target, prefix, nexthop, version, source_protocol): routes = _get_routes(target, version) route_found = False for r in routes: if r["destination-prefix"] != prefix: continue if source_protocol and r.get("source-protocol") != source_protocol: return False route_found = True nh = r["next-hop"] next_hop_list = nh.get("next-hop-list") if nexthop: if next_hop_list: for nhl in next_hop_list["next-hop"]: address = nhl.get("address") if address == nexthop: return True else: if nh["next-hop-address"] == nexthop: return True return False return route_found def ipv4_route_exist(target, prefix, nexthop=None,source_protocol=None): return _exist_route(target, prefix, nexthop, "ipv4",source_protocol) def ipv6_route_exist(target, prefix, nexthop=None,source_protocol=None): return _exist_route(target, prefix, nexthop, "ipv6",source_protocol) def _get_ospf_status(target): xpath="/ietf-routing:routing/control-plane-protocols/control-plane-protocol/ietf-ospf:ospf" rib = target.get_data(xpath)["routing"]["control-plane-protocols"]["control-plane-protocol"] for p in rib: if p["type"] == "ietf-ospf:ospfv2": return p["ospf"] def _get_ospf_status_area(target, area_id): ospf=_get_ospf_status(target) for area in ospf.get("areas", {}).get("area", {}): if area["area-id"] == area_id: return area return {} def _get_ospf_status_area_interface(target, area_id, ifname): area=_get_ospf_status_area(target,area_id) for interface in area.get("interfaces", {}).get("interface", {}): if interface.get("name") == ifname: return interface return {} def ospf_get_neighbor(target, area_id, ifname, neighbour_id, full=True): ospf_interface=_get_ospf_status_area_interface(target,area_id, ifname) for neighbor in ospf_interface.get("neighbors", {}).get("neighbor", {}): if neighbor.get("neighbor-router-id") == neighbour_id: if full == False: return True if(neighbor.get("state") == "full"): return True return False def ospf_get_interface_type(target, area_id, ifname): ospf_interface=_get_ospf_status_area_interface(target,area_id,ifname) return ospf_interface.get("interface-type", None) def ospf_get_interface_passive(target, area_id, ifname): ospf_interface=_get_ospf_status_area_interface(target,area_id,ifname) return ospf_interface.get("passive", False) def ospf_is_area_nssa(target, area_id): area=_get_ospf_status_area(target, area_id) if area.get("area-type", "") == "ietf-ospf:nssa-area": return True return False