cancel
Showing results for 
Search instead for 
Did you mean: 
cancel
231
Views
10
Helpful
4
Replies
Beginner

YDK ISIS Segment Routing SRGB

Hi All,

 

I'm trying to configure the SRGB value in ISIS to set the lower and upper bounds of the global label pool for segment routing using YDK and Cisco-IOS-XR-clns-isis-cfg. 

 

module: Cisco-IOS-XR-clns-isis-cfg
+--rw isis
+--rw instances
+--rw instance* [instance-name]
+--rw srgb!
| +--rw lower-bound uint32
| +--rw upper-bound uint32

 

To achieve this config:

router isis 1
segment-routing global-block <number> <number>

 

However getting the below error, and I have no idea why. Can anyone help? I am probably doing something very stupid, but it looks good to me per the pyang output. Cheers for any help. 

 

>>> instance = cisco_isis.Isis.Instances.Instance() 

>>> instance.srgb.lower_bound = 76800
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'lower_bound'
>>>

1 ACCEPTED SOLUTION

Accepted Solutions
Highlighted
Cisco Employee

Re: YDK ISIS Segment Routing SRGB

See below a script that pushes that config.  Note that SRGB is a presence container, so the object has to be instantiated explicitly.

 

#!/usr/bin/env python
#
# 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.
#

"""
Create configuration for model Cisco-IOS-XR-clns-isis-cfg.

usage: nc-create-xr-clns-isis-cfg-60-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_clns_isis_cfg \
    as xr_clns_isis_cfg
from ydk.types import Empty
import logging


def config_isis(isis):
    """Add config data to isis object."""
    # global configuration
    instance = isis.instances.Instance()
    instance.instance_name = "1"
    instance.running = Empty()
    instance.srgb = instance.Srgb()
    instance.srgb.lower_bound = 17000
    instance.srgb.upper_bound = 27000
    isis.instances.instance.append(instance)


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.INFO)
        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()

    isis = xr_clns_isis_cfg.Isis()  # create object
    config_isis(isis)  # add object configuration

    # create configuration on NETCONF device
    crud.create(provider, isis)

    exit()
# End of script

Log:

$ ./nc-create-xr-clns-isis-cfg-99-ydk.py ssh://user:password@host -v
2020-02-18 19:01:50,955 - ydk - INFO - Path where models are to be downloaded: /home/saalvare/.ydk/pavarotti
2020-02-18 19:01:50,967 - ydk - INFO - Connected to pavarotti on port 830 using ssh with timeout of -1
2020-02-18 19:01:50,974 - ydk - INFO - Executing CRUD create operation on [Cisco-IOS-XR-clns-isis-cfg:isis]
2020-02-18 19:01:50,975 - ydk - INFO - Executing 'edit-config' RPC on [Cisco-IOS-XR-clns-isis-cfg:isis]
2020-02-18 19:01:51,001 - ydk - INFO - ============= Sending RPC to device =============
<rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"><edit-config xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
  <target>
    <candidate/>
  </target>
  <config><isis xmlns="http://cisco.com/ns/yang/Cisco-IOS-XR-clns-isis-cfg" xmlns:nc="urn:ietf:params:xml:ns:netconf:base:1.0" nc:operation="merge">
  <instances>
    <instance>
      <instance-name>1</instance-name>
      <running/>
      <srgb>
        <lower-bound>17000</lower-bound>
        <upper-bound>27000</upper-bound>
      </srgb>
    </instance>
  </instances>
</isis>
</config>
</edit-config>
</rpc>
2020-02-18 19:01:51,303 - ydk - INFO - ============= Received RPC from device =============
<?xml version="1.0"?>
<rpc-reply xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="1">
  <ok/>
</rpc-reply>

2020-02-18 19:01:51,303 - ydk - INFO - Executing 'commit' RPC
2020-02-18 19:01:51,304 - ydk - INFO - ============= Sending RPC to device =============
<rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"><commit xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"/>
</rpc>
2020-02-18 19:01:52,362 - ydk - INFO - ============= Received RPC from device =============
<?xml version="1.0"?>
<rpc-reply xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="2">
  <ok/>
</rpc-reply>

2020-02-18 19:01:52,362 - ydk - INFO - Operation succeeded
2020-02-18 19:01:52,368 - ydk - INFO - Disconnected from device
$

View solution in original post

4 REPLIES 4
Highlighted
Beginner

Re: YDK ISIS Segment Routing SRGB

Should've said, imported the yang file as cisco_isis as below as well:

 

from ydk.models.cisco_ios_xr import Cisco_IOS_XR_clns_isis_cfg as cisco_isis

Highlighted
Beginner

Re: YDK ISIS Segment Routing SRGB

It is not clear from your post, how you are going to configure ISIS, what protocol and service your are going to use. Full script and DEBUG log would be helpful.
In the meanwhile, I think the main issue is that you did not define correctly the instance object. It is a member of the list from class Instances and must be defined properly. There are multiple examples published for you to help.

Yan Gorelik
YDK Solutions
Highlighted
Cisco Employee

Re: YDK ISIS Segment Routing SRGB

The alias used in the import statement irrelevant.  Obviously, you need to make sure you're consistent throughout your script in all references.  I like 'xr_clns_isis_cfg' in the following import statement.

 

from ydk.models.cisco_ios_xr import Cisco_IOS_XR_clns_isis_cfg \
    as xr_clns_isis_cfg

It strikes a balance between shortening the name a little bit and being descriptive and unambiguous.

Highlighted
Cisco Employee

Re: YDK ISIS Segment Routing SRGB

See below a script that pushes that config.  Note that SRGB is a presence container, so the object has to be instantiated explicitly.

 

#!/usr/bin/env python
#
# 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.
#

"""
Create configuration for model Cisco-IOS-XR-clns-isis-cfg.

usage: nc-create-xr-clns-isis-cfg-60-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_clns_isis_cfg \
    as xr_clns_isis_cfg
from ydk.types import Empty
import logging


def config_isis(isis):
    """Add config data to isis object."""
    # global configuration
    instance = isis.instances.Instance()
    instance.instance_name = "1"
    instance.running = Empty()
    instance.srgb = instance.Srgb()
    instance.srgb.lower_bound = 17000
    instance.srgb.upper_bound = 27000
    isis.instances.instance.append(instance)


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.INFO)
        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()

    isis = xr_clns_isis_cfg.Isis()  # create object
    config_isis(isis)  # add object configuration

    # create configuration on NETCONF device
    crud.create(provider, isis)

    exit()
# End of script

Log:

$ ./nc-create-xr-clns-isis-cfg-99-ydk.py ssh://user:password@host -v
2020-02-18 19:01:50,955 - ydk - INFO - Path where models are to be downloaded: /home/saalvare/.ydk/pavarotti
2020-02-18 19:01:50,967 - ydk - INFO - Connected to pavarotti on port 830 using ssh with timeout of -1
2020-02-18 19:01:50,974 - ydk - INFO - Executing CRUD create operation on [Cisco-IOS-XR-clns-isis-cfg:isis]
2020-02-18 19:01:50,975 - ydk - INFO - Executing 'edit-config' RPC on [Cisco-IOS-XR-clns-isis-cfg:isis]
2020-02-18 19:01:51,001 - ydk - INFO - ============= Sending RPC to device =============
<rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"><edit-config xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
  <target>
    <candidate/>
  </target>
  <config><isis xmlns="http://cisco.com/ns/yang/Cisco-IOS-XR-clns-isis-cfg" xmlns:nc="urn:ietf:params:xml:ns:netconf:base:1.0" nc:operation="merge">
  <instances>
    <instance>
      <instance-name>1</instance-name>
      <running/>
      <srgb>
        <lower-bound>17000</lower-bound>
        <upper-bound>27000</upper-bound>
      </srgb>
    </instance>
  </instances>
</isis>
</config>
</edit-config>
</rpc>
2020-02-18 19:01:51,303 - ydk - INFO - ============= Received RPC from device =============
<?xml version="1.0"?>
<rpc-reply xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="1">
  <ok/>
</rpc-reply>

2020-02-18 19:01:51,303 - ydk - INFO - Executing 'commit' RPC
2020-02-18 19:01:51,304 - ydk - INFO - ============= Sending RPC to device =============
<rpc xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"><commit xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"/>
</rpc>
2020-02-18 19:01:52,362 - ydk - INFO - ============= Received RPC from device =============
<?xml version="1.0"?>
<rpc-reply xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="2">
  <ok/>
</rpc-reply>

2020-02-18 19:01:52,362 - ydk - INFO - Operation succeeded
2020-02-18 19:01:52,368 - ydk - INFO - Disconnected from device
$

View solution in original post