Skip to content

gNMI script results in a segmentation fault if repository is missing a required model #852

@111pontes

Description

@111pontes

gNMI script results in a segmentation fault if repository is missing a required model.

$ ./gn-read-xr-shellutil-oper-20-ydk.py ssh://admin:admin@198.18.1.11:57400 -v
2019-01-14 19:02:40,437 - ydk - INFO - gNMIServiceProvider Connected to 198.18.1.11 via Insecure Channel
2019-01-14 19:02:40,439 - ydk - INFO - Executing CRUD read operation on [Cisco-IOS-XR-shellutil-oper:system-time]
2019-01-14 19:02:40,440 - ydk - INFO - 
=============== Get Request Sent ================
path {
  origin: "Cisco-IOS-XR-shellutil-oper"
  elem {
    name: "system-time"
  }
}
encoding: JSON_IETF


2019-01-14 19:02:40,507 - ydk - INFO - 
============= Get Response Received =============
notification {
  timestamp: 1547470569905132305
  update {
    path {
      origin: "Cisco-IOS-XR-shellutil-oper"
      elem {
        name: "system-time"
      }
    }
    val {
      json_ietf_val: "{\"clock\":{\"year\":2019,\"month\":1,\"day\":14,\"hour\":12,\"minute\":56,\"second\":9,\"millisecond\":874,\"wday\":1,\"time-zone\":\"UTC\",\"time-source\":\"calendar\"},\"uptime\":{\"host-name\":\"r1\",\"uptime\":24349}}"
    }
  }
}
error {
}


2019-01-14 19:02:40,508 - ydk - INFO - Get Operation Succeeded
Segmentation fault (core dumped)
$ 

Repository directory with missing model (Cisco-IOS-XR-shellutil-oper.yang):

$ ls -a /home/admin/.ydk/198.18.1.11
.  ..  ietf-netconf@2011-06-01.yang  ydk@2016-02-26.yang
$ 

Script:

#!/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.
#

"""
Read all data for model Cisco-IOS-XR-shellutil-oper.

usage: gn-read-xr-shellutil-oper-20-ydk.py [-h] [-v] device

positional arguments:
  device         gNMI 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.path import Repository
from ydk.services import CRUDService
from ydk.gnmi.providers import gNMIServiceProvider
from ydk.models.cisco_ios_xr import Cisco_IOS_XR_shellutil_oper \
    as xr_shellutil_oper
import datetime
import textwrap
import os
import logging


def process_system_time(system_time):
    """Process data in system_time object."""
    # format string for system time
    show_system_time = textwrap.dedent("""
        Host: {host}
        System time: {time} {tzone} {date}
        Time source: {source}
        System uptime: {uptime}
        """).strip()

    # create time object
    clock_time = datetime.time(system_time.clock.hour,
                               system_time.clock.minute,
                               system_time.clock.second,
                               system_time.clock.millisecond / 1000)

    # create date object
    clock_date = datetime.date(system_time.clock.year,
                               system_time.clock.month,
                               system_time.clock.day)

    # convert uptime from seconds
    clock_delta = datetime.timedelta(seconds=system_time.uptime.uptime)

    # return formatted string
    return(show_system_time.format(host=system_time.uptime.host_name,
                                   time=clock_time,
                                   tzone=system_time.clock.time_zone,
                                   date=clock_date,
                                   source=system_time.clock.time_source.name,
                                   uptime=clock_delta))


if __name__ == "__main__":
    """Execute main program."""
    parser = ArgumentPgNMI script results in a segmentation fault if repository is missing a required modelarser()
    parser.add_argument("-v", "--verbose", help="print debugging messages",
                        action="store_true")
    parser.add_argument("device",
                        help="gNMI 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 gNMI session
    repository = Repository(os.path.expanduser("~/.ydk/"+device.hostname))
    provider = gNMIServiceProvider(repo=repository,
                                   address=device.hostname,
                                   port=device.port,
                                   username=device.username,
                                   password=device.password)

    # create CRUD service
    crud = CRUDService()

    system_time = xr_shellutil_oper.SystemTime()  # create object

    # read data from NETCONF device
    system_time = crud.read(provider, system_time)
    print(process_system_time(system_time))  # process object data

    exit()
# End of script

A test case should be added to cover broken repositories.

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions