Skip to content

Commit

Permalink
Merge pull request #969 from vnitinv/junos-sax-parser
Browse files Browse the repository at this point in the history
Junos sax parser
  • Loading branch information
Nitin Kr authored Oct 24, 2019
2 parents 595dc70 + c3c013d commit fdd6fdc
Show file tree
Hide file tree
Showing 2 changed files with 97 additions and 5 deletions.
16 changes: 11 additions & 5 deletions lib/jnpr/junos/factory/optable.py
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,6 @@ def get(self, *vargs, **kvargs):
rpc_args.update(kvargs.pop('args'))
rpc_args.update(kvargs) # copy caller provided args


if hasattr(self, 'GET_KEY') and argkey is not None:
rpc_args.update({self.GET_KEY: argkey})

Expand All @@ -98,11 +97,10 @@ def generate_sax_parser_input(obj):
Returns: lxml etree object to be used as sax parser input
"""
item_tags = []
if '/' in obj.ITEM_XPATH:
tags = obj.ITEM_XPATH.split('/')
parser_ingest = E(tags.pop(-1), E(obj.ITEM_NAME_XPATH))
for tag in tags[::-1]:
parser_ingest = E(tag, parser_ingest)
item_tags = obj.ITEM_XPATH.split('/')
parser_ingest = E(item_tags.pop(-1), E(obj.ITEM_NAME_XPATH))
else:
parser_ingest = E(obj.ITEM_XPATH, E(obj.ITEM_NAME_XPATH))
local_field_dict = deepcopy(obj.VIEW.FIELDS)
Expand Down Expand Up @@ -150,4 +148,12 @@ def generate_sax_parser_input(obj):
parser_ingest.insert(i + 1, obj)
else:
parser_ingest.insert(i + 1, E(xpath))
# cases where item is something like
# item: task-memory-malloc-usage-report/task-malloc-list/task-malloc
# created filter from last item task-malloc
# Now add all the tags if present
for item_tag in item_tags[::-1]:
parser_ingest = E(item_tag, parser_ingest)
logger.debug("Generated filter XML is: %s" % etree.tostring(parser_ingest))

return parser_ingest
86 changes: 86 additions & 0 deletions tests/unit/factory/test_optable.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,16 +3,21 @@

import unittest
import os
import yaml
from nose.plugins.attrib import attr

from jnpr.junos import Device
from jnpr.junos.op.phyport import PhyPortStatsTable
from jnpr.junos.op.ethport import EthPortTable
from jnpr.junos.factory.factory_loader import FactoryLoader
from jnpr.junos.factory.optable import generate_sax_parser_input

from ncclient.manager import Manager, make_device_handler
from ncclient.transport import SSHSession
from ncclient.operations.rpc import RPCReply

from lxml import etree

from mock import patch


Expand Down Expand Up @@ -89,6 +94,87 @@ def bad(key):

self.assertRaises(ValueError, bad, 'bunk')

def test_generate_sax_parser_item_with_many_slash(self):
yaml_data = """
---
taskmallocdetail:
rpc: get-task-memory-information
args:
level: detail
item: task-memory-malloc-usage-report/task-malloc-list/task-malloc
key: tm-name
view: taskmallocview
taskmallocview:
fields:
tmallocs: tm-allocs
tmallocbytes: tm-alloc-bytes
tmmaxallocs: tm-max-allocs
tmmaxallocbytes: tm-max-alloc-bytes
tmfunctioncalls: tm-function-calls
"""
globals().update(FactoryLoader().load(yaml.load(yaml_data,
Loader=yaml.Loader)))
tbl = taskmallocdetail(self.dev)
data = generate_sax_parser_input(tbl)
self.assertEqual(data.tag, 'task-memory-malloc-usage-report')
self.assertEqual(len(etree.tostring(data)), len(
b'<task-memory-malloc-usage-report><task-malloc-list><task-malloc><tm-name/><t'
b'm-allocs/><tm-alloc-bytes/><tm-max-allocs/><tm-max-alloc-bytes/><tm-function'
b'-calls/></task-malloc></task-malloc-list></task-memory-malloc-usage-report>'))

def test_generate_sax_parser_same_parents_with_diff_fields(self):
yaml_data = """
---
VtepTable:
rpc: get-interface-information
args:
interface-name: "vtep"
extensive: True
item: physical-interface
key: name
view: VtepView
VtepView:
fields:
admin-status: admin-status
oper-status: oper-status
link-level-type: link-level-type
input-bytes: traffic-statistics/input-bytes
output-bytes: traffic-statistics/output-bytes
input-errors: input-error-list/input-errors
output-errors: output-error-list/output-errors
carrier-transitions: output-error-list/carrier-transitions
vtep-tunnel-stats: VtepTunnelTable
VtepTunnelTable:
item: logical-interface
key: name
view: VtepTunnelView
VtepTunnelView:
fields:
vtep-type: vtep-info/vtep-type
vtep-address: vtep-info/vtep-address
tunnel-input-bytes: traffic-statistics/input-bytes
tunnel-output-bytes: traffic-statistics/output-bytes
"""
globals().update(FactoryLoader().load(yaml.load(yaml_data,
Loader=yaml.Loader)))
tbl = VtepTable(self.dev)
data = generate_sax_parser_input(tbl)
self.assertEqual(data.tag, 'physical-interface')
self.assertEqual(len(etree.tostring(data)),len(
b'<physical-interface><name/><admin-status/><oper-status/>'
b'<link-level-type/><traffic-statistics><input-bytes/>'
b'<output-bytes/></traffic-statistics><input-error-list>'
b'<input-errors/></input-error-list><output-error-list>'
b'<output-errors/><carrier-transitions/></output-error-list>'
b'<logical-interface><name/><vtep-info><vtep-type/><vtep-address/>'
b'</vtep-info><traffic-statistics><input-bytes/><output-bytes/>'
b'</traffic-statistics></logical-interface></physical-interface>')
)

def _read_file(self, fname):
from ncclient.xml_ import NCElement

Expand Down

0 comments on commit fdd6fdc

Please sign in to comment.