Hi ,
Manually we able to get show bgp summary output using CLI .
Unable to get the same show bgp summary output using YDK
script details:
from ydk.services import CRUDService,CodecService
from ydk.providers import NetconfServiceProvider,CodecServiceProvider
from ydk.models.cisco_ios_xr import Cisco_IOS_XR_shellutil_oper \
as xr_shellutil_oper
from ydk.models.cisco_ios_xr import Cisco_IOS_XR_ipv4_bgp_oper
from ydk.models.cisco_ios_xr import Cisco_IOS_XR_ipv4_bgp_datatypes
from datetime import timedelta
provider = NetconfServiceProvider(address="192.168.10.10",
username="username1",
password="password1",
protocol="ssh")
crud = CRUDService()
instance = Cisco_IOS_XR_ipv4_bgp_oper.Bgp.Instances.Instance()
instance.instance_name = 'default'
vrf = Cisco_IOS_XR_ipv4_bgp_oper.Bgp.Instances.Instance.InstanceActive.Vrfs.Vrf()
vrf.vrf_name = 'default'
neighbor =Cisco_IOS_XR_ipv4_bgp_oper.Bgp.Instances.Instance.InstanceStandby.Vrfs.Vrf.Neighbors.Neighbor()
vrf.neighbors.neighbor.append(neighbor)
instance.instance_active.vrfs.vrf.append(vrf)
bgp.instances.instance.append(instance)
bgp_networks = crud.read(provider, neighbor,only_config=False)
print dir(bgp_networks)
print int(bgp_networks.neighbor_address)
print str(bgp_networks.connection_established_time)
print int(bgp_networks.connection_established_time)
provider.close()
Error output
-----------------
fabric@FabricAutomation:~/jay$ python bgp_neighbor1.py
['__class__', '__delattr__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']
Traceback (most recent call last):
File "bgp_neighbor1.py", line 42, in <module>
print int(bgp_networks.neighbor_address)
AttributeError: 'NoneType' object has no attribute 'neighbor_address'
fabric@FabricAutomation:~/jay$
kindly let us know solution to findout the output for show bgp summary using YDK.
Thanks
Jay
Jay,
Remember that the XR Oper data model for BGP and VRF content model the default VRF in a separate subtree. Here is a simple example that:
Queries for the default BGP instance
Iterates over the result:
For each instance (just the one called ‘default’):
Get a reference to the default VRF
Iterate over all neighbors, and for each neighbor:
Print the neighbor address
Print the remote AS
In my config, all I have is:
RP/0/RP0/CPU0:ios#show run router bgp
Tue Apr 18 07:31:26.138 UTC
router bgp 666
address-family ipv4 unicast
network 192.168.0.0/16
!
neighbor 192.168.1.1
remote-as 1
!
!
Hopefully the code below will be enough to get you started:
from ydk.services import CRUDService,CodecService
from ydk.providers import NetconfServiceProvider,CodecServiceProvider
from ydk.models.cisco_ios_xr import Cisco_IOS_XR_shellutil_oper as xr_shellutil_oper
from ydk.models.cisco_ios_xr import Cisco_IOS_XR_ipv4_bgp_oper
from ydk.models.cisco_ios_xr import Cisco_IOS_XR_ipv4_bgp_datatypes
from datetime import timedelta
from ydk.types import READ
provider = NetconfServiceProvider(address="127.0.0.1",
port=8300,
username="cisco",
password="cisco",
protocol="ssh")
crud = CRUDService()
q_instance = Cisco_IOS_XR_ipv4_bgp_oper.Bgp.Instances.Instance()
q_instance.instance_name = 'default'
q_instances = Cisco_IOS_XR_ipv4_bgp_oper.Bgp.Instances()
q_instances.instance.append(q_instance)
instances = crud.read(provider, q_instances)
for inst in instances.instance:
print('Instance: %s' % inst.instance_name)
default_vrf = inst.instance_active.default_vrf
for n in default_vrf.neighbors.neighbor:
print(' neighbor %s' % n.neighbor_address)
print(' remote-as: %s' % n.remote_as)
provider.close()
Cheers,
Einar
HI ,
I copied your script and executed in my setup .
got the below output :
fabric@FabricAutomation:~/jay$ sudo python bgp_neigh.py
Instance: default
[]
fabric@FabricAutomation:~/jay$
Getting empty list
However we got output using nccclient .
<data>
<bgp xmlns="http://cisco.com/ns/yang/Cisco-IOS-XR-ipv4-bgp-oper">
<instances>
<instance>
<instance-name>default</instance-name>
<instance-active>
<default-vrf>
<neighbors>
<neighbor>
<neighbor-address>10.10.10.1</neighbor-address>
</neighbor>
<neighbor>
<neighbor-address>10.10.10.2</neighbor-address>
</neighbor>
</neighbors>
</default-vrf>
</instance-active>
</instance>
</instances>
</bgp>
</data>
</rpc-reply>
kindly do the needful for resolution
Jay,
I'm sorry, but there is not much more I can suggest at this point. The code as I suggested above works find on my test instance of xrv9k. You can try enabling debugs. For example:
import logging
LOGGING_TO_ENABLE = [
'ncclient.transport.session',
'ncclient.operations.rpc',
'ydk.providers',
]
handler = logging.StreamHandler()
for l in LOGGING_TO_ENABLE:
logger = logging.getLogger(l)
logger.addHandler(handler)
logger.setLevel(logging.DEBUG)
This will enable ncclient debugs and some YDK debug and may let you see what problems there may be.
Cheers,
Einar
Here's a streamlined version assuming that you only care about default instance and global routing space. Script output:
$ ./nc-read-xr-ipv4-bgp-oper-99-ydk.py ssh://xx:xx@host
Neighbor: 172.16.255.2
Established time: 224
$
Script:
#!/usr/bin/env python2
#
# Copyright 2016 Cisco Systems, Inc.
#
# 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.
#
"""
Read default VRF for model Cisco-IOS-XR-ipv4-bgp-oper.
usage: nc-read-xr-ipv4-bgp-oper-99-ydk.py [-h] [-v] device
positional arguments:
device NETCONF device (ssh://user:password@host:port)
optional arguments:
-h, --help show this help message and exit
-v, --verbose print debugging messages
"""
from argparse import ArgumentParser
from urlparse import urlparse
from ydk.services import CRUDService
from ydk.providers import NetconfServiceProvider
from ydk.models.cisco_ios_xr import Cisco_IOS_XR_ipv4_bgp_oper
import logging
if __name__ == "__main__":
"""Execute main program."""
parser = ArgumentParser()
parser.add_argument("-v", "--verbose", help="print debugging messages",
action="store_true")
parser.add_argument("device",
help="NETCONF device (ssh://user:password@host:port)")
args = parser.parse_args()
device = urlparse(args.device)
# log debug messages if verbose argument specified
if args.verbose:
logger = logging.getLogger("ydk")
logger.setLevel(logging.DEBUG)
handler = logging.StreamHandler()
formatter = logging.Formatter(("%(asctime)s - %(name)s - "
"%(levelname)s - %(message)s"))
handler.setFormatter(formatter)
logger.addHandler(handler)
# create NETCONF provider
provider = NetconfServiceProvider(address=device.hostname,
port=device.port,
username=device.username,
password=device.password,
protocol=device.scheme)
# create CRUD service
crud = CRUDService()
instance = Cisco_IOS_XR_ipv4_bgp_oper.Bgp.Instances.Instance() # create object
instance.instance_name = 'default'
default_vrf = crud.read(provider, instance.instance_active.default_vrf)
for neighbor in default_vrf.neighbors.neighbor:
print "Neighbor: {}".format(neighbor.neighbor_address)
print "Established time: {}".format(neighbor.connection_established_time)
provider.close()
exit()
# End of script