From 4ce789d4f328d861c7ef52254d4f579e2fef43f3 Mon Sep 17 00:00:00 2001 From: lukebates123 Date: Thu, 10 Nov 2022 15:51:17 -0600 Subject: [PATCH 1/8] add aruba to config parser --- docs/dev/include_parser_list.md | 1 + netutils/config/compliance.py | 1 + netutils/config/parser.py | 85 +++ .../aruba_aoscx/aoscx_basic_backup.txt | 26 + .../aruba_aoscx/aoscx_basic_feature.py | 6 + .../aruba_aoscx/aoscx_basic_intended.txt | 30 + .../aruba_aoscx/aoscx_basic_received.json | 42 ++ .../parser/aruba_aoscx/aoscx_full_received.py | 591 ++++++++++++++++++ .../parser/aruba_aoscx/aoscx_full_sent.txt | 490 +++++++++++++++ 9 files changed, 1272 insertions(+) create mode 100644 tests/unit/mock/config/compliance/compliance/aruba_aoscx/aoscx_basic_backup.txt create mode 100644 tests/unit/mock/config/compliance/compliance/aruba_aoscx/aoscx_basic_feature.py create mode 100644 tests/unit/mock/config/compliance/compliance/aruba_aoscx/aoscx_basic_intended.txt create mode 100644 tests/unit/mock/config/compliance/compliance/aruba_aoscx/aoscx_basic_received.json create mode 100644 tests/unit/mock/config/parser/aruba_aoscx/aoscx_full_received.py create mode 100644 tests/unit/mock/config/parser/aruba_aoscx/aoscx_full_sent.txt diff --git a/docs/dev/include_parser_list.md b/docs/dev/include_parser_list.md index 39a474ce..0426c890 100644 --- a/docs/dev/include_parser_list.md +++ b/docs/dev/include_parser_list.md @@ -1,6 +1,7 @@ | OS Name | Parser Class | | ---------- | ------ | | arista_eos | netutils.config.parser.EOSConfigParser | +| aruba_aoscx | netutils.config.parser.ArubaConfigParser | | bigip_f5 | netutils.config.parser.F5ConfigParser | | cisco_aireos | netutils.config.parser.AIREOSConfigParser | | cisco_asa | netutils.config.parser.ASAConfigParser | diff --git a/netutils/config/compliance.py b/netutils/config/compliance.py index 408d09ef..4bdf82d2 100644 --- a/netutils/config/compliance.py +++ b/netutils/config/compliance.py @@ -16,6 +16,7 @@ "fortinet_fortios": parser.FortinetConfigParser, "nokia_sros": parser.NokiaConfigParser, "citrix_netscaler": parser.NetscalerConfigParser, + "aruba_aoscx": parser.ArubaConfigParser, } # TODO: Once support for 3.7 is dropped, there should be a typing.TypedDict for this which should then also be used diff --git a/netutils/config/parser.py b/netutils/config/parser.py index 812011f2..aeb908a5 100644 --- a/netutils/config/parser.py +++ b/netutils/config/parser.py @@ -1184,3 +1184,88 @@ class NetscalerConfigParser(BaseSpaceConfigParser): def banner_end(self) -> str: """Demarcate End of Banner char(s).""" raise NotImplementedError("Netscaler platform doesn't have a banner.") + + +class ArubaConfigParser(BaseSpaceConfigParser): + """Aruba AOS-CX implementation fo ConfigParser Class.""" + + banner_end = "!" + comment_chars = ["!"] + + def __init__(self, config: str): + """Create ConfigParser Object. + + Args: + config (str): The config text to parse. + """ + super(ArubaConfigParser, self).__init__(config) + + def _build_banner(self, config_line: str) -> t.Optional[str]: + """Handle banner config lines. + + Args: + config_line: The start of the banner config. + + Returns: + The next configuration line in the configuration text or None when banner end is the end of the config text. + + Raises: + ValueError: When the parser is unable to identify the End of the Banner. + """ + self._update_config_lines(config_line) + self._current_parents += (config_line,) + banner_config = [] + for line in self.generator_config: + if not self.is_banner_end(line): + banner_config.append(line) + else: + banner_config.append(line) + line = "\n".join(banner_config) + self._update_config_lines(line) + self._current_parents = self._current_parents[:-1] + try: + return next(self.generator_config) + except StopIteration: + return None + raise ValueError("Unable to parse banner end.") + + def _parse_out_comments(self, config: str) -> str: + """Remove comments while retaining the banner end. + + Args: + config (str): full config as a string. + + Returns: + The non-comment lines from ``config``. + """ + config_lines = [] + # Grab the banner lines from the config. + # Remove the comments from the config. + # Add the banner back to the config after the "hostname" command. The banner ALWAYS comes after the hostname. + pattern = r"^banner motd ![\s\S]+?!$|^banner exec ![\s\S]+?!$" + banner = re.findall(pattern, config, re.MULTILINE) + config = re.sub(pattern, "", config, flags=re.MULTILINE) + for line in config.splitlines(): + if line and not self.is_comment(line) and not line.lstrip().startswith("Current configuration:"): + config_lines.append(line.rstrip()) + if line.lstrip().startswith("hostname"): + for banner_line in banner: + config_lines.append(banner_line) + config = "\n".join(config_lines) + return config + + @property + def config_lines_only(self) -> str: + """Remove spaces and unwanted lines from config lines. + + Returns: + The non-space and non-comment lines from ``config``. + """ + if self._config is None: + config_lines = [] + for line in self.config.splitlines(): + if line and not line.isspace(): + config_lines.append(line.rstrip()) + self._config = "\n".join(config_lines) + self._config = self._parse_out_comments(self._config) + return self._config diff --git a/tests/unit/mock/config/compliance/compliance/aruba_aoscx/aoscx_basic_backup.txt b/tests/unit/mock/config/compliance/compliance/aruba_aoscx/aoscx_basic_backup.txt new file mode 100644 index 00000000..10c7ac4a --- /dev/null +++ b/tests/unit/mock/config/compliance/compliance/aruba_aoscx/aoscx_basic_backup.txt @@ -0,0 +1,26 @@ +hostname spine-01 +banner motd ! +test motd banner +! +banner exec ! +test exec banner +! +ntp server 10.20.1.9 +ntp server 10.20.1.8 +ntp server 10.20.1.7 +! +access-list ip test + 10 deny any 10.10.0.128/255.255.255.128 10.10.0.128/255.255.255.192 + 20 deny any 10.10.0.0/255.255.255.192 10.10.0.0/255.255.255.128 + 30 permit any any any +! +router bgp 65533 + bgp router-id 10.22.0.2 + maximum-paths 8 + timers bgp 1 3 + distance bgp 20 70 + neighbor 10.20.1.10 remote-as 65533 + neighbor 10.20.1.10 passive + address-family ipv4 unicast + neighbor 10.20.1.10 activate + neighbor 10.20.1.10 route-map test-01 in \ No newline at end of file diff --git a/tests/unit/mock/config/compliance/compliance/aruba_aoscx/aoscx_basic_feature.py b/tests/unit/mock/config/compliance/compliance/aruba_aoscx/aoscx_basic_feature.py new file mode 100644 index 00000000..ba760b7d --- /dev/null +++ b/tests/unit/mock/config/compliance/compliance/aruba_aoscx/aoscx_basic_feature.py @@ -0,0 +1,6 @@ +features = [ + {"name": "bgp", "ordered": True, "section": ["router bgp "]}, + {"name": "ntp", "ordered": False, "section": ["ntp server "]}, + {"name": "banner", "ordered": True, "section": ["banner "]}, + {"name": "acl", "ordered": True, "section": ["access-list "]}, +] diff --git a/tests/unit/mock/config/compliance/compliance/aruba_aoscx/aoscx_basic_intended.txt b/tests/unit/mock/config/compliance/compliance/aruba_aoscx/aoscx_basic_intended.txt new file mode 100644 index 00000000..40e9df15 --- /dev/null +++ b/tests/unit/mock/config/compliance/compliance/aruba_aoscx/aoscx_basic_intended.txt @@ -0,0 +1,30 @@ +hostname spine-01 +banner motd ! +############################################################################### +This is a test banner +############################################################################### +! +banner exec ! +############################################################################### +This is a test banner +############################################################################### +! +ntp server 10.20.1.7 +ntp server 10.20.1.8 +ntp server 10.20.1.9 +! +access-list ip test + 10 deny any 10.10.0.0/255.255.255.128 10.10.0.128/255.255.255.192 + 20 deny any 10.10.0.128/255.255.255.192 10.10.0.0/255.255.255.128 + 30 permit any any any +! +router bgp 65533 + bgp router-id 10.22.0.2 + maximum-paths 8 + timers bgp 1 3 + distance bgp 20 70 + neighbor 10.20.1.9 remote-as 65533 + neighbor 10.20.1.9 passive + address-family ipv4 unicast + neighbor 10.20.1.9 activate + neighbor 10.20.1.9 route-map test-01 in \ No newline at end of file diff --git a/tests/unit/mock/config/compliance/compliance/aruba_aoscx/aoscx_basic_received.json b/tests/unit/mock/config/compliance/compliance/aruba_aoscx/aoscx_basic_received.json new file mode 100644 index 00000000..338ebf88 --- /dev/null +++ b/tests/unit/mock/config/compliance/compliance/aruba_aoscx/aoscx_basic_received.json @@ -0,0 +1,42 @@ +{ + "bgp": { + "compliant": false, + "missing": "router bgp 65533\n neighbor 10.20.1.9 remote-as 65533\n neighbor 10.20.1.9 passive\n address-family ipv4 unicast\n neighbor 10.20.1.9 activate\n neighbor 10.20.1.9 route-map test-01 in", + "extra": "router bgp 65533\n neighbor 10.20.1.10 remote-as 65533\n neighbor 10.20.1.10 passive\n address-family ipv4 unicast\n neighbor 10.20.1.10 activate\n neighbor 10.20.1.10 route-map test-01 in", + "cannot_parse": true, + "unordered_compliant": false, + "ordered_compliant": false, + "actual": "router bgp 65533\n bgp router-id 10.22.0.2\n maximum-paths 8\n timers bgp 1 3\n distance bgp 20 70\n neighbor 10.20.1.10 remote-as 65533\n neighbor 10.20.1.10 passive\n address-family ipv4 unicast\n neighbor 10.20.1.10 activate\n neighbor 10.20.1.10 route-map test-01 in", + "intended": "router bgp 65533\n bgp router-id 10.22.0.2\n maximum-paths 8\n timers bgp 1 3\n distance bgp 20 70\n neighbor 10.20.1.9 remote-as 65533\n neighbor 10.20.1.9 passive\n address-family ipv4 unicast\n neighbor 10.20.1.9 activate\n neighbor 10.20.1.9 route-map test-01 in" + }, + "ntp": { + "compliant": true, + "missing": "", + "extra": "", + "cannot_parse": true, + "unordered_compliant": true, + "ordered_compliant": false, + "actual": "ntp server 10.20.1.9\nntp server 10.20.1.8\nntp server 10.20.1.7", + "intended": "ntp server 10.20.1.7\nntp server 10.20.1.8\nntp server 10.20.1.9" + }, + "banner": { + "compliant": false, + "missing": "", + "extra": "", + "cannot_parse": true, + "unordered_compliant": false, + "ordered_compliant": false, + "actual": "banner motd !\ntest motd banner\n!\nbanner exec !\ntest exec banner\n!", + "intended": "banner motd !\n###############################################################################\nThis is a test banner\n###############################################################################\n!\nbanner exec !\n###############################################################################\nThis is a test banner\n###############################################################################\n!" + }, + "acl": { + "compliant": false, + "missing": "access-list ip test\n 10 deny any 10.10.0.0/255.255.255.128 10.10.0.128/255.255.255.192\n 20 deny any 10.10.0.128/255.255.255.192 10.10.0.0/255.255.255.128", + "extra": "access-list ip test\n 10 deny any 10.10.0.128/255.255.255.128 10.10.0.128/255.255.255.192\n 20 deny any 10.10.0.0/255.255.255.192 10.10.0.0/255.255.255.128", + "cannot_parse": true, + "unordered_compliant": false, + "ordered_compliant": false, + "actual": "access-list ip test\n 10 deny any 10.10.0.128/255.255.255.128 10.10.0.128/255.255.255.192\n 20 deny any 10.10.0.0/255.255.255.192 10.10.0.0/255.255.255.128\n 30 permit any any any", + "intended": "access-list ip test\n 10 deny any 10.10.0.0/255.255.255.128 10.10.0.128/255.255.255.192\n 20 deny any 10.10.0.128/255.255.255.192 10.10.0.0/255.255.255.128\n 30 permit any any any" + } +} diff --git a/tests/unit/mock/config/parser/aruba_aoscx/aoscx_full_received.py b/tests/unit/mock/config/parser/aruba_aoscx/aoscx_full_received.py new file mode 100644 index 00000000..99b03f09 --- /dev/null +++ b/tests/unit/mock/config/parser/aruba_aoscx/aoscx_full_received.py @@ -0,0 +1,591 @@ +from netutils.config.parser import ConfigLine + +data = [ + ConfigLine(config_line="hostname spine-01", parents=()), + ConfigLine(config_line="banner motd !", parents=()), + ConfigLine( + config_line="###############################################################################\nThis is a test banner\n###############################################################################\n!", + parents=("banner motd !",), + ), + ConfigLine(config_line="banner exec !", parents=()), + ConfigLine( + config_line="###############################################################################\nThis is a test banner\n###############################################################################\n!", + parents=("banner exec !",), + ), + ConfigLine(config_line="user admin group administrators password ciphertext xxxxx", parents=()), + ConfigLine(config_line="no ip icmp redirect", parents=()), + ConfigLine(config_line="profile leaf", parents=()), + ConfigLine(config_line="vrf test", parents=()), + ConfigLine(config_line="vrf keepalive", parents=()), + ConfigLine(config_line="ntp server 10.20.1.7", parents=()), + ConfigLine(config_line="ntp server 10.20.1.8", parents=()), + ConfigLine(config_line="ntp server 10.20.1.9", parents=()), + ConfigLine(config_line="ntp enable", parents=()), + ConfigLine(config_line="ssh server vrf test", parents=()), + ConfigLine(config_line="ssh server vrf default", parents=()), + ConfigLine(config_line="ssh server vrf keepalive", parents=()), + ConfigLine(config_line="ssh server vrf mgmt", parents=()), + ConfigLine(config_line="access-list ip test", parents=()), + ConfigLine( + config_line=" 10 deny any 10.10.0.0/255.255.255.128 10.10.0.128/255.255.255.192", + parents=("access-list ip test",), + ), + ConfigLine( + config_line=" 20 deny any 10.10.0.128/255.255.255.192 10.10.0.0/255.255.255.128", + parents=("access-list ip test",), + ), + ConfigLine(config_line=" 30 permit any any any", parents=("access-list ip test",)), + ConfigLine(config_line="access-list ip mgmt", parents=()), + ConfigLine( + config_line=" 10 comment ALLOW SSH, HTTPS, AND SNMP ON HMN SUBNET and CMN", parents=("access-list ip mgmt",) + ), + ConfigLine(config_line=" 20 permit tcp 10.40.0.0/255.255.128.0 any eq ssh", parents=("access-list ip mgmt",)), + ConfigLine(config_line=" 30 permit tcp 10.40.0.0/255.255.128.0 any eq https", parents=("access-list ip mgmt",)), + ConfigLine(config_line=" 40 permit udp 10.40.0.0/255.255.128.0 any eq snmp", parents=("access-list ip mgmt",)), + ConfigLine( + config_line=" 50 permit udp 10.40.0.0/255.255.128.0 any eq snmp-trap", parents=("access-list ip mgmt",) + ), + ConfigLine(config_line=" 60 permit tcp 10.10.0.0/255.255.255.128 any eq ssh", parents=("access-list ip mgmt",)), + ConfigLine( + config_line=" 70 permit tcp 10.10.0.0/255.255.255.128 any eq https", parents=("access-list ip mgmt",) + ), + ConfigLine(config_line=" 80 permit udp 10.10.0.0/255.255.255.128 any eq snmp", parents=("access-list ip mgmt",)), + ConfigLine( + config_line=" 90 permit udp 10.10.0.0/255.255.255.128 any eq snmp-trap", parents=("access-list ip mgmt",) + ), + ConfigLine(config_line=" 100 comment ALLOW SNMP FROM HMN METALLB SUBNET", parents=("access-list ip mgmt",)), + ConfigLine( + config_line=" 110 permit udp 10.30.100.0/255.255.255.0 any eq snmp", parents=("access-list ip mgmt",) + ), + ConfigLine( + config_line=" 120 permit udp 10.30.100.0/255.255.255.0 any eq snmp-trap", parents=("access-list ip mgmt",) + ), + ConfigLine( + config_line=" 130 comment BLOCK SSH, HTTPS, AND SNMP FROM EVERYWHERE ELSE", parents=("access-list ip mgmt",) + ), + ConfigLine(config_line=" 140 deny tcp any any eq ssh", parents=("access-list ip mgmt",)), + ConfigLine(config_line=" 150 deny tcp any any eq https", parents=("access-list ip mgmt",)), + ConfigLine(config_line=" 160 deny udp any any eq snmp", parents=("access-list ip mgmt",)), + ConfigLine(config_line=" 170 deny udp any any eq snmp-trap", parents=("access-list ip mgmt",)), + ConfigLine(config_line=" 180 comment ALLOW ANYTHING ELSE", parents=("access-list ip mgmt",)), + ConfigLine(config_line=" 190 permit any any any", parents=("access-list ip mgmt",)), + ConfigLine(config_line="access-list ip nmn-hmn", parents=()), + ConfigLine( + config_line=" 10 deny any 10.20.0.0/255.255.128.0 10.40.0.0/255.255.128.0", + parents=("access-list ip nmn-hmn",), + ), + ConfigLine( + config_line=" 20 deny any 10.40.0.0/255.255.128.0 10.20.0.0/255.255.128.0", + parents=("access-list ip nmn-hmn",), + ), + ConfigLine(config_line=" 30 permit any any any", parents=("access-list ip nmn-hmn",)), + ConfigLine(config_line="apply access-list ip mgmt control-plane vrf default", parents=()), + ConfigLine(config_line="vlan 1", parents=()), + ConfigLine(config_line="vlan 2", parents=()), + ConfigLine(config_line=" name test_vlan", parents=("vlan 2",)), + ConfigLine(config_line=" apply access-list ip nmn-hmn in", parents=("vlan 2",)), + ConfigLine(config_line=" apply access-list ip nmn-hmn out", parents=("vlan 2",)), + ConfigLine(config_line="vlan 400", parents=()), + ConfigLine(config_line=" name HMN", parents=("vlan 400",)), + ConfigLine(config_line=" apply access-list ip nmn-hmn in", parents=("vlan 400",)), + ConfigLine(config_line=" apply access-list ip nmn-hmn out", parents=("vlan 400",)), + ConfigLine(config_line="vlan 15", parents=()), + ConfigLine(config_line=" name CAN", parents=("vlan 15",)), + ConfigLine(config_line="vlan 69", parents=()), + ConfigLine(config_line=" name CMN", parents=("vlan 69",)), + ConfigLine(config_line="vlan 10", parents=()), + ConfigLine(config_line=" name SUN", parents=("vlan 10",)), + ConfigLine(config_line="spanning-tree", parents=()), + ConfigLine(config_line="spanning-tree priority 0", parents=()), + ConfigLine(config_line="spanning-tree forward-delay 4", parents=()), + ConfigLine(config_line="spanning-tree config-name MST0", parents=()), + ConfigLine(config_line="spanning-tree config-revision 1", parents=()), + ConfigLine(config_line="interface mgmt", parents=()), + ConfigLine(config_line=" shutdown", parents=("interface mgmt",)), + ConfigLine(config_line=" ip dhcp", parents=("interface mgmt",)), + ConfigLine(config_line="interface lag 1 multi-chassis", parents=()), + ConfigLine(config_line=" no shutdown", parents=("interface lag 1 multi-chassis",)), + ConfigLine(config_line=" no routing", parents=("interface lag 1 multi-chassis",)), + ConfigLine(config_line=" vlan trunk native 1", parents=("interface lag 1 multi-chassis",)), + ConfigLine(config_line=" vlan trunk allowed 1-2,4,6-7", parents=("interface lag 1 multi-chassis",)), + ConfigLine(config_line=" lacp mode active", parents=("interface lag 1 multi-chassis",)), + ConfigLine(config_line=" lacp fallback", parents=("interface lag 1 multi-chassis",)), + ConfigLine(config_line=" spanning-tree port-type admin-edge", parents=("interface lag 1 multi-chassis",)), + ConfigLine(config_line="interface lag 3 multi-chassis", parents=()), + ConfigLine(config_line=" no shutdown", parents=("interface lag 3 multi-chassis",)), + ConfigLine(config_line=" no routing", parents=("interface lag 3 multi-chassis",)), + ConfigLine(config_line=" vlan trunk native 1", parents=("interface lag 3 multi-chassis",)), + ConfigLine(config_line=" vlan trunk allowed 1-2,4,6-7", parents=("interface lag 3 multi-chassis",)), + ConfigLine(config_line=" lacp mode active", parents=("interface lag 3 multi-chassis",)), + ConfigLine(config_line=" lacp fallback", parents=("interface lag 3 multi-chassis",)), + ConfigLine(config_line=" spanning-tree port-type admin-edge", parents=("interface lag 3 multi-chassis",)), + ConfigLine(config_line="interface lag 5 multi-chassis", parents=()), + ConfigLine(config_line=" no shutdown", parents=("interface lag 5 multi-chassis",)), + ConfigLine(config_line=" no routing", parents=("interface lag 5 multi-chassis",)), + ConfigLine(config_line=" vlan trunk native 1", parents=("interface lag 5 multi-chassis",)), + ConfigLine(config_line=" vlan trunk allowed 1-2,4,6-7", parents=("interface lag 5 multi-chassis",)), + ConfigLine(config_line=" lacp mode active", parents=("interface lag 5 multi-chassis",)), + ConfigLine(config_line=" lacp fallback", parents=("interface lag 5 multi-chassis",)), + ConfigLine(config_line=" spanning-tree port-type admin-edge", parents=("interface lag 5 multi-chassis",)), + ConfigLine(config_line="interface lag 7 multi-chassis", parents=()), + ConfigLine(config_line=" no shutdown", parents=("interface lag 7 multi-chassis",)), + ConfigLine(config_line=" no routing", parents=("interface lag 7 multi-chassis",)), + ConfigLine(config_line=" vlan trunk native 1", parents=("interface lag 7 multi-chassis",)), + ConfigLine(config_line=" vlan trunk allowed 1-2,4,6-7", parents=("interface lag 7 multi-chassis",)), + ConfigLine(config_line=" lacp mode active", parents=("interface lag 7 multi-chassis",)), + ConfigLine(config_line=" lacp fallback", parents=("interface lag 7 multi-chassis",)), + ConfigLine(config_line=" spanning-tree port-type admin-edge", parents=("interface lag 7 multi-chassis",)), + ConfigLine(config_line="interface lag 8 multi-chassis", parents=()), + ConfigLine(config_line=" no shutdown", parents=("interface lag 8 multi-chassis",)), + ConfigLine(config_line=" no routing", parents=("interface lag 8 multi-chassis",)), + ConfigLine(config_line=" vlan trunk native 1", parents=("interface lag 8 multi-chassis",)), + ConfigLine(config_line=" vlan trunk allowed 1-2,4,6-7", parents=("interface lag 8 multi-chassis",)), + ConfigLine(config_line=" lacp mode active", parents=("interface lag 8 multi-chassis",)), + ConfigLine(config_line=" lacp fallback", parents=("interface lag 8 multi-chassis",)), + ConfigLine(config_line=" spanning-tree port-type admin-edge", parents=("interface lag 8 multi-chassis",)), + ConfigLine(config_line="interface lag 9 multi-chassis", parents=()), + ConfigLine(config_line=" no shutdown", parents=("interface lag 9 multi-chassis",)), + ConfigLine(config_line=" no routing", parents=("interface lag 9 multi-chassis",)), + ConfigLine(config_line=" vlan trunk native 1", parents=("interface lag 9 multi-chassis",)), + ConfigLine(config_line=" vlan trunk allowed 1-2,4,6-7", parents=("interface lag 9 multi-chassis",)), + ConfigLine(config_line=" lacp mode active", parents=("interface lag 9 multi-chassis",)), + ConfigLine(config_line=" lacp fallback", parents=("interface lag 9 multi-chassis",)), + ConfigLine(config_line=" spanning-tree port-type admin-edge", parents=("interface lag 9 multi-chassis",)), + ConfigLine(config_line="interface lag 10 multi-chassis", parents=()), + ConfigLine(config_line=" no shutdown", parents=("interface lag 10 multi-chassis",)), + ConfigLine(config_line=" no routing", parents=("interface lag 10 multi-chassis",)), + ConfigLine(config_line=" vlan trunk native 1", parents=("interface lag 10 multi-chassis",)), + ConfigLine(config_line=" vlan trunk allowed 10", parents=("interface lag 10 multi-chassis",)), + ConfigLine(config_line=" lacp mode active", parents=("interface lag 10 multi-chassis",)), + ConfigLine(config_line=" lacp fallback", parents=("interface lag 10 multi-chassis",)), + ConfigLine(config_line=" spanning-tree port-type admin-edge", parents=("interface lag 10 multi-chassis",)), + ConfigLine(config_line="interface lag 11 multi-chassis", parents=()), + ConfigLine(config_line=" no shutdown", parents=("interface lag 11 multi-chassis",)), + ConfigLine(config_line=" no routing", parents=("interface lag 11 multi-chassis",)), + ConfigLine(config_line=" vlan trunk native 1", parents=("interface lag 11 multi-chassis",)), + ConfigLine(config_line=" vlan trunk allowed 1-2,4,6-7", parents=("interface lag 11 multi-chassis",)), + ConfigLine(config_line=" lacp mode active", parents=("interface lag 11 multi-chassis",)), + ConfigLine(config_line=" lacp fallback", parents=("interface lag 11 multi-chassis",)), + ConfigLine(config_line=" spanning-tree port-type admin-edge", parents=("interface lag 11 multi-chassis",)), + ConfigLine(config_line="interface lag 12 multi-chassis", parents=()), + ConfigLine(config_line=" no shutdown", parents=("interface lag 12 multi-chassis",)), + ConfigLine(config_line=" no routing", parents=("interface lag 12 multi-chassis",)), + ConfigLine(config_line=" vlan trunk native 1", parents=("interface lag 12 multi-chassis",)), + ConfigLine(config_line=" vlan trunk allowed 10", parents=("interface lag 12 multi-chassis",)), + ConfigLine(config_line=" lacp mode active", parents=("interface lag 12 multi-chassis",)), + ConfigLine(config_line=" lacp fallback", parents=("interface lag 12 multi-chassis",)), + ConfigLine(config_line=" spanning-tree port-type admin-edge", parents=("interface lag 12 multi-chassis",)), + ConfigLine(config_line="interface lag 13 multi-chassis", parents=()), + ConfigLine(config_line=" no shutdown", parents=("interface lag 13 multi-chassis",)), + ConfigLine(config_line=" no routing", parents=("interface lag 13 multi-chassis",)), + ConfigLine(config_line=" vlan trunk native 1", parents=("interface lag 13 multi-chassis",)), + ConfigLine(config_line=" vlan trunk allowed 1-2,4,6-7", parents=("interface lag 13 multi-chassis",)), + ConfigLine(config_line=" lacp mode active", parents=("interface lag 13 multi-chassis",)), + ConfigLine(config_line=" lacp fallback", parents=("interface lag 13 multi-chassis",)), + ConfigLine(config_line=" spanning-tree port-type admin-edge", parents=("interface lag 13 multi-chassis",)), + ConfigLine(config_line="interface lag 14 multi-chassis", parents=()), + ConfigLine(config_line=" no shutdown", parents=("interface lag 14 multi-chassis",)), + ConfigLine(config_line=" no routing", parents=("interface lag 14 multi-chassis",)), + ConfigLine(config_line=" vlan trunk native 1", parents=("interface lag 14 multi-chassis",)), + ConfigLine(config_line=" vlan trunk allowed 10", parents=("interface lag 14 multi-chassis",)), + ConfigLine(config_line=" lacp mode active", parents=("interface lag 14 multi-chassis",)), + ConfigLine(config_line=" lacp fallback", parents=("interface lag 14 multi-chassis",)), + ConfigLine(config_line=" spanning-tree port-type admin-edge", parents=("interface lag 14 multi-chassis",)), + ConfigLine(config_line="interface lag 15 multi-chassis", parents=()), + ConfigLine(config_line=" no shutdown", parents=("interface lag 15 multi-chassis",)), + ConfigLine(config_line=" no routing", parents=("interface lag 15 multi-chassis",)), + ConfigLine(config_line=" vlan trunk native 1", parents=("interface lag 15 multi-chassis",)), + ConfigLine(config_line=" vlan trunk allowed 1-2,4,6-7", parents=("interface lag 15 multi-chassis",)), + ConfigLine(config_line=" lacp mode active", parents=("interface lag 15 multi-chassis",)), + ConfigLine(config_line=" lacp fallback", parents=("interface lag 15 multi-chassis",)), + ConfigLine(config_line=" spanning-tree port-type admin-edge", parents=("interface lag 15 multi-chassis",)), + ConfigLine(config_line="interface lag 17 multi-chassis", parents=()), + ConfigLine(config_line=" no shutdown", parents=("interface lag 17 multi-chassis",)), + ConfigLine(config_line=" no routing", parents=("interface lag 17 multi-chassis",)), + ConfigLine(config_line=" vlan trunk native 1", parents=("interface lag 17 multi-chassis",)), + ConfigLine(config_line=" vlan trunk allowed 6-7", parents=("interface lag 17 multi-chassis",)), + ConfigLine(config_line=" lacp mode active", parents=("interface lag 17 multi-chassis",)), + ConfigLine(config_line=" lacp fallback", parents=("interface lag 17 multi-chassis",)), + ConfigLine(config_line=" spanning-tree port-type admin-edge", parents=("interface lag 17 multi-chassis",)), + ConfigLine(config_line="interface lag 19 multi-chassis", parents=()), + ConfigLine(config_line=" no shutdown", parents=("interface lag 19 multi-chassis",)), + ConfigLine(config_line=" no routing", parents=("interface lag 19 multi-chassis",)), + ConfigLine(config_line=" vlan trunk native 1", parents=("interface lag 19 multi-chassis",)), + ConfigLine(config_line=" vlan trunk allowed 1-2,4,6-7", parents=("interface lag 19 multi-chassis",)), + ConfigLine(config_line=" lacp mode active", parents=("interface lag 19 multi-chassis",)), + ConfigLine(config_line=" lacp fallback", parents=("interface lag 19 multi-chassis",)), + ConfigLine(config_line=" spanning-tree port-type admin-edge", parents=("interface lag 19 multi-chassis",)), + ConfigLine(config_line="interface lag 151 multi-chassis", parents=()), + ConfigLine(config_line=" no shutdown", parents=("interface lag 151 multi-chassis",)), + ConfigLine(config_line=" no routing", parents=("interface lag 151 multi-chassis",)), + ConfigLine(config_line=" vlan trunk native 1", parents=("interface lag 151 multi-chassis",)), + ConfigLine(config_line=" vlan trunk allowed 1-2,4,7", parents=("interface lag 151 multi-chassis",)), + ConfigLine(config_line=" lacp mode active", parents=("interface lag 151 multi-chassis",)), + ConfigLine(config_line="interface lag 256", parents=()), + ConfigLine(config_line=" no shutdown", parents=("interface lag 256",)), + ConfigLine(config_line=" no routing", parents=("interface lag 256",)), + ConfigLine(config_line=" vlan trunk native 1 tag", parents=("interface lag 256",)), + ConfigLine(config_line=" vlan trunk allowed all", parents=("interface lag 256",)), + ConfigLine(config_line=" lacp mode active", parents=("interface lag 256",)), + ConfigLine(config_line="interface 1/1/1", parents=()), + ConfigLine(config_line=" no shutdown", parents=("interface 1/1/1",)), + ConfigLine(config_line=" mtu 9198", parents=("interface 1/1/1",)), + ConfigLine(config_line=" lag 1", parents=("interface 1/1/1",)), + ConfigLine(config_line="interface 1/1/3", parents=()), + ConfigLine(config_line=" no shutdown", parents=("interface 1/1/3",)), + ConfigLine(config_line=" mtu 9198", parents=("interface 1/1/3",)), + ConfigLine(config_line=" lag 3", parents=("interface 1/1/3",)), + ConfigLine(config_line="interface 1/1/5", parents=()), + ConfigLine(config_line=" no shutdown", parents=("interface 1/1/5",)), + ConfigLine(config_line=" mtu 9198", parents=("interface 1/1/5",)), + ConfigLine(config_line=" lag 5", parents=("interface 1/1/5",)), + ConfigLine(config_line="interface 1/1/7", parents=()), + ConfigLine(config_line=" no shutdown", parents=("interface 1/1/7",)), + ConfigLine(config_line=" mtu 9198", parents=("interface 1/1/7",)), + ConfigLine(config_line=" lag 7", parents=("interface 1/1/7",)), + ConfigLine(config_line="interface 1/1/8", parents=()), + ConfigLine(config_line=" no shutdown", parents=("interface 1/1/8",)), + ConfigLine(config_line=" mtu 9198", parents=("interface 1/1/8",)), + ConfigLine(config_line=" lag 8", parents=("interface 1/1/8",)), + ConfigLine(config_line="interface 1/1/9", parents=()), + ConfigLine(config_line=" no shutdown", parents=("interface 1/1/9",)), + ConfigLine(config_line=" mtu 9198", parents=("interface 1/1/9",)), + ConfigLine(config_line=" lag 9", parents=("interface 1/1/9",)), + ConfigLine(config_line="interface 1/1/10", parents=()), + ConfigLine(config_line=" no shutdown", parents=("interface 1/1/10",)), + ConfigLine(config_line=" mtu 9198", parents=("interface 1/1/10",)), + ConfigLine(config_line=" lag 10", parents=("interface 1/1/10",)), + ConfigLine(config_line="interface 1/1/11", parents=()), + ConfigLine(config_line=" no shutdown", parents=("interface 1/1/11",)), + ConfigLine(config_line=" mtu 9198", parents=("interface 1/1/11",)), + ConfigLine(config_line=" lag 11", parents=("interface 1/1/11",)), + ConfigLine(config_line="interface 1/1/12", parents=()), + ConfigLine(config_line=" no shutdown", parents=("interface 1/1/12",)), + ConfigLine(config_line=" mtu 9198", parents=("interface 1/1/12",)), + ConfigLine(config_line=" lag 12", parents=("interface 1/1/12",)), + ConfigLine(config_line="interface 1/1/13", parents=()), + ConfigLine(config_line=" no shutdown", parents=("interface 1/1/13",)), + ConfigLine(config_line=" mtu 9198", parents=("interface 1/1/13",)), + ConfigLine(config_line=" lag 13", parents=("interface 1/1/13",)), + ConfigLine(config_line="interface 1/1/14", parents=()), + ConfigLine(config_line=" no shutdown", parents=("interface 1/1/14",)), + ConfigLine(config_line=" mtu 9198", parents=("interface 1/1/14",)), + ConfigLine(config_line=" lag 14", parents=("interface 1/1/14",)), + ConfigLine(config_line="interface 1/1/15", parents=()), + ConfigLine(config_line=" no shutdown", parents=("interface 1/1/15",)), + ConfigLine(config_line=" mtu 9198", parents=("interface 1/1/15",)), + ConfigLine(config_line=" lag 15", parents=("interface 1/1/15",)), + ConfigLine(config_line="interface 1/1/16", parents=()), + ConfigLine(config_line=" no shutdown", parents=("interface 1/1/16",)), + ConfigLine(config_line=" mtu 9198", parents=("interface 1/1/16",)), + ConfigLine(config_line=" no routing", parents=("interface 1/1/16",)), + ConfigLine(config_line=" vlan access 2", parents=("interface 1/1/16",)), + ConfigLine(config_line=" spanning-tree bpdu-guard", parents=("interface 1/1/16",)), + ConfigLine(config_line=" spanning-tree port-type admin-edge", parents=("interface 1/1/16",)), + ConfigLine(config_line="interface 1/1/17", parents=()), + ConfigLine(config_line=" no shutdown", parents=("interface 1/1/17",)), + ConfigLine(config_line=" mtu 9198", parents=("interface 1/1/17",)), + ConfigLine(config_line=" lag 17", parents=("interface 1/1/17",)), + ConfigLine(config_line="interface 1/1/19", parents=()), + ConfigLine(config_line=" no shutdown", parents=("interface 1/1/19",)), + ConfigLine(config_line=" mtu 9198", parents=("interface 1/1/19",)), + ConfigLine(config_line=" lag 19", parents=("interface 1/1/19",)), + ConfigLine(config_line="interface 1/1/47", parents=()), + ConfigLine(config_line=" no shutdown", parents=("interface 1/1/47",)), + ConfigLine(config_line=" vrf attach keepalive", parents=("interface 1/1/47",)), + ConfigLine(config_line=" description VSX keepalive", parents=("interface 1/1/47",)), + ConfigLine(config_line=" ip address 192.168.200.0/31", parents=("interface 1/1/47",)), + ConfigLine(config_line="interface 1/1/48", parents=()), + ConfigLine(config_line=" no shutdown", parents=("interface 1/1/48",)), + ConfigLine(config_line=" mtu 9198", parents=("interface 1/1/48",)), + ConfigLine(config_line=" lag 151", parents=("interface 1/1/48",)), + ConfigLine(config_line="interface 1/1/51", parents=()), + ConfigLine(config_line=" no shutdown", parents=("interface 1/1/51",)), + ConfigLine(config_line=" mtu 9198", parents=("interface 1/1/51",)), + ConfigLine(config_line=" description vsx isl", parents=("interface 1/1/51",)), + ConfigLine(config_line=" lag 256", parents=("interface 1/1/51",)), + ConfigLine(config_line="interface 1/1/52", parents=()), + ConfigLine(config_line=" no shutdown", parents=("interface 1/1/52",)), + ConfigLine(config_line=" mtu 9198", parents=("interface 1/1/52",)), + ConfigLine(config_line=" description vsx isl", parents=("interface 1/1/52",)), + ConfigLine(config_line=" lag 256", parents=("interface 1/1/52",)), + ConfigLine(config_line="interface 1/1/55", parents=()), + ConfigLine(config_line=" no shutdown", parents=("interface 1/1/55",)), + ConfigLine(config_line=" vrf attach test", parents=("interface 1/1/55",)), + ConfigLine(config_line=" ip mtu 9198", parents=("interface 1/1/55",)), + ConfigLine(config_line=" ip address 192.168.10.5/31", parents=("interface 1/1/55",)), + ConfigLine(config_line=" ip ospf 2 area 0.0.0.0", parents=("interface 1/1/55",)), + ConfigLine(config_line=" ip ospf network point-to-point", parents=("interface 1/1/55",)), + ConfigLine(config_line="interface 1/1/56", parents=()), + ConfigLine(config_line=" no shutdown", parents=("interface 1/1/56",)), + ConfigLine(config_line=" vrf attach test", parents=("interface 1/1/56",)), + ConfigLine(config_line=" ip mtu 9198", parents=("interface 1/1/56",)), + ConfigLine(config_line=" ip address 192.168.10.1/31", parents=("interface 1/1/56",)), + ConfigLine(config_line=" ip ospf 2 area 0.0.0.0", parents=("interface 1/1/56",)), + ConfigLine(config_line=" ip ospf network point-to-point", parents=("interface 1/1/56",)), + ConfigLine(config_line="interface loopback 0", parents=()), + ConfigLine(config_line=" ip address 10.22.0.2/32", parents=("interface loopback 0",)), + ConfigLine(config_line=" ip ospf 1 area 0.0.0.0", parents=("interface loopback 0",)), + ConfigLine(config_line="interface vlan 1", parents=()), + ConfigLine(config_line=" ip mtu 9198", parents=("interface vlan 1",)), + ConfigLine(config_line=" ip address 10.1.0.2/16", parents=("interface vlan 1",)), + ConfigLine(config_line=" active-gateway ip mac 12:00:00:00:6b:00", parents=("interface vlan 1",)), + ConfigLine(config_line=" active-gateway ip 10.1.0.1", parents=("interface vlan 1",)), + ConfigLine(config_line=" ip helper-address 10.50.100.222", parents=("interface vlan 1",)), + ConfigLine(config_line=" ip ospf 1 area 0.0.0.0", parents=("interface vlan 1",)), + ConfigLine(config_line=" ip ospf passive", parents=("interface vlan 1",)), + ConfigLine(config_line="interface vlan 2", parents=()), + ConfigLine(config_line=" ip mtu 9198", parents=("interface vlan 2",)), + ConfigLine(config_line=" ip address 10.20.0.2/17", parents=("interface vlan 2",)), + ConfigLine(config_line=" active-gateway ip mac 12:00:00:00:6b:00", parents=("interface vlan 2",)), + ConfigLine(config_line=" active-gateway ip 10.20.0.1", parents=("interface vlan 2",)), + ConfigLine(config_line=" ip helper-address 10.50.100.222", parents=("interface vlan 2",)), + ConfigLine(config_line=" ip ospf 1 area 0.0.0.0", parents=("interface vlan 2",)), + ConfigLine(config_line="interface vlan 400", parents=()), + ConfigLine(config_line=" ip mtu 9198", parents=("interface vlan 400",)), + ConfigLine(config_line=" ip address 10.40.0.2/17", parents=("interface vlan 400",)), + ConfigLine(config_line=" active-gateway ip mac 12:00:00:00:6b:00", parents=("interface vlan 400",)), + ConfigLine(config_line=" active-gateway ip 10.40.0.1", parents=("interface vlan 400",)), + ConfigLine(config_line=" ip helper-address 10.30.100.222", parents=("interface vlan 400",)), + ConfigLine(config_line=" ip ospf 1 area 0.0.0.0", parents=("interface vlan 400",)), + ConfigLine(config_line=" ip ospf passive", parents=("interface vlan 400",)), + ConfigLine(config_line="interface vlan 15", parents=()), + ConfigLine(config_line=" vrf attach test", parents=("interface vlan 15",)), + ConfigLine(config_line=" ip mtu 9198", parents=("interface vlan 15",)), + ConfigLine(config_line=" ip address 10.10.0.130/26", parents=("interface vlan 15",)), + ConfigLine(config_line=" active-gateway ip mac 12:00:00:00:6b:00", parents=("interface vlan 15",)), + ConfigLine(config_line=" active-gateway ip 10.10.0.129", parents=("interface vlan 15",)), + ConfigLine(config_line=" ip ospf 2 area 0.0.0.0", parents=("interface vlan 15",)), + ConfigLine(config_line="interface vlan 69", parents=()), + ConfigLine(config_line=" vrf attach test", parents=("interface vlan 69",)), + ConfigLine(config_line=" ip mtu 9198", parents=("interface vlan 69",)), + ConfigLine(config_line=" ip address 10.10.0.2/25", parents=("interface vlan 69",)), + ConfigLine(config_line=" active-gateway ip mac 12:00:00:00:6b:00", parents=("interface vlan 69",)), + ConfigLine(config_line=" active-gateway ip 10.10.0.1", parents=("interface vlan 69",)), + ConfigLine(config_line=" ip ospf 2 area 0.0.0.0", parents=("interface vlan 69",)), + ConfigLine(config_line="vsx", parents=()), + ConfigLine(config_line=" system-mac 02:00:00:00:01:00", parents=("vsx",)), + ConfigLine(config_line=" inter-switch-link lag 256", parents=("vsx",)), + ConfigLine(config_line=" role primary", parents=("vsx",)), + ConfigLine(config_line=" keepalive peer 192.168.200.1 source 192.168.200.0 vrf keepalive", parents=("vsx",)), + ConfigLine(config_line=" linkup-delay-timer 600", parents=("vsx",)), + ConfigLine(config_line=" vsx-sync vsx-global", parents=("vsx",)), + ConfigLine(config_line="snmp-server vrf default", parents=()), + ConfigLine( + config_line="snmpv3 user testuser auth md5 auth-pass ciphertext xxxxx priv des priv-pass ciphertext xxxxx", + parents=(), + ), + ConfigLine(config_line="ip dns server-address 10.50.100.225", parents=()), + ConfigLine(config_line="ip prefix-list pl-test-01 seq 20 permit 10.10.0.128/26 ge 26", parents=()), + ConfigLine(config_line="ip prefix-list pl-cmn seq 10 permit 10.10.0.0/25 ge 25", parents=()), + ConfigLine(config_line="ip prefix-list pl-test-02 seq 30 permit 10.30.100.0/24 ge 24", parents=()), + ConfigLine(config_line="ip prefix-list pl-test-03 seq 40 permit 10.50.100.0/24 ge 24", parents=()), + ConfigLine(config_line="ip prefix-list pl-test-04 seq 10 permit 10.50.100.60/32 ge 32 le 32", parents=()), + ConfigLine(config_line="ip prefix-list pl-test-04 seq 20 permit 10.30.100.60/32 ge 32 le 32", parents=()), + ConfigLine(config_line="route-map test-01 permit seq 10", parents=()), + ConfigLine( + config_line=" match ip address prefix-list pl-test-04", parents=("route-map test-01 permit seq 10",) + ), + ConfigLine(config_line=" match ip next-hop 10.20.1.7", parents=("route-map test-01 permit seq 10",)), + ConfigLine(config_line=" set local-preference 1000", parents=("route-map test-01 permit seq 10",)), + ConfigLine(config_line="route-map test-01 permit seq 20", parents=()), + ConfigLine( + config_line=" match ip address prefix-list pl-test-04", parents=("route-map test-01 permit seq 20",) + ), + ConfigLine(config_line=" match ip next-hop 10.20.1.8", parents=("route-map test-01 permit seq 20",)), + ConfigLine(config_line=" set local-preference 1100", parents=("route-map test-01 permit seq 20",)), + ConfigLine(config_line="route-map test-01 permit seq 30", parents=()), + ConfigLine( + config_line=" match ip address prefix-list pl-test-04", parents=("route-map test-01 permit seq 30",) + ), + ConfigLine(config_line=" match ip next-hop 10.20.1.9", parents=("route-map test-01 permit seq 30",)), + ConfigLine(config_line=" set local-preference 1200", parents=("route-map test-01 permit seq 30",)), + ConfigLine(config_line="route-map test-01 permit seq 40", parents=()), + ConfigLine( + config_line=" match ip address prefix-list pl-test-02", parents=("route-map test-01 permit seq 40",) + ), + ConfigLine(config_line=" set ip next-hop 10.40.1.14", parents=("route-map test-01 permit seq 40",)), + ConfigLine(config_line="route-map test-01 permit seq 50", parents=()), + ConfigLine( + config_line=" match ip address prefix-list pl-test-03", parents=("route-map test-01 permit seq 50",) + ), + ConfigLine(config_line=" set ip next-hop 10.20.1.9", parents=("route-map test-01 permit seq 50",)), + ConfigLine(config_line="route-map test-01-test permit seq 10", parents=()), + ConfigLine( + config_line=" match ip address prefix-list pl-test-01", parents=("route-map test-01-test permit seq 10",) + ), + ConfigLine(config_line=" set ip next-hop 10.10.0.138", parents=("route-map test-01-test permit seq 10",)), + ConfigLine(config_line="route-map test-01-test permit seq 20", parents=()), + ConfigLine( + config_line=" match ip address prefix-list pl-cmn", parents=("route-map test-01-test permit seq 20",) + ), + ConfigLine(config_line="route-map test-02 permit seq 10", parents=()), + ConfigLine( + config_line=" match ip address prefix-list pl-test-04", parents=("route-map test-02 permit seq 10",) + ), + ConfigLine(config_line=" match ip next-hop 10.20.1.7", parents=("route-map test-02 permit seq 10",)), + ConfigLine(config_line=" set local-preference 1000", parents=("route-map test-02 permit seq 10",)), + ConfigLine(config_line="route-map test-02 permit seq 20", parents=()), + ConfigLine( + config_line=" match ip address prefix-list pl-test-04", parents=("route-map test-02 permit seq 20",) + ), + ConfigLine(config_line=" match ip next-hop 10.20.1.8", parents=("route-map test-02 permit seq 20",)), + ConfigLine(config_line=" set local-preference 1100", parents=("route-map test-02 permit seq 20",)), + ConfigLine(config_line="route-map test-02 permit seq 30", parents=()), + ConfigLine( + config_line=" match ip address prefix-list pl-test-04", parents=("route-map test-02 permit seq 30",) + ), + ConfigLine(config_line=" match ip next-hop 10.20.1.9", parents=("route-map test-02 permit seq 30",)), + ConfigLine(config_line=" set local-preference 1200", parents=("route-map test-02 permit seq 30",)), + ConfigLine(config_line="route-map test-02 permit seq 40", parents=()), + ConfigLine( + config_line=" match ip address prefix-list pl-test-02", parents=("route-map test-02 permit seq 40",) + ), + ConfigLine(config_line=" set ip next-hop 10.40.1.12", parents=("route-map test-02 permit seq 40",)), + ConfigLine(config_line="route-map test-02 permit seq 50", parents=()), + ConfigLine( + config_line=" match ip address prefix-list pl-test-03", parents=("route-map test-02 permit seq 50",) + ), + ConfigLine(config_line=" set ip next-hop 10.20.1.8", parents=("route-map test-02 permit seq 50",)), + ConfigLine(config_line="route-map test-02-test permit seq 10", parents=()), + ConfigLine( + config_line=" match ip address prefix-list pl-test-01", parents=("route-map test-02-test permit seq 10",) + ), + ConfigLine(config_line=" set ip next-hop 10.10.0.137", parents=("route-map test-02-test permit seq 10",)), + ConfigLine(config_line="route-map test-02-test permit seq 20", parents=()), + ConfigLine( + config_line=" match ip address prefix-list pl-cmn", parents=("route-map test-02-test permit seq 20",) + ), + ConfigLine(config_line="route-map test-03 permit seq 10", parents=()), + ConfigLine( + config_line=" match ip address prefix-list pl-test-04", parents=("route-map test-03 permit seq 10",) + ), + ConfigLine(config_line=" match ip next-hop 10.20.1.7", parents=("route-map test-03 permit seq 10",)), + ConfigLine(config_line=" set local-preference 1000", parents=("route-map test-03 permit seq 10",)), + ConfigLine(config_line="route-map test-03 permit seq 20", parents=()), + ConfigLine( + config_line=" match ip address prefix-list pl-test-04", parents=("route-map test-03 permit seq 20",) + ), + ConfigLine(config_line=" match ip next-hop 10.20.1.8", parents=("route-map test-03 permit seq 20",)), + ConfigLine(config_line=" set local-preference 1100", parents=("route-map test-03 permit seq 20",)), + ConfigLine(config_line="route-map test-03 permit seq 30", parents=()), + ConfigLine( + config_line=" match ip address prefix-list pl-test-04", parents=("route-map test-03 permit seq 30",) + ), + ConfigLine(config_line=" match ip next-hop 10.20.1.9", parents=("route-map test-03 permit seq 30",)), + ConfigLine(config_line=" set local-preference 1200", parents=("route-map test-03 permit seq 30",)), + ConfigLine(config_line="route-map test-03 permit seq 40", parents=()), + ConfigLine( + config_line=" match ip address prefix-list pl-test-02", parents=("route-map test-03 permit seq 40",) + ), + ConfigLine(config_line=" set ip next-hop 10.40.1.10", parents=("route-map test-03 permit seq 40",)), + ConfigLine(config_line="route-map test-03 permit seq 50", parents=()), + ConfigLine( + config_line=" match ip address prefix-list pl-test-03", parents=("route-map test-03 permit seq 50",) + ), + ConfigLine(config_line=" set ip next-hop 10.20.1.7", parents=("route-map test-03 permit seq 50",)), + ConfigLine(config_line="route-map test-03-test permit seq 10", parents=()), + ConfigLine( + config_line=" match ip address prefix-list pl-test-01", parents=("route-map test-03-test permit seq 10",) + ), + ConfigLine(config_line=" set ip next-hop 10.10.0.136", parents=("route-map test-03-test permit seq 10",)), + ConfigLine(config_line="route-map test-03-test permit seq 20", parents=()), + ConfigLine( + config_line=" match ip address prefix-list pl-cmn", parents=("route-map test-03-test permit seq 20",) + ), + ConfigLine(config_line="router ospf 2 vrf test", parents=()), + ConfigLine(config_line=" router-id 10.22.0.2", parents=("router ospf 2 vrf test",)), + ConfigLine(config_line=" default-information originate", parents=("router ospf 2 vrf test",)), + ConfigLine(config_line=" area 0.0.0.0", parents=("router ospf 2 vrf test",)), + ConfigLine(config_line="router ospf 1", parents=()), + ConfigLine(config_line=" router-id 10.22.0.2", parents=("router ospf 1",)), + ConfigLine(config_line=" redistribute bgp", parents=("router ospf 1",)), + ConfigLine(config_line=" area 0.0.0.0", parents=("router ospf 1",)), + ConfigLine(config_line="router bgp 65533", parents=()), + ConfigLine(config_line=" bgp router-id 10.22.0.2", parents=("router bgp 65533",)), + ConfigLine(config_line=" maximum-paths 8", parents=("router bgp 65533",)), + ConfigLine(config_line=" timers bgp 1 3", parents=("router bgp 65533",)), + ConfigLine(config_line=" distance bgp 20 70", parents=("router bgp 65533",)), + ConfigLine(config_line=" neighbor 10.20.0.3 remote-as 65533", parents=("router bgp 65533",)), + ConfigLine(config_line=" neighbor 10.20.1.7 remote-as 65533", parents=("router bgp 65533",)), + ConfigLine(config_line=" neighbor 10.20.1.7 passive", parents=("router bgp 65533",)), + ConfigLine(config_line=" neighbor 10.20.1.8 remote-as 65533", parents=("router bgp 65533",)), + ConfigLine(config_line=" neighbor 10.20.1.8 passive", parents=("router bgp 65533",)), + ConfigLine(config_line=" neighbor 10.20.1.9 remote-as 65533", parents=("router bgp 65533",)), + ConfigLine(config_line=" neighbor 10.20.1.9 passive", parents=("router bgp 65533",)), + ConfigLine(config_line=" address-family ipv4 unicast", parents=("router bgp 65533",)), + ConfigLine( + config_line=" neighbor 10.20.0.3 activate", + parents=("router bgp 65533", " address-family ipv4 unicast"), + ), + ConfigLine( + config_line=" neighbor 10.20.1.7 activate", + parents=("router bgp 65533", " address-family ipv4 unicast"), + ), + ConfigLine( + config_line=" neighbor 10.20.1.7 route-map test-03 in", + parents=("router bgp 65533", " address-family ipv4 unicast"), + ), + ConfigLine( + config_line=" neighbor 10.20.1.8 activate", + parents=("router bgp 65533", " address-family ipv4 unicast"), + ), + ConfigLine( + config_line=" neighbor 10.20.1.8 route-map test-02 in", + parents=("router bgp 65533", " address-family ipv4 unicast"), + ), + ConfigLine( + config_line=" neighbor 10.20.1.9 activate", + parents=("router bgp 65533", " address-family ipv4 unicast"), + ), + ConfigLine( + config_line=" neighbor 10.20.1.9 route-map test-01 in", + parents=("router bgp 65533", " address-family ipv4 unicast"), + ), + ConfigLine(config_line=" exit-address-family", parents=("router bgp 65533",)), + ConfigLine(config_line=" vrf test", parents=("router bgp 65533",)), + ConfigLine(config_line=" bgp router-id 10.22.0.2", parents=("router bgp 65533", " vrf test")), + ConfigLine(config_line=" maximum-paths 8", parents=("router bgp 65533", " vrf test")), + ConfigLine(config_line=" timers bgp 1 3", parents=("router bgp 65533", " vrf test")), + ConfigLine(config_line=" distance bgp 20 70", parents=("router bgp 65533", " vrf test")), + ConfigLine(config_line=" neighbor 10.10.0.3 remote-as 65533", parents=("router bgp 65533", " vrf test")), + ConfigLine(config_line=" neighbor 10.10.0.22 remote-as 65532", parents=("router bgp 65533", " vrf test")), + ConfigLine(config_line=" neighbor 10.10.0.22 passive", parents=("router bgp 65533", " vrf test")), + ConfigLine(config_line=" neighbor 10.10.0.23 remote-as 65532", parents=("router bgp 65533", " vrf test")), + ConfigLine(config_line=" neighbor 10.10.0.23 passive", parents=("router bgp 65533", " vrf test")), + ConfigLine(config_line=" neighbor 10.10.0.24 remote-as 65532", parents=("router bgp 65533", " vrf test")), + ConfigLine(config_line=" neighbor 10.10.0.24 passive", parents=("router bgp 65533", " vrf test")), + ConfigLine(config_line=" address-family ipv4 unicast", parents=("router bgp 65533", " vrf test")), + ConfigLine( + config_line=" neighbor 10.10.0.3 activate", + parents=("router bgp 65533", " vrf test", " address-family ipv4 unicast"), + ), + ConfigLine( + config_line=" neighbor 10.10.0.22 activate", + parents=("router bgp 65533", " vrf test", " address-family ipv4 unicast"), + ), + ConfigLine( + config_line=" neighbor 10.10.0.22 route-map test-03-test in", + parents=("router bgp 65533", " vrf test", " address-family ipv4 unicast"), + ), + ConfigLine( + config_line=" neighbor 10.10.0.23 activate", + parents=("router bgp 65533", " vrf test", " address-family ipv4 unicast"), + ), + ConfigLine( + config_line=" neighbor 10.10.0.23 route-map test-02-test in", + parents=("router bgp 65533", " vrf test", " address-family ipv4 unicast"), + ), + ConfigLine( + config_line=" neighbor 10.10.0.24 activate", + parents=("router bgp 65533", " vrf test", " address-family ipv4 unicast"), + ), + ConfigLine( + config_line=" neighbor 10.10.0.24 route-map test-01-test in", + parents=("router bgp 65533", " vrf test", " address-family ipv4 unicast"), + ), + ConfigLine(config_line=" exit-address-family", parents=("router bgp 65533", " vrf test")), + ConfigLine(config_line="https-server vrf test", parents=()), + ConfigLine(config_line="https-server vrf default", parents=()), + ConfigLine(config_line="https-server vrf mgmt", parents=()), +] diff --git a/tests/unit/mock/config/parser/aruba_aoscx/aoscx_full_sent.txt b/tests/unit/mock/config/parser/aruba_aoscx/aoscx_full_sent.txt new file mode 100644 index 00000000..46609ee4 --- /dev/null +++ b/tests/unit/mock/config/parser/aruba_aoscx/aoscx_full_sent.txt @@ -0,0 +1,490 @@ +Current configuration: +! +!Version ArubaOS-CX GL.10.09.0010 +!export-password: default +hostname spine-01 +banner motd ! +############################################################################### +This is a test banner +############################################################################### +! +banner exec ! +############################################################################### +This is a test banner +############################################################################### +! +user admin group administrators password ciphertext xxxxx +no ip icmp redirect +profile leaf +vrf test +vrf keepalive +ntp server 10.20.1.7 +ntp server 10.20.1.8 +ntp server 10.20.1.9 +ntp enable +! +! +! +! +! +ssh server vrf test +ssh server vrf default +ssh server vrf keepalive +ssh server vrf mgmt +access-list ip test + 10 deny any 10.10.0.0/255.255.255.128 10.10.0.128/255.255.255.192 + 20 deny any 10.10.0.128/255.255.255.192 10.10.0.0/255.255.255.128 + 30 permit any any any +access-list ip mgmt + 10 comment ALLOW SSH, HTTPS, AND SNMP ON HMN SUBNET and CMN + 20 permit tcp 10.40.0.0/255.255.128.0 any eq ssh + 30 permit tcp 10.40.0.0/255.255.128.0 any eq https + 40 permit udp 10.40.0.0/255.255.128.0 any eq snmp + 50 permit udp 10.40.0.0/255.255.128.0 any eq snmp-trap + 60 permit tcp 10.10.0.0/255.255.255.128 any eq ssh + 70 permit tcp 10.10.0.0/255.255.255.128 any eq https + 80 permit udp 10.10.0.0/255.255.255.128 any eq snmp + 90 permit udp 10.10.0.0/255.255.255.128 any eq snmp-trap + 100 comment ALLOW SNMP FROM HMN METALLB SUBNET + 110 permit udp 10.30.100.0/255.255.255.0 any eq snmp + 120 permit udp 10.30.100.0/255.255.255.0 any eq snmp-trap + 130 comment BLOCK SSH, HTTPS, AND SNMP FROM EVERYWHERE ELSE + 140 deny tcp any any eq ssh + 150 deny tcp any any eq https + 160 deny udp any any eq snmp + 170 deny udp any any eq snmp-trap + 180 comment ALLOW ANYTHING ELSE + 190 permit any any any +access-list ip nmn-hmn + 10 deny any 10.20.0.0/255.255.128.0 10.40.0.0/255.255.128.0 + 20 deny any 10.40.0.0/255.255.128.0 10.20.0.0/255.255.128.0 + 30 permit any any any +apply access-list ip mgmt control-plane vrf default +vlan 1 +vlan 2 + name test_vlan + apply access-list ip nmn-hmn in + apply access-list ip nmn-hmn out +vlan 400 + name HMN + apply access-list ip nmn-hmn in + apply access-list ip nmn-hmn out +vlan 15 + name CAN +vlan 69 + name CMN +vlan 10 + name SUN +spanning-tree +spanning-tree priority 0 +spanning-tree forward-delay 4 +spanning-tree config-name MST0 +spanning-tree config-revision 1 +interface mgmt + shutdown + ip dhcp +interface lag 1 multi-chassis + no shutdown + no routing + vlan trunk native 1 + vlan trunk allowed 1-2,4,6-7 + lacp mode active + lacp fallback + spanning-tree port-type admin-edge +interface lag 3 multi-chassis + no shutdown + no routing + vlan trunk native 1 + vlan trunk allowed 1-2,4,6-7 + lacp mode active + lacp fallback + spanning-tree port-type admin-edge +interface lag 5 multi-chassis + no shutdown + no routing + vlan trunk native 1 + vlan trunk allowed 1-2,4,6-7 + lacp mode active + lacp fallback + spanning-tree port-type admin-edge +interface lag 7 multi-chassis + no shutdown + no routing + vlan trunk native 1 + vlan trunk allowed 1-2,4,6-7 + lacp mode active + lacp fallback + spanning-tree port-type admin-edge +interface lag 8 multi-chassis + no shutdown + no routing + vlan trunk native 1 + vlan trunk allowed 1-2,4,6-7 + lacp mode active + lacp fallback + spanning-tree port-type admin-edge +interface lag 9 multi-chassis + no shutdown + no routing + vlan trunk native 1 + vlan trunk allowed 1-2,4,6-7 + lacp mode active + lacp fallback + spanning-tree port-type admin-edge +interface lag 10 multi-chassis + no shutdown + no routing + vlan trunk native 1 + vlan trunk allowed 10 + lacp mode active + lacp fallback + spanning-tree port-type admin-edge +interface lag 11 multi-chassis + no shutdown + no routing + vlan trunk native 1 + vlan trunk allowed 1-2,4,6-7 + lacp mode active + lacp fallback + spanning-tree port-type admin-edge +interface lag 12 multi-chassis + no shutdown + no routing + vlan trunk native 1 + vlan trunk allowed 10 + lacp mode active + lacp fallback + spanning-tree port-type admin-edge +interface lag 13 multi-chassis + no shutdown + no routing + vlan trunk native 1 + vlan trunk allowed 1-2,4,6-7 + lacp mode active + lacp fallback + spanning-tree port-type admin-edge +interface lag 14 multi-chassis + no shutdown + no routing + vlan trunk native 1 + vlan trunk allowed 10 + lacp mode active + lacp fallback + spanning-tree port-type admin-edge +interface lag 15 multi-chassis + no shutdown + no routing + vlan trunk native 1 + vlan trunk allowed 1-2,4,6-7 + lacp mode active + lacp fallback + spanning-tree port-type admin-edge +interface lag 17 multi-chassis + no shutdown + no routing + vlan trunk native 1 + vlan trunk allowed 6-7 + lacp mode active + lacp fallback + spanning-tree port-type admin-edge +interface lag 19 multi-chassis + no shutdown + no routing + vlan trunk native 1 + vlan trunk allowed 1-2,4,6-7 + lacp mode active + lacp fallback + spanning-tree port-type admin-edge +interface lag 151 multi-chassis + no shutdown + no routing + vlan trunk native 1 + vlan trunk allowed 1-2,4,7 + lacp mode active +interface lag 256 + no shutdown + no routing + vlan trunk native 1 tag + vlan trunk allowed all + lacp mode active +interface 1/1/1 + no shutdown + mtu 9198 + lag 1 +interface 1/1/3 + no shutdown + mtu 9198 + lag 3 +interface 1/1/5 + no shutdown + mtu 9198 + lag 5 +interface 1/1/7 + no shutdown + mtu 9198 + lag 7 +interface 1/1/8 + no shutdown + mtu 9198 + lag 8 +interface 1/1/9 + no shutdown + mtu 9198 + lag 9 +interface 1/1/10 + no shutdown + mtu 9198 + lag 10 +interface 1/1/11 + no shutdown + mtu 9198 + lag 11 +interface 1/1/12 + no shutdown + mtu 9198 + lag 12 +interface 1/1/13 + no shutdown + mtu 9198 + lag 13 +interface 1/1/14 + no shutdown + mtu 9198 + lag 14 +interface 1/1/15 + no shutdown + mtu 9198 + lag 15 +interface 1/1/16 + no shutdown + mtu 9198 + no routing + vlan access 2 + spanning-tree bpdu-guard + spanning-tree port-type admin-edge +interface 1/1/17 + no shutdown + mtu 9198 + lag 17 +interface 1/1/19 + no shutdown + mtu 9198 + lag 19 +interface 1/1/47 + no shutdown + vrf attach keepalive + description VSX keepalive + ip address 192.168.200.0/31 +interface 1/1/48 + no shutdown + mtu 9198 + lag 151 +interface 1/1/51 + no shutdown + mtu 9198 + description vsx isl + lag 256 +interface 1/1/52 + no shutdown + mtu 9198 + description vsx isl + lag 256 +interface 1/1/55 + no shutdown + vrf attach test + ip mtu 9198 + ip address 192.168.10.5/31 + ip ospf 2 area 0.0.0.0 + ip ospf network point-to-point +interface 1/1/56 + no shutdown + vrf attach test + ip mtu 9198 + ip address 192.168.10.1/31 + ip ospf 2 area 0.0.0.0 + ip ospf network point-to-point +interface loopback 0 + ip address 10.22.0.2/32 + ip ospf 1 area 0.0.0.0 +interface vlan 1 + ip mtu 9198 + ip address 10.1.0.2/16 + active-gateway ip mac 12:00:00:00:6b:00 + active-gateway ip 10.1.0.1 + ip helper-address 10.50.100.222 + ip ospf 1 area 0.0.0.0 + ip ospf passive +interface vlan 2 + ip mtu 9198 + ip address 10.20.0.2/17 + active-gateway ip mac 12:00:00:00:6b:00 + active-gateway ip 10.20.0.1 + ip helper-address 10.50.100.222 + ip ospf 1 area 0.0.0.0 +interface vlan 400 + ip mtu 9198 + ip address 10.40.0.2/17 + active-gateway ip mac 12:00:00:00:6b:00 + active-gateway ip 10.40.0.1 + ip helper-address 10.30.100.222 + ip ospf 1 area 0.0.0.0 + ip ospf passive +interface vlan 15 + vrf attach test + ip mtu 9198 + ip address 10.10.0.130/26 + active-gateway ip mac 12:00:00:00:6b:00 + active-gateway ip 10.10.0.129 + ip ospf 2 area 0.0.0.0 +interface vlan 69 + vrf attach test + ip mtu 9198 + ip address 10.10.0.2/25 + active-gateway ip mac 12:00:00:00:6b:00 + active-gateway ip 10.10.0.1 + ip ospf 2 area 0.0.0.0 +vsx + system-mac 02:00:00:00:01:00 + inter-switch-link lag 256 + role primary + keepalive peer 192.168.200.1 source 192.168.200.0 vrf keepalive + linkup-delay-timer 600 + vsx-sync vsx-global +snmp-server vrf default +snmpv3 user testuser auth md5 auth-pass ciphertext xxxxx priv des priv-pass ciphertext xxxxx +ip dns server-address 10.50.100.225 +ip prefix-list pl-test-01 seq 20 permit 10.10.0.128/26 ge 26 +ip prefix-list pl-cmn seq 10 permit 10.10.0.0/25 ge 25 +ip prefix-list pl-test-02 seq 30 permit 10.30.100.0/24 ge 24 +ip prefix-list pl-test-03 seq 40 permit 10.50.100.0/24 ge 24 +ip prefix-list pl-test-04 seq 10 permit 10.50.100.60/32 ge 32 le 32 +ip prefix-list pl-test-04 seq 20 permit 10.30.100.60/32 ge 32 le 32 +! +! +! +! +route-map test-01 permit seq 10 + match ip address prefix-list pl-test-04 + match ip next-hop 10.20.1.7 + set local-preference 1000 +route-map test-01 permit seq 20 + match ip address prefix-list pl-test-04 + match ip next-hop 10.20.1.8 + set local-preference 1100 +route-map test-01 permit seq 30 + match ip address prefix-list pl-test-04 + match ip next-hop 10.20.1.9 + set local-preference 1200 +route-map test-01 permit seq 40 + match ip address prefix-list pl-test-02 + set ip next-hop 10.40.1.14 +route-map test-01 permit seq 50 + match ip address prefix-list pl-test-03 + set ip next-hop 10.20.1.9 +route-map test-01-test permit seq 10 + match ip address prefix-list pl-test-01 + set ip next-hop 10.10.0.138 +route-map test-01-test permit seq 20 + match ip address prefix-list pl-cmn +route-map test-02 permit seq 10 + match ip address prefix-list pl-test-04 + match ip next-hop 10.20.1.7 + set local-preference 1000 +route-map test-02 permit seq 20 + match ip address prefix-list pl-test-04 + match ip next-hop 10.20.1.8 + set local-preference 1100 +route-map test-02 permit seq 30 + match ip address prefix-list pl-test-04 + match ip next-hop 10.20.1.9 + set local-preference 1200 +route-map test-02 permit seq 40 + match ip address prefix-list pl-test-02 + set ip next-hop 10.40.1.12 +route-map test-02 permit seq 50 + match ip address prefix-list pl-test-03 + set ip next-hop 10.20.1.8 +route-map test-02-test permit seq 10 + match ip address prefix-list pl-test-01 + set ip next-hop 10.10.0.137 +route-map test-02-test permit seq 20 + match ip address prefix-list pl-cmn +route-map test-03 permit seq 10 + match ip address prefix-list pl-test-04 + match ip next-hop 10.20.1.7 + set local-preference 1000 +route-map test-03 permit seq 20 + match ip address prefix-list pl-test-04 + match ip next-hop 10.20.1.8 + set local-preference 1100 +route-map test-03 permit seq 30 + match ip address prefix-list pl-test-04 + match ip next-hop 10.20.1.9 + set local-preference 1200 +route-map test-03 permit seq 40 + match ip address prefix-list pl-test-02 + set ip next-hop 10.40.1.10 +route-map test-03 permit seq 50 + match ip address prefix-list pl-test-03 + set ip next-hop 10.20.1.7 +route-map test-03-test permit seq 10 + match ip address prefix-list pl-test-01 + set ip next-hop 10.10.0.136 +route-map test-03-test permit seq 20 + match ip address prefix-list pl-cmn +! +router ospf 2 vrf test + router-id 10.22.0.2 + default-information originate + area 0.0.0.0 +router ospf 1 + router-id 10.22.0.2 + redistribute bgp + area 0.0.0.0 +router bgp 65533 + bgp router-id 10.22.0.2 + maximum-paths 8 + timers bgp 1 3 + distance bgp 20 70 + neighbor 10.20.0.3 remote-as 65533 + neighbor 10.20.1.7 remote-as 65533 + neighbor 10.20.1.7 passive + neighbor 10.20.1.8 remote-as 65533 + neighbor 10.20.1.8 passive + neighbor 10.20.1.9 remote-as 65533 + neighbor 10.20.1.9 passive + address-family ipv4 unicast + neighbor 10.20.0.3 activate + neighbor 10.20.1.7 activate + neighbor 10.20.1.7 route-map test-03 in + neighbor 10.20.1.8 activate + neighbor 10.20.1.8 route-map test-02 in + neighbor 10.20.1.9 activate + neighbor 10.20.1.9 route-map test-01 in + exit-address-family +! + vrf test + bgp router-id 10.22.0.2 + maximum-paths 8 + timers bgp 1 3 + distance bgp 20 70 + neighbor 10.10.0.3 remote-as 65533 + neighbor 10.10.0.22 remote-as 65532 + neighbor 10.10.0.22 passive + neighbor 10.10.0.23 remote-as 65532 + neighbor 10.10.0.23 passive + neighbor 10.10.0.24 remote-as 65532 + neighbor 10.10.0.24 passive + address-family ipv4 unicast + neighbor 10.10.0.3 activate + neighbor 10.10.0.22 activate + neighbor 10.10.0.22 route-map test-03-test in + neighbor 10.10.0.23 activate + neighbor 10.10.0.23 route-map test-02-test in + neighbor 10.10.0.24 activate + neighbor 10.10.0.24 route-map test-01-test in + exit-address-family +! +https-server vrf test +https-server vrf default +https-server vrf mgmt \ No newline at end of file From b94858c72bdd35b4feae9afb5fff67fdb520e90f Mon Sep 17 00:00:00 2001 From: lukebates123 Date: Mon, 14 Nov 2022 10:32:07 -0600 Subject: [PATCH 2/8] fix config parsing --- netutils/config/parser.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/netutils/config/parser.py b/netutils/config/parser.py index aeb908a5..ff0fc6b2 100644 --- a/netutils/config/parser.py +++ b/netutils/config/parser.py @@ -1246,7 +1246,7 @@ def _parse_out_comments(self, config: str) -> str: banner = re.findall(pattern, config, re.MULTILINE) config = re.sub(pattern, "", config, flags=re.MULTILINE) for line in config.splitlines(): - if line and not self.is_comment(line) and not line.lstrip().startswith("Current configuration:"): + if line and not self.is_comment(line): config_lines.append(line.rstrip()) if line.lstrip().startswith("hostname"): for banner_line in banner: From 794ad9b2a611a80de357f343f08b097451c2bf81 Mon Sep 17 00:00:00 2001 From: lukebates123 Date: Mon, 14 Nov 2022 10:36:23 -0600 Subject: [PATCH 3/8] remove unneeded line --- netutils/config/parser.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/netutils/config/parser.py b/netutils/config/parser.py index ff0fc6b2..b497b28e 100644 --- a/netutils/config/parser.py +++ b/netutils/config/parser.py @@ -1266,6 +1266,5 @@ def config_lines_only(self) -> str: for line in self.config.splitlines(): if line and not line.isspace(): config_lines.append(line.rstrip()) - self._config = "\n".join(config_lines) - self._config = self._parse_out_comments(self._config) + self._config = self._parse_out_comments("\n".join(config_lines)) return self._config From 7445ca38c25b58c58cc63eeb312b81378f792d4f Mon Sep 17 00:00:00 2001 From: lukebates123 Date: Mon, 14 Nov 2022 11:39:47 -0600 Subject: [PATCH 4/8] add scrapli lookup mapper --- docs/user/lib_mapper/scrapli.md | 1 + docs/user/lib_mapper/scrapli_reverse.md | 1 + 2 files changed, 2 insertions(+) diff --git a/docs/user/lib_mapper/scrapli.md b/docs/user/lib_mapper/scrapli.md index 5e9602c1..ad20c276 100644 --- a/docs/user/lib_mapper/scrapli.md +++ b/docs/user/lib_mapper/scrapli.md @@ -1,5 +1,6 @@ | NORMALIZED | | SCRAPLI | | ---------- | -- | ------ | +| aruba_aoscx | → | aruba_aoscx | | arista_eos | → | arista_eos | | cisco_iosxe | → | cisco_ios | | cisco_iosxr | → | cisco_xr | diff --git a/docs/user/lib_mapper/scrapli_reverse.md b/docs/user/lib_mapper/scrapli_reverse.md index ae98d43f..46fc1294 100644 --- a/docs/user/lib_mapper/scrapli_reverse.md +++ b/docs/user/lib_mapper/scrapli_reverse.md @@ -1,5 +1,6 @@ | SCRAPLI | | NORMALIZED | | ---------- | -- | ------ | +| aruba_aoscx | → | aruba_aoscx | | arista_eos | → | arista_eos | | cisco_ios | → | cisco_iosxe | | cisco_nxos | → | cisco_nxos | From 5e1530c9d83dda0724f59238dbd7c6a085c467c3 Mon Sep 17 00:00:00 2001 From: lukebates123 Date: Mon, 14 Nov 2022 18:52:29 -0600 Subject: [PATCH 5/8] aruba parser updates --- netutils/config/compliance.py | 4 +-- netutils/config/parser.py | 29 +++++++++++-------- netutils/lib_mapper.py | 8 +++++ .../aruba_aoscx/aoscx_basic_received.json | 6 ++-- 4 files changed, 30 insertions(+), 17 deletions(-) diff --git a/netutils/config/compliance.py b/netutils/config/compliance.py index 4bdf82d2..b1828b6e 100644 --- a/netutils/config/compliance.py +++ b/netutils/config/compliance.py @@ -278,8 +278,8 @@ def diff_network_config(compare_config: str, base_config: str, network_os: str) for parent in line.parents: if parent not in needed_lines: needed_lines.append(parent) - needed_lines.append(line.config_line) - + if line.config_line: + needed_lines.append(line.config_line) return "\n".join(needed_lines) diff --git a/netutils/config/parser.py b/netutils/config/parser.py index b497b28e..31b03c03 100644 --- a/netutils/config/parser.py +++ b/netutils/config/parser.py @@ -1238,21 +1238,26 @@ def _parse_out_comments(self, config: str) -> str: Returns: The non-comment lines from ``config``. """ + # Aruba AOS-CX uses "!" as both comments and the banner delimiter. + # We need to remove comments while retaining the banner delimiter. + config_lines = [] - # Grab the banner lines from the config. - # Remove the comments from the config. - # Add the banner back to the config after the "hostname" command. The banner ALWAYS comes after the hostname. - pattern = r"^banner motd ![\s\S]+?!$|^banner exec ![\s\S]+?!$" - banner = re.findall(pattern, config, re.MULTILINE) - config = re.sub(pattern, "", config, flags=re.MULTILINE) + banner_started = False + banner_ended = False for line in config.splitlines(): - if line and not self.is_comment(line): + if self.is_banner_start(line): + banner_started = True + banner_ended = False + if line and banner_started and not banner_ended: config_lines.append(line.rstrip()) - if line.lstrip().startswith("hostname"): - for banner_line in banner: - config_lines.append(banner_line) - config = "\n".join(config_lines) - return config + if line.lstrip().startswith(self.banner_end): + banner_ended = True + banner_started = False + else: + if line and not self.is_comment(line): + config_lines.append(line.rstrip()) + full_config = "\n".join(config_lines) + return full_config @property def config_lines_only(self) -> str: diff --git a/netutils/lib_mapper.py b/netutils/lib_mapper.py index 44df1f28..5fd9310f 100644 --- a/netutils/lib_mapper.py +++ b/netutils/lib_mapper.py @@ -123,6 +123,7 @@ NTCTEMPLATES_LIB_MAPPER["watchguard_firebox"] = "watchguard_firebox" NTCTEMPLATES_LIB_MAPPER["huawei_vrp"] = "huawei_vrp" NTCTEMPLATES_LIB_MAPPER["vmware_nsxv"] = "vmware_nsxv" +NTCTEMPLATES_LIB_MAPPER["aruba_aoscx"] = "aruba_aoscx" NAPALM_LIB_MAPPER = { "asa": "cisco_asa", @@ -138,6 +139,7 @@ "panos": "paloalto_panos", "sros": "nokia_sros", "vyos": "brocade_vyos", + "aoscx": "aruba_aoscx", } PYNTC_LIB_MAPPER = { @@ -174,6 +176,7 @@ "community.network.icx": "ruckus_icx", "community.network.sros": "nokia_sros", "vyos.vyos.vyos": "vyos", + "arubanetworks.aoscx": "aruba_aoscx", } PYATS_LIB_MAPPER = { @@ -196,6 +199,7 @@ "cisco_nxos": "cisco_nxos", "arista_eos": "arista_eos", "juniper_junos": "juniper_junos", + "aruba_aoscx": "aruba_aoscx", } NAPALM_LIB_MAPPER_REVERSE = { @@ -211,6 +215,7 @@ "juniper_junos": "junos", "paloalto_panos": "panos", "nokia_sros": "sros", + "aruba_aoscx": "aoscx", } PYNTC_LIB_MAPPER_REVERSE = { @@ -247,6 +252,7 @@ "pluribus": "community.network.netvisor", "ruckus_icx": "community.network.icx", "vyos": "vyos.vyos.vyos", + "aruba_aoscx": "arubanetworks.aoscx", } PYATS_LIB_MAPPER_REVERSE = { @@ -268,6 +274,7 @@ "cisco_nxos": "cisco_nxos", "arista_eos": "arista_eos", "juniper_junos": "juniper_junos", + "aruba_aoscx": "aruba_aoscx", } # Deep copy the reverse, where there is no actual translation happening. @@ -285,3 +292,4 @@ MAIN_LIB_MAPPER["ruckus_icx"] = "ruckus_icx" MAIN_LIB_MAPPER["vmware_nsxv"] = "vmware_nsxv" MAIN_LIB_MAPPER["watchguard_firebox"] = "watchguard_firebox" +MAIN_LIB_MAPPER["aruba_aoscx"] = "aruba_aoscx" diff --git a/tests/unit/mock/config/compliance/compliance/aruba_aoscx/aoscx_basic_received.json b/tests/unit/mock/config/compliance/compliance/aruba_aoscx/aoscx_basic_received.json index 338ebf88..6d63debc 100644 --- a/tests/unit/mock/config/compliance/compliance/aruba_aoscx/aoscx_basic_received.json +++ b/tests/unit/mock/config/compliance/compliance/aruba_aoscx/aoscx_basic_received.json @@ -21,8 +21,8 @@ }, "banner": { "compliant": false, - "missing": "", - "extra": "", + "missing": "banner motd !\n###############################################################################\nThis is a test banner\n###############################################################################\n!\nbanner exec !\n###############################################################################\nThis is a test banner\n###############################################################################\n!", + "extra": "banner motd !\ntest motd banner\n!\nbanner exec !\ntest exec banner\n!", "cannot_parse": true, "unordered_compliant": false, "ordered_compliant": false, @@ -39,4 +39,4 @@ "actual": "access-list ip test\n 10 deny any 10.10.0.128/255.255.255.128 10.10.0.128/255.255.255.192\n 20 deny any 10.10.0.0/255.255.255.192 10.10.0.0/255.255.255.128\n 30 permit any any any", "intended": "access-list ip test\n 10 deny any 10.10.0.0/255.255.255.128 10.10.0.128/255.255.255.192\n 20 deny any 10.10.0.128/255.255.255.192 10.10.0.0/255.255.255.128\n 30 permit any any any" } -} +} \ No newline at end of file From c623e458214cee2c78665a942804c632021e38d3 Mon Sep 17 00:00:00 2001 From: lukebates123 Date: Mon, 14 Nov 2022 18:53:08 -0600 Subject: [PATCH 6/8] add aruba_aoscx lib_mapper --- docs/user/lib_mapper/ansible.md | 1 + docs/user/lib_mapper/ansible_reverse.md | 1 + docs/user/lib_mapper/napalm.md | 1 + docs/user/lib_mapper/napalm_reverse.md | 1 + docs/user/lib_mapper/ntctemplates.md | 1 + docs/user/lib_mapper/ntctemplates_reverse.md | 1 + docs/user/lib_mapper/scrapli.md | 2 +- docs/user/lib_mapper/scrapli_reverse.md | 2 +- 8 files changed, 8 insertions(+), 2 deletions(-) diff --git a/docs/user/lib_mapper/ansible.md b/docs/user/lib_mapper/ansible.md index 2983bc9e..716de08b 100644 --- a/docs/user/lib_mapper/ansible.md +++ b/docs/user/lib_mapper/ansible.md @@ -1,6 +1,7 @@ | NORMALIZED | | ANSIBLE | | ---------- | -- | ------ | | arista.eos.eos | → | arista_eos | +| arubanetworks.aoscx | → | aruba_aoscx | | ciena.saos6.saos6 | → | ciena_saos | | cisco.asa.asa | → | cisco_asa | | cisco.ios.ios | → | cisco_ios | diff --git a/docs/user/lib_mapper/ansible_reverse.md b/docs/user/lib_mapper/ansible_reverse.md index be3b0e32..907c0dc8 100644 --- a/docs/user/lib_mapper/ansible_reverse.md +++ b/docs/user/lib_mapper/ansible_reverse.md @@ -1,6 +1,7 @@ | ANSIBLE | | NORMALIZED | | ---------- | -- | ------ | | arista_eos | → | arista.eos.eos | +| aruba_aoscx | → | arubanetworks.aoscx | | ciena_saos | → | ciena.saos6.saos6 | | cisco_asa | → | cisco.asa.asa | | cisco_ios | → | cisco.ios.ios | diff --git a/docs/user/lib_mapper/napalm.md b/docs/user/lib_mapper/napalm.md index a5cd7261..2e2a792f 100644 --- a/docs/user/lib_mapper/napalm.md +++ b/docs/user/lib_mapper/napalm.md @@ -1,5 +1,6 @@ | NORMALIZED | | NAPALM | | ---------- | -- | ------ | +| aoscx | → | aruba_aoscx | | asa | → | cisco_asa | | cisco_wlc_ssh | → | cisco_wlc | | eos | → | arista_eos | diff --git a/docs/user/lib_mapper/napalm_reverse.md b/docs/user/lib_mapper/napalm_reverse.md index cd4b80f3..0cb9f5af 100644 --- a/docs/user/lib_mapper/napalm_reverse.md +++ b/docs/user/lib_mapper/napalm_reverse.md @@ -1,6 +1,7 @@ | NAPALM | | NORMALIZED | | ---------- | -- | ------ | | arista_eos | → | eos | +| aruba_aoscx | → | aoscx | | brocade_vyos | → | vyos | | cisco_asa | → | asa | | cisco_ios | → | ios | diff --git a/docs/user/lib_mapper/ntctemplates.md b/docs/user/lib_mapper/ntctemplates.md index af8d70b6..e5d2ff86 100644 --- a/docs/user/lib_mapper/ntctemplates.md +++ b/docs/user/lib_mapper/ntctemplates.md @@ -8,6 +8,7 @@ | allied_telesis_awplus | → | allied_telesis_awplus | | apresia_aeos | → | apresia_aeos | | arista_eos | → | arista_eos | +| aruba_aoscx | → | aruba_aoscx | | aruba_os | → | aruba_os | | aruba_osswitch | → | aruba_osswitch | | aruba_procurve | → | aruba_procurve | diff --git a/docs/user/lib_mapper/ntctemplates_reverse.md b/docs/user/lib_mapper/ntctemplates_reverse.md index 08f191f0..61524043 100644 --- a/docs/user/lib_mapper/ntctemplates_reverse.md +++ b/docs/user/lib_mapper/ntctemplates_reverse.md @@ -8,6 +8,7 @@ | allied_telesis_awplus | → | allied_telesis_awplus | | apresia_aeos | → | apresia_aeos | | arista_eos | → | arista_eos | +| aruba_aoscx | → | aruba_aoscx | | aruba_os | → | aruba_os | | aruba_osswitch | → | aruba_osswitch | | aruba_procurve | → | aruba_procurve | diff --git a/docs/user/lib_mapper/scrapli.md b/docs/user/lib_mapper/scrapli.md index ad20c276..bf296069 100644 --- a/docs/user/lib_mapper/scrapli.md +++ b/docs/user/lib_mapper/scrapli.md @@ -1,7 +1,7 @@ | NORMALIZED | | SCRAPLI | | ---------- | -- | ------ | -| aruba_aoscx | → | aruba_aoscx | | arista_eos | → | arista_eos | +| aruba_aoscx | → | aruba_aoscx | | cisco_iosxe | → | cisco_ios | | cisco_iosxr | → | cisco_xr | | cisco_nxos | → | cisco_nxos | diff --git a/docs/user/lib_mapper/scrapli_reverse.md b/docs/user/lib_mapper/scrapli_reverse.md index 46fc1294..8cfa8840 100644 --- a/docs/user/lib_mapper/scrapli_reverse.md +++ b/docs/user/lib_mapper/scrapli_reverse.md @@ -1,7 +1,7 @@ | SCRAPLI | | NORMALIZED | | ---------- | -- | ------ | -| aruba_aoscx | → | aruba_aoscx | | arista_eos | → | arista_eos | +| aruba_aoscx | → | aruba_aoscx | | cisco_ios | → | cisco_iosxe | | cisco_nxos | → | cisco_nxos | | cisco_xr | → | cisco_iosxr | From 25a57f39abf9ee03091979099b27f33cadb0f652 Mon Sep 17 00:00:00 2001 From: lukebates123 <66981180+lukebates123@users.noreply.github.com> Date: Tue, 15 Nov 2022 14:47:23 -0600 Subject: [PATCH 7/8] Update netutils/config/parser.py Co-authored-by: Jeff Kala <48843785+jeffkala@users.noreply.github.com> --- netutils/config/parser.py | 1 + 1 file changed, 1 insertion(+) diff --git a/netutils/config/parser.py b/netutils/config/parser.py index 31b03c03..1e38cc27 100644 --- a/netutils/config/parser.py +++ b/netutils/config/parser.py @@ -1239,6 +1239,7 @@ def _parse_out_comments(self, config: str) -> str: The non-comment lines from ``config``. """ # Aruba AOS-CX uses "!" as both comments and the banner delimiter. + # Even if another delimiter is used while creating the banner, show run changes the delimiter to use "!". # We need to remove comments while retaining the banner delimiter. config_lines = [] From 5af3576cbac55aac743238cb0752bd863e5e70bc Mon Sep 17 00:00:00 2001 From: lukebates123 Date: Tue, 15 Nov 2022 15:45:59 -0600 Subject: [PATCH 8/8] update test case --- .../compliance/compliance/aruba_aoscx/aoscx_basic_backup.txt | 3 --- .../compliance/aruba_aoscx/aoscx_basic_received.json | 4 ++-- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/tests/unit/mock/config/compliance/compliance/aruba_aoscx/aoscx_basic_backup.txt b/tests/unit/mock/config/compliance/compliance/aruba_aoscx/aoscx_basic_backup.txt index 10c7ac4a..e0a8e7ed 100644 --- a/tests/unit/mock/config/compliance/compliance/aruba_aoscx/aoscx_basic_backup.txt +++ b/tests/unit/mock/config/compliance/compliance/aruba_aoscx/aoscx_basic_backup.txt @@ -2,9 +2,6 @@ hostname spine-01 banner motd ! test motd banner ! -banner exec ! -test exec banner -! ntp server 10.20.1.9 ntp server 10.20.1.8 ntp server 10.20.1.7 diff --git a/tests/unit/mock/config/compliance/compliance/aruba_aoscx/aoscx_basic_received.json b/tests/unit/mock/config/compliance/compliance/aruba_aoscx/aoscx_basic_received.json index 6d63debc..399f0c1d 100644 --- a/tests/unit/mock/config/compliance/compliance/aruba_aoscx/aoscx_basic_received.json +++ b/tests/unit/mock/config/compliance/compliance/aruba_aoscx/aoscx_basic_received.json @@ -22,11 +22,11 @@ "banner": { "compliant": false, "missing": "banner motd !\n###############################################################################\nThis is a test banner\n###############################################################################\n!\nbanner exec !\n###############################################################################\nThis is a test banner\n###############################################################################\n!", - "extra": "banner motd !\ntest motd banner\n!\nbanner exec !\ntest exec banner\n!", + "extra": "banner motd !\ntest motd banner\n!", "cannot_parse": true, "unordered_compliant": false, "ordered_compliant": false, - "actual": "banner motd !\ntest motd banner\n!\nbanner exec !\ntest exec banner\n!", + "actual": "banner motd !\ntest motd banner\n!", "intended": "banner motd !\n###############################################################################\nThis is a test banner\n###############################################################################\n!\nbanner exec !\n###############################################################################\nThis is a test banner\n###############################################################################\n!" }, "acl": {