-
Notifications
You must be signed in to change notification settings - Fork 78
gNMI script results in a segmentation fault if repository is missing a required model #852
Copy link
Copy link
Closed
Labels
Description
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.
Reactions are currently unavailable