Skip to content

Commit cb72a5d

Browse files
authored
Add Nvidia Onyx config parser (#659)
* Add Nvidia Onyx config parser
1 parent a6c33a8 commit cb72a5d

8 files changed

Lines changed: 355 additions & 0 deletions

File tree

docs/dev/include_parser_list.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
| mrv_optiswitch | netutils.config.parser.OptiswitchConfigParser |
2121
| netscaler | netutils.config.parser.NetscalerConfigParser |
2222
| nokia_sros | netutils.config.parser.NokiaConfigParser |
23+
| nvidia_onyx | netutils.config.parser.NvidiaOnyxConfigParser |
2324
| paloalto_panos | netutils.config.parser.PaloAltoNetworksConfigParser |
2425
| ruckus_fastiron | netutils.config.parser.FastironConfigParser |
2526
| ubiquiti_airos | netutils.config.parser.UbiquitiAirOSConfigParser |

docs/user/lib_mapper/netutilsparser.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
| mrv_optiswitch || mrv_optiswitch |
2121
| netscaler || netscaler |
2222
| nokia_sros || nokia_sros |
23+
| nvidia_onyx || nvidia_onyx |
2324
| paloalto_panos || paloalto_panos |
2425
| ruckus_fastiron || ruckus_fastiron |
2526
| ubiquiti_airos || ubiquiti_airos |

docs/user/lib_mapper/netutilsparser_reverse.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
| mrv_optiswitch || mrv_optiswitch |
2222
| netscaler || netscaler |
2323
| nokia_sros || nokia_sros |
24+
| nvidia_onyx || nvidia_onyx |
2425
| paloalto_panos || paloalto_panos |
2526
| ruckus_fastiron || ruckus_fastiron |
2627
| ubiquiti_airos || ubiquiti_airos |

netutils/config/compliance.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
"mrv_optiswitch": parser.OptiswitchConfigParser,
2828
"netscaler": parser.NetscalerConfigParser,
2929
"nokia_sros": parser.NokiaConfigParser,
30+
"nvidia_onyx": parser.NvidiaOnyxConfigParser,
3031
"paloalto_panos": parser.PaloAltoNetworksConfigParser,
3132
"ruckus_fastiron": parser.FastironConfigParser,
3233
"ubiquiti_airos": parser.UbiquitiAirOSConfigParser,

netutils/config/parser.py

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1763,3 +1763,92 @@ class HPComwareConfigParser(HPEConfigParser, BaseSpaceConfigParser):
17631763
def _build_banner(self, config_line: str) -> t.Optional[str]:
17641764
"""Build a banner from the given config line."""
17651765
return super(HPComwareConfigParser, self)._build_banner(config_line)
1766+
1767+
1768+
class NvidiaOnyxConfigParser(BaseConfigParser): # pylint: disable=abstract-method
1769+
"""Nvidia Onyx config parser."""
1770+
1771+
comment_char = "#"
1772+
section_char = "##"
1773+
1774+
def __init__(self, config: str):
1775+
"""Create ConfigParser Object.
1776+
1777+
Args:
1778+
config: The config text to parse.
1779+
"""
1780+
self.config = config
1781+
self._config: t.Optional[str] = None
1782+
self._current_parents: t.Tuple[str, ...] = ()
1783+
self.generator_config = tuple(self._config_lines_only())
1784+
self.config_lines: t.List[ConfigLine] = []
1785+
self.build_config_relationship()
1786+
1787+
def _config_lines_only(self) -> [str]:
1788+
"""Remove spaces and unwanted lines from config lines.
1789+
1790+
Returns:
1791+
An array with non-space and non-comment lines from ``config``.
1792+
"""
1793+
banner_text = ""
1794+
config_lines = []
1795+
for line in self.config.splitlines():
1796+
if line.startswith(self.section_char):
1797+
continue
1798+
stripped = line.strip()
1799+
if re.match(r'banner \w+ (?!\".+\")', stripped):
1800+
banner_text += line.lstrip()
1801+
elif banner_text and not stripped.endswith('"'):
1802+
banner_text += '\n' + line
1803+
elif banner_text and stripped.endswith('"'):
1804+
banner_text += '\n' + line
1805+
config_lines.append(banner_text)
1806+
banner_text = ""
1807+
elif stripped:
1808+
config_lines.append(stripped)
1809+
1810+
return config_lines
1811+
1812+
@property
1813+
def config_lines_only(self) -> str:
1814+
"""Remove spaces and unwanted lines from config lines.
1815+
1816+
Returns:
1817+
The non-space and non-comment lines from ``config``.
1818+
"""
1819+
return "\n".join(self._config_lines_only())
1820+
1821+
def build_config_relationship(self) -> t.List[ConfigLine]:
1822+
r"""Parse text config lines and banners.
1823+
1824+
Examples:
1825+
>>> from netutils.config.parser import BaseSpaceConfigParser, ConfigLine
1826+
>>> config = '''
1827+
... ##
1828+
... ## VLAN configuration
1829+
... ##
1830+
... vlan 1
1831+
... vlan 2
1832+
... vlan 3
1833+
...
1834+
... ##
1835+
... ## Network management configuration
1836+
... ##
1837+
... banner login "
1838+
...
1839+
... MULTILINE BANNER"'''
1840+
>>> config_tree = NvidiaOnyxConfigParser(config)
1841+
>>> config_tree.build_config_relationship() == \
1842+
... [
1843+
... ConfigLine(config_line='vlan 1', parents=()),
1844+
... ConfigLine(config_line='vlan 2', parents=()),
1845+
... ConfigLine(config_line='vlan 3', parents=()),
1846+
... ConfigLine(config_line='banner login "\n\nMULTILINE BANNER"', parents=()),
1847+
... ]
1848+
True
1849+
"""
1850+
for line in self.generator_config:
1851+
if not line.startswith(self.comment_char):
1852+
self.config_lines.append(ConfigLine(line, ()))
1853+
1854+
return self.config_lines

netutils/lib_mapper.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -423,6 +423,7 @@
423423
"mrv_optiswitch": "mrv_optiswitch",
424424
"netscaler": "netscaler",
425425
"nokia_sros": "nokia_sros",
426+
"nvidia_onyx": "nvidia_onyx",
426427
"paloalto_panos": "paloalto_panos",
427428
"ruckus_fastiron": "ruckus_fastiron",
428429
"ubiquiti_airos": "ubiquiti_airos",
@@ -593,6 +594,7 @@
593594
"mrv_optiswitch": "mrv_optiswitch",
594595
"netscaler": "netscaler",
595596
"nokia_sros": "nokia_sros",
597+
"nvidia_onyx": "nvidia_onyx",
596598
"paloalto_panos": "paloalto_panos",
597599
"ruckus_fastiron": "ruckus_fastiron",
598600
"ubiquiti_airos": "ubiquiti_airos",
@@ -660,6 +662,7 @@
660662
_MAIN_LIB_MAPPER["k8s"] = "k8s"
661663
_MAIN_LIB_MAPPER["lenovo_cnos"] = "lenovo_cnos"
662664
_MAIN_LIB_MAPPER["lenovo_enos"] = "lenovo_enos"
665+
_MAIN_LIB_MAPPER["nvidia_onyx"] = "nvidia_onyx"
663666
_MAIN_LIB_MAPPER["openconfig"] = "openconfig"
664667
_MAIN_LIB_MAPPER["packetfilter"] = "packetfilter"
665668
_MAIN_LIB_MAPPER["pcap"] = "pcap"
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
from netutils.config.parser import ConfigLine
2+
3+
data = [
4+
ConfigLine(config_line='no cli default prefix-modes enable', parents=()),
5+
ConfigLine(config_line='protocol mlag', parents=()),
6+
ConfigLine(config_line='interface ethernet 1/1 shutdown', parents=()),
7+
ConfigLine(config_line='interface ethernet 1/2 shutdown', parents=()),
8+
ConfigLine(config_line='interface ethernet 1/3 shutdown', parents=()),
9+
ConfigLine(config_line='interface ethernet 1/4 shutdown', parents=()),
10+
ConfigLine(config_line='interface ethernet 1/5 shutdown', parents=()),
11+
ConfigLine(config_line='interface ethernet 1/6 shutdown', parents=()),
12+
ConfigLine(config_line='interface ethernet 1/7 shutdown', parents=()),
13+
ConfigLine(config_line='interface ethernet 1/8 shutdown', parents=()),
14+
ConfigLine(config_line='interface ethernet 1/9 shutdown', parents=()),
15+
ConfigLine(config_line='interface ethernet 1/10 shutdown', parents=()),
16+
ConfigLine(config_line='interface ethernet 1/11 shutdown', parents=()),
17+
ConfigLine(config_line='interface ethernet 1/12 shutdown', parents=()),
18+
ConfigLine(config_line='interface ethernet 1/13 shutdown', parents=()),
19+
ConfigLine(config_line='interface ethernet 1/14 shutdown', parents=()),
20+
ConfigLine(config_line='interface ethernet 1/15 shutdown', parents=()),
21+
ConfigLine(config_line='interface ethernet 1/16 shutdown', parents=()),
22+
ConfigLine(config_line='lacp', parents=()),
23+
ConfigLine(config_line='vlan 1', parents=()),
24+
ConfigLine(config_line='vlan 2', parents=()),
25+
ConfigLine(config_line='vlan 3', parents=()),
26+
ConfigLine(config_line='vlan 100', parents=()),
27+
ConfigLine(config_line='vlan 1 name "DEFUALT"', parents=()),
28+
ConfigLine(config_line='vlan 2 name "VLAN2"', parents=()),
29+
ConfigLine(config_line='vlan 3 name "VLAN3"', parents=()),
30+
ConfigLine(config_line='vlan 100 name "VLAN 100"', parents=()),
31+
ConfigLine(config_line='no spanning-tree', parents=()),
32+
ConfigLine(config_line='ip routing vrf default', parents=()),
33+
ConfigLine(config_line='dcb priority-flow-control enable force', parents=()),
34+
ConfigLine(config_line='interface port-channel 1 dcb priority-flow-control mode on force', parents=()),
35+
ConfigLine(config_line='protocol telemetry', parents=()),
36+
ConfigLine(config_line='no mlag shutdown', parents=()),
37+
ConfigLine(config_line='no interface mgmt0 dhcp', parents=()),
38+
ConfigLine(config_line='interface mgmt0 ip address 192.168.0.2 /24', parents=()),
39+
ConfigLine(config_line='interface mgmt1 shutdown', parents=()),
40+
ConfigLine(config_line='no interface mgmt0 ipv6 dhcp client enable', parents=()),
41+
ConfigLine(config_line='ip name-server vrf vrf-default 192.168.0.254', parents=()),
42+
ConfigLine(config_line='ip name-server vrf vrf-default 192.168.0.253', parents=()),
43+
ConfigLine(config_line='hostname HOSTNAME', parents=()),
44+
ConfigLine(config_line='ip route vrf default 0.0.0.0/0 192.168.0.1', parents=()),
45+
ConfigLine(config_line='no ipv6 enable', parents=()),
46+
ConfigLine(config_line='logging events interfaces enable', parents=()),
47+
ConfigLine(config_line='logging events interfaces interval 30', parents=()),
48+
ConfigLine(config_line='logging format welf', parents=()),
49+
ConfigLine(config_line='logging vrf default 192.168.0.254', parents=()),
50+
ConfigLine(config_line='logging vrf default 192.168.0.254 trap info', parents=()),
51+
ConfigLine(config_line='username localaccount', parents=()),
52+
ConfigLine(config_line='ldap base-dn DC=example,DC=org', parents=()),
53+
ConfigLine(config_line='ldap bind-dn CN=onyxauth,DC=example,DC=org', parents=()),
54+
ConfigLine(config_line='aaa authentication login default ldap local', parents=()),
55+
ConfigLine(config_line='aaa authorization map order remote-only', parents=()),
56+
ConfigLine(config_line='no password hardening enable', parents=()),
57+
ConfigLine(config_line='snmp-server community public ro', parents=()),
58+
ConfigLine(config_line='snmp-server vrf default enable', parents=()),
59+
ConfigLine(config_line='stats sample telemetry enable', parents=()),
60+
ConfigLine(config_line='banner login "\n\nMULTI LINE BANNER"', parents=()),
61+
ConfigLine(config_line='banner motd "SINGLE LINE BANNER"', parents=()),
62+
ConfigLine(config_line='clock timezone Europe Western Madrid', parents=()),
63+
ConfigLine(config_line='json-gw synchronous-request-timeout 50', parents=()),
64+
ConfigLine(config_line='no ntp server 192.168.0.254 disable', parents=()),
65+
ConfigLine(config_line='ntp server 192.168.0.254 keyID 0', parents=()),
66+
ConfigLine(config_line='ntp vrf default enable', parents=()),
67+
ConfigLine(config_line='stats chd telemetry enable', parents=()),
68+
ConfigLine(config_line='terminal sysrq enable', parents=()),
69+
ConfigLine(config_line='no web client cert-verify', parents=()),
70+
ConfigLine(config_line='web vrf default enable', parents=()),
71+
ConfigLine(config_line='no ip filter chain forward rule all', parents=()),
72+
ConfigLine(config_line='no ip filter chain input rule all', parents=()),
73+
ConfigLine(config_line='no ip filter chain logging rule all', parents=()),
74+
ConfigLine(config_line='no ip filter chain output rule all', parents=()),
75+
ConfigLine(config_line='no ip filter enable', parents=()),
76+
ConfigLine(config_line='ssh server login timeout 300', parents=()),
77+
]

0 commit comments

Comments
 (0)