diff --git a/.bandit.yml b/.bandit.yml deleted file mode 100644 index 3bd46e2c..00000000 --- a/.bandit.yml +++ /dev/null @@ -1,6 +0,0 @@ ---- -# No need to check for security issues in the test scripts! -exclude_dirs: - - "./tests/" - - "./docs/" - - "netutils/data_files/" diff --git a/.flake8 b/.flake8 deleted file mode 100644 index e3ba27d5..00000000 --- a/.flake8 +++ /dev/null @@ -1,4 +0,0 @@ -[flake8] -# E501: Line length is enforced by Black, so flake8 doesn't need to check it -# W503: Black disagrees with this rule, as does PEP 8; Black wins -ignore = E501, W503 diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 0bc8f89d..fc02243e 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1,2 +1,2 @@ # Default owner(s) of all files in this repository -* @itdependsnetworks @jeffkala @qduk @abates +* @itdependsnetworks @jeffkala @qduk diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index d8356556..491431e0 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -4,8 +4,8 @@ about: Report a reproducible bug in the current release of netutils --- ### Environment -* Python version: -* netutils version: +* Python version: +* netutils version: ### Expected Behavior diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md index cbf1dbd5..67ee840b 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -5,7 +5,7 @@ about: Propose a new feature or enhancement --- ### Environment -* netutils version: +* netutils version: " +issue_format = "[#{issue}](https://github.com/networktocode/netutils/issues/{issue})" + +[[tool.towncrier.type]] +directory = "security" +name = "Security" +showcontent = true + +[[tool.towncrier.type]] +directory = "added" +name = "Added" +showcontent = true + +[[tool.towncrier.type]] +directory = "changed" +name = "Changed" +showcontent = true + +[[tool.towncrier.type]] +directory = "deprecated" +name = "Deprecated" +showcontent = true + +[[tool.towncrier.type]] +directory = "removed" +name = "Removed" +showcontent = true + +[[tool.towncrier.type]] +directory = "fixed" +name = "Fixed" +showcontent = true + +[[tool.towncrier.type]] +directory = "dependencies" +name = "Dependencies" +showcontent = true + +[[tool.towncrier.type]] +directory = "documentation" +name = "Documentation" +showcontent = true + +[[tool.towncrier.type]] +directory = "housekeeping" +name = "Housekeeping" +showcontent = true diff --git a/tasks.py b/tasks.py index 90834bfe..87ea81d5 100644 --- a/tasks.py +++ b/tasks.py @@ -1,26 +1,22 @@ """Tasks for use with Invoke.""" -import os -import sys +import re +from pathlib import Path -from invoke import task - -try: - import toml -except ImportError: - sys.exit("Please make sure to `pip install toml` or enable the Poetry shell and run `poetry install`.") +from invoke import Collection, Exit +from invoke import task as invoke_task def is_truthy(arg): """Convert "truthy" strings into Booleans. + Examples + -------- + >>> is_truthy('yes') + True Args: arg (str): Truthy string (True values are y, yes, t, true, on and 1; false values are n, no, f, false, off and 0. Raises ValueError if val is anything else. - - Examples: - >>> is_truthy('yes') - True """ if isinstance(arg, bool): return arg @@ -33,151 +29,197 @@ def is_truthy(arg): raise ValueError(f"Invalid truthy value: `{arg}`") -PYPROJECT_CONFIG = toml.load("pyproject.toml") -TOOL_CONFIG = PYPROJECT_CONFIG["tool"]["poetry"] +# Use pyinvoke configuration for default values, see http://docs.pyinvoke.org/en/stable/concepts/configuration.html +# Variables may be overwritten in invoke.yml or by the environment variables INVOKE_PYNTC_xxx +namespace = Collection("netutils") +namespace.configure( + { + "netutils": { + "project_name": "netutils", + "python_ver": "3.13", + "local": False, + "image_name": "netutils", + "image_ver": "latest", + "pwd": ".", + } + } +) + + +# pylint: disable=keyword-arg-before-vararg +def task(function=None, *args, **kwargs): + """Task decorator to override the default Invoke task decorator and add each task to the invoke namespace.""" + + def task_wrapper(function=None): + """Wrapper around invoke.task to add the task to the namespace as well.""" + if args or kwargs: + task_func = invoke_task(*args, **kwargs)(function) + else: + task_func = invoke_task(function) + namespace.add_task(task_func) + return task_func -# Can be set to a separate Python version to be used for launching or building image -PYTHON_VER = os.getenv("PYTHON_VER", "3.13") -# Name of the docker image/image -IMAGE_NAME = os.getenv("IMAGE_NAME", TOOL_CONFIG["name"]) -# Tag for the image -IMAGE_VER = os.getenv("IMAGE_VER", f"{TOOL_CONFIG['version']}-py{PYTHON_VER}") -# Gather current working directory for Docker commands -PWD = os.getcwd() -# Local or Docker execution provide "local" to run locally without docker execution -INVOKE_LOCAL = is_truthy(os.getenv("INVOKE_LOCAL", False)) # pylint: disable=W1508 -# Get project name from the toml file -PROJECT_NAME = PYPROJECT_CONFIG["tool"]["poetry"]["name"] -# Get current project version from the toml file -PROJECT_VERSION = PYPROJECT_CONFIG["tool"]["poetry"]["version"] + if function: + # The decorator was called with no arguments + return task_wrapper(function) + # The decorator was called with arguments + return task_wrapper -def run_cmd(context, exec_cmd, local=INVOKE_LOCAL, port=None): +def run_command(context, exec_cmd, port=None): """Wrapper to run the invoke task commands. Args: context ([invoke.task]): Invoke task object. exec_cmd ([str]): Command to run. - local (bool): Define as `True` to execute locally + port (int): Used to serve local docs. Returns: result (obj): Contains Invoke result from running task. """ - if is_truthy(local): + if is_truthy(context.netutils.local): print(f"LOCAL - Running command {exec_cmd}") result = context.run(exec_cmd, pty=True) else: - print(f"DOCKER - Running command: {exec_cmd} container: {IMAGE_NAME}:{IMAGE_VER}") + print( + f"DOCKER - Running command: {exec_cmd} container: {context.netutils.image_name}:{context.netutils.image_ver}" + ) if port: result = context.run( - f"docker run -it -p {port} -v {PWD}:/local {IMAGE_NAME}:{IMAGE_VER} sh -c '{exec_cmd}'", pty=True + f"docker run -it -p {port} -v {context.netutils.pwd}:/local {context.netutils.image_name}:{context.netutils.image_ver} sh -c '{exec_cmd}'", + pty=True, ) else: result = context.run( - f"docker run -it -v {PWD}:/local {IMAGE_NAME}:{IMAGE_VER} sh -c '{exec_cmd}'", pty=True + f"docker run -it -v {context.netutils.pwd}:/local {context.netutils.image_name}:{context.netutils.image_ver} sh -c '{exec_cmd}'", + pty=True, ) return result -@task -def build(context, nocache=False, forcerm=False, hide=False): # pylint: disable=too-many-arguments - """Build a Docker image. - - Args: - context (obj): Used to run specific commands - nocache (bool): Do not use cache when building the image - forcerm (bool): Always remove intermediate containers - hide (bool): Hide output of Docker image build - """ - print(f"Building image {IMAGE_NAME}:{IMAGE_VER}") - command = f"docker build --tag {IMAGE_NAME}:{IMAGE_VER} --build-arg PYTHON_VER={PYTHON_VER} -f Dockerfile ." +@task( + help={ + "cache": "Whether to use Docker's cache when building images (default enabled)", + "force_rm": "Always remove intermediate images", + "hide": "Suppress output from Docker", + } +) +def build(context, cache=True, force_rm=False, hide=False): + """Build a Docker image.""" + print(f"Building image {context.netutils.image_name}:{context.netutils.image_ver}") + command = f"docker build --tag {context.netutils.image_name}:{context.netutils.image_ver} --build-arg PYTHON_VER={context.netutils.python_ver} -f Dockerfile ." - if nocache: + if not cache: command += " --no-cache" - if forcerm: + if force_rm: command += " --force-rm" result = context.run(command, hide=hide) if result.exited != 0: - print(f"Failed to build image {IMAGE_NAME}:{IMAGE_VER}\nError: {result.stderr}") + print( + f"Failed to build image {context.netutils.image_name}:{context.netutils.image_ver}\nError: {result.stderr}" + ) @task def clean(context): - """Remove the project specific image. - - Args: - context (obj): Used to run specific commands - """ - print(f"Attempting to forcefully remove image {IMAGE_NAME}:{IMAGE_VER}") - context.run(f"docker rmi {IMAGE_NAME}:{IMAGE_VER} --force") - print(f"Successfully removed image {IMAGE_NAME}:{IMAGE_VER}") + """Remove the project specific image.""" + print(f"Attempting to forcefully remove image {context.netutils.image_name}:{context.netutils.image_ver}") + context.run(f"docker rmi {context.netutils.image_name}:{context.netutils.image_ver} --force") + print(f"Successfully removed image {context.netutils.image_name}:{context.netutils.image_ver}") @task def rebuild(context): - """Clean the Docker image and then rebuild without using cache. - - Args: - context (obj): Used to run specific commands - """ + """Clean the Docker image and then rebuild without using cache.""" clean(context) - build(context) + build(context, cache=False) @task -def coverage(context, local=INVOKE_LOCAL): +def coverage(context): """Run the coverage report against pytest. Args: context (obj): Used to run specific commands - local (bool): Define as `True` to execute locally """ exec_cmd = "coverage run --source=netutils -m pytest" - run_cmd(context, exec_cmd, local) - run_cmd(context, "coverage report", local) - run_cmd(context, "coverage html", local) + run_command(context, exec_cmd) + run_command(context, "coverage report") + run_command(context, "coverage html") @task -def pytest(context, local=INVOKE_LOCAL): +def pytest(context): """Run pytest for the specified name and Python version. Args: context (obj): Used to run specific commands - local (bool): Define as `True` to execute locally """ exec_cmd = "pytest -vv --doctest-modules netutils/ && coverage run --source=netutils -m pytest && coverage report" - run_cmd(context, exec_cmd, local) - - -@task -def black(context, local=INVOKE_LOCAL): - """Run black to check that Python files adherence to black standards. - - Args: - context (obj): Used to run specific commands - local (bool): Define as `True` to execute locally - """ - exec_cmd = "black --check --diff ." - run_cmd(context, exec_cmd, local) + run_command(context, exec_cmd) + + +@task(aliases=("a",)) +def autoformat(context): + """Run code autoformatting.""" + ruff(context, action=["format"], fix=True) + + +@task( + help={ + "action": "Available values are `['lint', 'format']`. Can be used multiple times. (default: `['lint', 'format']`)", + "target": "File or directory to inspect, repeatable (default: all files in the project will be inspected)", + "fix": "Automatically fix selected actions. May not be able to fix all issues found. (default: False)", + "output_format": "See https://docs.astral.sh/ruff/settings/#output-format for details. (default: `concise`)", + }, + iterable=["action", "target"], +) +def ruff(context, action=None, target=None, fix=False, output_format="concise"): + """Run ruff to perform code formatting and/or linting.""" + if not action: + action = ["lint", "format"] + if not target: + target = ["."] + + exit_code = 0 + + if "format" in action: + command = "ruff format " + if not fix: + command += "--check " + command += " ".join(target) + if not run_command(context, command): + exit_code = 1 + + if "lint" in action: + command = "ruff check " + if fix: + command += "--fix " + command += f"--output-format {output_format} " + command += " ".join(target) + if not run_command(context, command): + exit_code = 1 + + if exit_code != 0: + raise Exit(code=exit_code) @task -def flake8(context, local=INVOKE_LOCAL): - """Run flake8 for the specified name and Python version. +def mypy(context): + """Run mypy to validate typing-hints. Args: context (obj): Used to run specific commands local (bool): Define as `True` to execute locally """ - exec_cmd = "flake8 ." - run_cmd(context, exec_cmd, local) + exec_cmd = "mypy ./netutils" + run_command(context, exec_cmd) @task -def pylint(context, local=INVOKE_LOCAL): +def pylint(context): """Run pylint for the specified name and Python version. Args: @@ -185,11 +227,11 @@ def pylint(context, local=INVOKE_LOCAL): local (bool): Define as `True` to execute locally """ exec_cmd = 'find . -name "*.py" | grep -vE "(tests/unit/mock|netutils/data_files)" | xargs pylint' - run_cmd(context, exec_cmd, local) + run_command(context, exec_cmd) @task -def yamllint(context, local=INVOKE_LOCAL): +def yamllint(context): """Run yamllint to validate formatting adheres to NTC defined YAML standards. Args: @@ -197,43 +239,7 @@ def yamllint(context, local=INVOKE_LOCAL): local (bool): Define as `True` to execute locally """ exec_cmd = "yamllint ." - run_cmd(context, exec_cmd, local) - - -@task -def pydocstyle(context, local=INVOKE_LOCAL): - """Run pydocstyle to validate docstring formatting adheres to NTC defined standards. - - Args: - context (obj): Used to run specific commands - local (bool): Define as `True` to execute locally - """ - exec_cmd = "pydocstyle ." - run_cmd(context, exec_cmd, local) - - -@task -def bandit(context, local=INVOKE_LOCAL): - """Run bandit to validate basic static code security analysis. - - Args: - context (obj): Used to run specific commands - local (bool): Define as `True` to execute locally - """ - exec_cmd = "bandit --recursive ./ --configfile .bandit.yml" - run_cmd(context, exec_cmd, local) - - -@task -def mypy(context, local=INVOKE_LOCAL): - """Run mypy to validate typing-hints. - - Args: - context (obj): Used to run specific commands - local (bool): Define as `True` to execute locally - """ - exec_cmd = "mypy ./netutils" - run_cmd(context, exec_cmd, local) + run_command(context, exec_cmd) @task @@ -243,39 +249,62 @@ def cli(context): Args: context (obj): Used to run specific commands """ - dev = f"docker run -it -v {PWD}:/local {IMAGE_NAME}:{IMAGE_VER} /bin/bash" + dev = f"docker run -it -v {context.netutils.pwd}:/local {context.netutils.image_name}:{context.netutils.image_ver} /bin/bash" context.run(f"{dev}", pty=True) @task -def tests(context, local=INVOKE_LOCAL): +def tests(context): """Run all tests for the specified name and Python version. Args: context (obj): Used to run specific commands - local (bool): Define as `True` to execute locally """ - black(context, local) - flake8(context, local) - pylint(context, local) - yamllint(context, local) - pydocstyle(context, local) - bandit(context, local) - mypy(context, local) - pytest(context, local) + ruff(context) + pylint(context) + yamllint(context) + mypy(context) + pytest(context) print("All tests have passed!") @task -def clean_container(context): - """Remove stopped containers that source for image `netutils:`.""" - exec_cmd = r"""docker container rm $(docker container ls -a | grep -E "^\S+\s+netutils:" | awk 'NR>1 {print $1}')""" - run_cmd(context, exec_cmd, local=True) +def build_and_check_docs(context): + """Build documentation to be available within Docs Sites.""" + command = "mkdocs build --no-directory-urls --strict" + run_command(context, command) + + # Check for the existence of a release notes file for the current version if it's not a prerelease. + version = context.run("poetry version --short", hide=True) + match = re.match(r"^(\d+)\.(\d+)\.\d+$", version.stdout.strip()) + if match: + major = match.group(1) + minor = match.group(2) + release_notes_file = Path(__file__).parent / "docs" / "admin" / "release_notes" / f"version_{major}.{minor}.md" + if not release_notes_file.exists(): + print(f"Release notes file `version_{major}.{minor}.md` does not exist.") + raise Exit(code=1) @task -def docs(context, local=INVOKE_LOCAL): +def docs(context): """Build and serve docs locally for development.""" exec_cmd = "mkdocs serve -v --dev-addr=0.0.0.0:8001" - run_cmd(context, exec_cmd, local, port="8001:8001") + run_command(context, exec_cmd, port="8001:8001") + + +@task( + help={ + "version": "Version of netutils to generate the release notes for.", + } +) +def generate_release_notes(context, version=""): + """Generate Release Notes using Towncrier.""" + command = "poetry run towncrier build" + if version: + command += f" --version {version}" + else: + command += " --version `poetry version -s`" + # Due to issues with git repo ownership in the containers, this must always run locally. + context.run(command) diff --git a/tests/unit/conftest.py b/tests/unit/conftest.py index 836d0a12..de331952 100644 --- a/tests/unit/conftest.py +++ b/tests/unit/conftest.py @@ -1,8 +1,8 @@ """Used to setup fixtures to be used through tests""" +import importlib.util import json import os -import importlib.util import pytest diff --git a/tests/unit/mock/config/compliance/compliance/rad_etx/etx_basic_backup.txt b/tests/unit/mock/config/compliance/compliance/rad_etx/etx_basic_backup.txt new file mode 100644 index 00000000..b0f3495e --- /dev/null +++ b/tests/unit/mock/config/compliance/compliance/rad_etx/etx_basic_backup.txt @@ -0,0 +1,732 @@ + configure + echo "Terminal Configuration" + # Terminal Configuration + terminal + timeout forever + exit + echo "System Configuration" + # System Configuration + system + name "ETX001" + echo "LLDP Configuration" + # LLDP Configuration + lldp + no shutdown + exit + exit + echo "Management configuration" + # Management configuration + management + login-user "net-creds-1" + level su + password "abcdefghijklmnopqrstuvwxyz123456789abcde" hash + no shutdown + exit + login-user "net-creds-2" + level oper + password "abcdefghijklmnopqrstuvwxyz123456789zyxwv" hash + no shutdown + exit + echo "SNMP Configuration" + # SNMP Configuration + snmp + user "snmpv2" none-auth + no shutdown + exit + access-group "snmpv2" snmpv2c no-auth-no-priv + read-view "ntc" + write-view "ntc" + notify-view "ntc" + no shutdown + exit + access-group "v2_read" snmpv2c no-auth-no-priv + write-view "ntc" + exit + security-to-group snmpv2c sec-name "snmpv2" + group-name "snmpv2" + no shutdown + exit + community "ntccommunity" + name "ntccommunity" + sec-name "v2_write" + no shutdown + exit + community "public" + name "public" + sec-name "v2_read" + no shutdown + exit + community "read" + name "private" + sec-name "v2_read" + no shutdown + exit + community "trap" + name "private" + sec-name "v2_trap" + no shutdown + exit + community "trapCommunity" + name "trapCommunity" + sec-name "v2_trap" + no shutdown + exit + community "write" + name "private" + sec-name "v2_write" + no shutdown + exit + target-params "example1" + message-processing-model snmpv2c + version snmpv2c + security name "v2_trap" level no-auth-no-priv + no shutdown + exit + target-params "example2" + message-processing-model snmpv2c + version snmpv2c + security name "v2_trap" level no-auth-no-priv + no shutdown + exit + config-change-notification + exit + exit + echo "Port Configuration" + # Port Configuration + port + l2cp-profile "network" + mac "01-80-c2-00-00-02" peer + mac "01-80-c2-00-00-0e" peer + exit + l2cp-profile "EXAMPLE-ONE" + mac "01-80-c2-00-00-01" discard + exit + l2cp-profile "EXAMPLE-TWO" + mac "01-80-c2-00-00-02" peer + mac "01-80-c2-00-00-0e" peer + exit + l2cp-profile "EXAMPLE-THREE" + mac "01-80-c2-00-00-00" discard + mac "01-80-c2-00-00-01" discard + mac "01-80-c2-00-00-02" discard + mac "01-80-c2-00-00-03" discard + mac "01-80-c2-00-00-04" discard + mac "01-80-c2-00-00-05" discard + mac "01-80-c2-00-00-06" discard + mac "01-80-c2-00-00-07" discard + mac "01-80-c2-00-00-08" discard + mac "01-80-c2-00-00-09" discard + mac "01-80-c2-00-00-0a" discard + mac "01-80-c2-00-00-0b" discard + mac "01-80-c2-00-00-0c" discard + mac "01-80-c2-00-00-0d" discard + mac "01-80-c2-00-00-0e" discard + mac "01-80-c2-00-00-0f" discard + mac "01-80-c2-00-00-10" discard + mac "01-80-c2-00-00-20" discard + mac "01-80-c2-00-00-21" discard + mac "01-80-c2-00-00-22" discard + mac "01-80-c2-00-00-23" discard + mac "01-80-c2-00-00-24" discard + mac "01-80-c2-00-00-25" discard + mac "01-80-c2-00-00-26" discard + mac "01-80-c2-00-00-27" discard + mac "01-80-c2-00-00-28" discard + mac "01-80-c2-00-00-29" discard + mac "01-80-c2-00-00-2a" discard + mac "01-80-c2-00-00-2b" discard + mac "01-80-c2-00-00-2c" discard + mac "01-80-c2-00-00-2d" discard + mac "01-80-c2-00-00-2e" discard + mac "01-80-c2-00-00-2f" discard + mac "01-00-0c-cc-cc-cc" discard + mac "01-00-0c-cc-cc-cd" discard + default discard + exit + l2cp-profile "EXAMPLE-FOUR" + exit + ethernet 1/1 + shutdown + no auto-negotiation + speed-duplex 1000-full-duplex + egress-mtu 9200 + l2cp profile "network" + lldp + nearest-bridge-mode tx-rx + nearest-bridge-basic-management port-description sys-name sys-description sys-capabilities management-address + nearest-bridge-802.3 max-frame-size + exit + exit + ethernet 1/2 + shutdown + name "description for eth1/2" + egress-mtu 9000 + exit + ethernet 1/3 + name "description for eth1/3" + speed-duplex 1000-full-duplex + egress-mtu 12000 + l2cp profile "network" + lldp + nearest-bridge-mode tx-rx + nearest-bridge-basic-management port-description sys-name sys-description sys-capabilities management-address + nearest-bridge-802.3 max-frame-size + exit + exit + ethernet 1/4 + name "description for eth1/4" + tag-ethernet-type 0x88a8 + egress-mtu 12000 + l2cp profile "EXAMPLE-THREE" + exit + ethernet 1/5 + name "description for eth1/5" + egress-mtu 12000 + l2cp profile "EXAMPLE-ONE" + exit + ethernet 1/6 + name "description for eth1/6" + egress-mtu 9000 + exit + ethernet 1/7 + name "description for eth1/7" + egress-mtu 12000 + l2cp profile "EXAMPLE-ONE" + exit + ethernet 1/8 + name "description for eth1/8" + egress-mtu 9008 + l2cp profile "EXAMPLE-THREE" + lldp + nearest-bridge-mode tx-rx + nearest-bridge-basic-management port-description sys-name sys-description sys-capabilities management-address + nearest-bridge-802.3 max-frame-size + exit + exit + ethernet 1/10 + name "description for eth1/9" + egress-mtu 12000 + l2cp profile "EXAMPLE-ONE" + exit + ethernet 3/1 + shutdown + exit + ethernet 3/2 + name "description for eth3/2" + egress-mtu 12000 + l2cp profile "EXAMPLE-ONE" + exit + ethernet 4/1 + name "description for eth4/1" + egress-mtu 12000 + l2cp profile "network" + lldp + nearest-bridge-mode tx-rx + nearest-bridge-basic-management port-description sys-name sys-description sys-capabilities management-address + nearest-bridge-802.3 max-frame-size + exit + exit + ethernet 4/2 + name "description for eth4/2" + exit + echo "Service Virtual Interface- Port Configuration" + # Service Virtual Interface- Port Configuration + svi 1 + name "1" + no shutdown + exit + svi 3 + name "3" + exit + echo "LAG - Port Configuration" + # LAG - Port Configuration + lag 1 + shutdown + bind ethernet 1/1 + bind ethernet 1/2 + anchor-port ethernet 1/1 + exit + lag 7 + shutdown + no anchor-port + exit + exit + echo "Bridge Configuration" + # Bridge Configuration + bridge 1 + name "MGMT" + echo "Bridge Port Configuration" + # Bridge Port Configuration + port 1 + name "svi 1" + no shutdown + exit + port 2 + name "example" + no shutdown + exit + port 3 + name "example" + no shutdown + exit + port 4 + name "example" + no shutdown + exit + port 5 + name "example" + no shutdown + exit + echo "VLAN Configuration" + # VLAN Configuration + vlan 99 + exit + exit + echo "Flows Configuration" + # Flows Configuration + flows + rate-sampling-window 1 + echo "Classifier Profile Configuration" + # Classifier Profile Configuration + classifier-profile "mgmt" match-any + match untagged + exit + classifier-profile "CP-ONE" match-any + match vlan 1103 + exit + classifier-profile "CP-TWO" match-any + match vlan 1103 + exit + classifier-profile "CP-THREE" match-any + match vlan 1201 + exit + classifier-profile "CP-FOUR" match-any + match vlan 1201 + exit + classifier-profile "CP-FIVE" match-any + match vlan 1103 + exit + classifier-profile "CP-SIX" match-any + match vlan 1103 + exit + classifier-profile "CP-SEVEN" match-any + match vlan 1155 dst-ip 192.168.192.2 to-dst-ip 192.168.192.2 + exit + classifier-profile "CP-EIGHT" match-any + match all + exit + classifier-profile "CP-NINE" match-any + match all + exit + classifier-profile "CP-TEN" match-any + match vlan 1155 + exit + classifier-profile "CP-ELEVEN" match-any + match vlan 1202 + exit + classifier-profile "CP-TWELVE" match-any + match all + exit + classifier-profile "CP-A" match-any + match vlan 22 + exit + classifier-profile "CP-B" match-any + match all + exit + classifier-profile "CP-C" match-any + match vlan 777 + exit + classifier-profile "CP-D" match-any + match all + exit + classifier-profile "CP-E" match-any + match vlan 1102 + exit + classifier-profile "CP-F" match-any + match vlan 88 + exit + classifier-profile "CP-G" match-any + match vlan 88 + exit + echo "Flow Configuration" + # Flow Configuration + flow "flow1" + classifier "mgmt" + policer profile "mgmt_policer" + vlan-tag push vlan 99 p-bit fixed 7 + ingress-port svi 1 + egress-port bridge-port 1 1 + reverse-direction + no shutdown + exit + flow "flow2" + classifier "CP-THREE" + policer profile "50m" + mark all + vlan 1201 + p-bit 1 + exit + ingress-port ethernet 3/1 + egress-port ethernet 4/1 queue 1 block 0/1 + service-name "R" + no shutdown + exit + flow "flow3" + classifier "mgmt" + policer profile "mgmt_policer" + vlan-tag push vlan 99 p-bit fixed 7 + ingress-port ethernet 4/1 + egress-port bridge-port 1 2 + reverse-direction block 0/1 + no shutdown + exit + flow "flow4" + classifier "mgmt" + policer profile "mgmt_policer" + vlan-tag push vlan 99 p-bit fixed 7 + ingress-port ethernet 1/1 + egress-port bridge-port 1 4 + reverse-direction block 0/1 + no shutdown + exit + flow "flow5" + classifier "CP-ONE" + no policer + ingress-port ethernet 1/3 + egress-port ethernet 4/1 queue-map-profile "MTU" block 0/1 + service-name "Q" + no shutdown + exit + flow "flow6" + classifier "CP-TWO" + no policer + ingress-port ethernet 4/1 + egress-port ethernet 1/3 queue-map-profile "MTU" block 0/1 + service-name "P" + no shutdown + exit + flow "flow7" + classifier "CP-FOUR" + no policer + mark all + vlan 1201 + exit + ingress-port ethernet 4/1 + egress-port ethernet 3/1 queue 1 block 0/1 + service-name "O" + no shutdown + exit + flow "flow8" + classifier "mgmt" + policer profile "mgmt_policer" + vlan-tag push vlan 99 p-bit fixed 7 + ingress-port ethernet 1/8 + egress-port bridge-port 1 5 + reverse-direction block 0/1 + no shutdown + exit + flow "flow9" + shutdown + classifier "mgmt" + policer profile "Policer1" + vlan-tag push vlan 1111 p-bit fixed 4 + ingress-port ethernet 3/1 + egress-port ethernet 4/2 queue 1 block 0/1 + service-name "N" + pm-collection interval 300 + exit + flow "flow10" + classifier "CP-EIGHT" + policer profile "10m" + vlan-tag push vlan 1202 p-bit fixed 3 + ingress-port ethernet 3/2 + egress-port ethernet 4/1 queue 1 block 0/1 + service-name "M" + no shutdown + exit + flow "flow11" + classifier "CP-ELEVEN" + no policer + vlan-tag pop vlan + ingress-port ethernet 4/1 + egress-port ethernet 3/2 queue 1 block 0/1 + service-name "L" + no shutdown + exit + flow "flow12" + shutdown + classifier "CP-FIVE" + no policer + ingress-port ethernet 1/3 + egress-port ethernet 4/1 queue-map-profile "MTU" block 0/1 + service-name "K" + exit + flow "flow13" + classifier "CP-SEVEN" + policer profile "2g" + mark all + mac swap + ip swap + exit + ingress-port ethernet 4/1 + egress-port ethernet 4/1 queue 0 block 0/1 + no shutdown + exit + flow "flow14" + shutdown + classifier "CP-SIX" + no policer + ingress-port ethernet 4/1 + egress-port ethernet 1/3 queue-map-profile "MTU" block 0/1 + service-name "J" + exit + flow "flow15" + classifier "CP-NINE" + policer profile "2g" + vlan-tag push vlan 1155 p-bit fixed 1 + ingress-port ethernet 1/5 + egress-port ethernet 4/1 queue 1 block 0/1 + service-name "I" + no shutdown + exit + flow "flow16" + classifier "CP-TEN" + no policer + vlan-tag pop vlan + ingress-port ethernet 4/1 + egress-port ethernet 1/5 queue 1 block 0/1 + service-name "H" + no shutdown + exit + flow "flow17" + classifier "CP-D" + policer profile "100m" + vlan-tag push vlan 1102 p-bit fixed 1 + ingress-port ethernet 1/7 + egress-port ethernet 4/1 queue 1 block 0/1 + service-name "G" + no shutdown + exit + flow "flow18" + classifier "CP-TWELVE" + policer profile "50m" + vlan-tag push vlan 22 p-bit fixed 3 + ingress-port ethernet 1/8 + egress-port ethernet 4/1 queue 1 block 0/1 + service-name "F" + no shutdown + exit + flow "flow19" + classifier "CP-A" + no policer + vlan-tag pop vlan + ingress-port ethernet 4/1 + egress-port ethernet 1/8 queue 1 block 0/1 + service-name "E" + no shutdown + exit + flow "flow20" + classifier "CP-E" + no policer + vlan-tag pop vlan + ingress-port ethernet 4/1 + egress-port ethernet 1/7 queue 1 block 0/1 + service-name "D" + no shutdown + exit + flow "flow21" + classifier "CP-B" + policer profile "100_Mbps" + vlan-tag push vlan 777 p-bit fixed 3 + ingress-port ethernet 1/10 + egress-port ethernet 4/1 queue 1 block 0/1 + service-name "C" + no shutdown + exit + flow "flow22" + classifier "CP-C" + no policer + vlan-tag pop vlan + ingress-port ethernet 4/1 + egress-port ethernet 1/10 queue 1 block 0/1 + service-name "B" + no shutdown + exit + flow "flow23" + classifier "CP-F" + no policer + ingress-port ethernet 1/3 + egress-port ethernet 4/1 queue 1 block 0/1 + service-name "A" + no shutdown + exit + flow "flow24" + classifier "CP-G" + no policer + ingress-port ethernet 4/1 + egress-port ethernet 1/3 queue 1 block 0/1 + service-name "A" + no shutdown + exit + exit + router 1 + name "Router#1" + interface 1 + name "ROUTER:DESCRIPTION" + bind svi 1 + dhcp + dhcp-client + client-id mac + exit + no shutdown + exit + static-route 0.0.0.0/0 address 1.1.1.1 metric 1 + exit + exit + configure + oam + echo "OAM CFM Configuration" + # OAM CFM Configuration + cfm + md-level-mip 2 + measurement-bin-profile "cfm1" + thresholds 8000,10000,11200,14000 + exit + measurement-bin-profile "cfm2" + thresholds 1600,2000,2400,3000 + exit + measurement-bin-profile "cfm3" + thresholds 20000,25000,28000,35000 + exit + measurement-bin-profile "cfm4" + thresholds 3200,4000,6400,8000 + exit + measurement-bin-profile "cfm5" + thresholds 61600,77000,110400,138000 + exit + measurement-bin-profile "cfm5" + thresholds 8000,10000 + exit + measurement-bin-profile "cfm6" + thresholds 16000,20000,32000,40000 + exit + measurement-bin-profile "cfm7" + thresholds 6400,8000 + exit + measurement-bin-profile "cfm8" + thresholds 60000,75000,120000,150000 + exit + measurement-bin-profile "cfm9" + thresholds 32000,40000 + exit + measurement-bin-profile "cfma" + thresholds 92000,115000,184000,230000 + exit + measurement-bin-profile "cfmb" + thresholds 32000,40000 + exit + measurement-bin-profile "cfmc" + thresholds 29600,37000,59200,74000 + exit + measurement-bin-profile "cfmd" + thresholds 100000,110400,125000,138000 + exit + measurement-bin-profile "cfme" + thresholds 184000,230000,368000,460000 + exit + measurement-bin-profile "cfmf" + thresholds 8000,10000,40000,50000 + exit + measurement-bin-profile "cfmg" + thresholds 9600,12000 + exit + measurement-bin-profile "cfmh" + thresholds 40000,50000 + exit + measurement-bin-profile "cfmi" + thresholds 59200,74000 + exit + measurement-bin-profile "cfmj" + thresholds 9600,12000 + exit + measurement-bin-profile "cfmk" + thresholds 200000,250000 + exit + measurement-bin-profile "cfml" + thresholds 40000,50000 + exit + measurement-bin-profile "cfmm" + thresholds 368000,460000 + exit + measurement-bin-profile "cfmn" + thresholds 40000,50000 + exit + maintenance-domain 1 + name string "MD1" + maintenance-association 1 + name string "MA1" + mep 1 + no bind + client-md-level 4 + exit + exit + exit + maintenance-domain 2 + md-level 2 + name string "ABC-DEF" + maintenance-association 2 + name string "MA2" + mep 1 + bind ethernet 1/8 + flow uni-direction rx "MA2-out" + flow uni-direction tx "MA2-in" + remote-mep 2 + direction up + customer-tags-excluded + client-md-level 3 + no shutdown + service 1 + classification priority-bit 3 + lmm-interval 100ms + dest-ne 1 + no delay + no loss + remote mep-id 2 + exit + no shutdown + exit + exit + exit + exit + maintenance-domain 3 + name string "ABC-DEF" + maintenance-association 2 + name string "MD3" + mep 2 + bind ethernet 1/10 + flow uni-direction rx "MD3-out" + flow uni-direction tx "MD3-in" + remote-mep 1 + ccm-priority 3 + direction up + customer-tags-excluded + client-md-level 4 + no shutdown + service 1 + delay-threshold 26000 + delay-var-threshold 8000 + classification priority-bit 3 + dest-ne 1 + loss single-ended slm + remote mep-id 1 + delay-measurement-bin profile "cfm1" + delay-var-measurement-bin profile "cfm2" + exit + no shutdown + exit + exit + exit + exit + exit + exit + exit diff --git a/tests/unit/mock/config/compliance/compliance/rad_etx/etx_basic_feature.py b/tests/unit/mock/config/compliance/compliance/rad_etx/etx_basic_feature.py new file mode 100644 index 00000000..08fc3e41 --- /dev/null +++ b/tests/unit/mock/config/compliance/compliance/rad_etx/etx_basic_feature.py @@ -0,0 +1,5 @@ +features = [ + {"name": "terminal", "ordered": False, "section": ["terminal"]}, + {"name": "management", "ordered": False, "section": ["management"]}, + {"name": "router", "ordered": False, "section": ["router"]}, +] diff --git a/tests/unit/mock/config/compliance/compliance/rad_etx/etx_basic_intended.txt b/tests/unit/mock/config/compliance/compliance/rad_etx/etx_basic_intended.txt new file mode 100644 index 00000000..6c142aa2 --- /dev/null +++ b/tests/unit/mock/config/compliance/compliance/rad_etx/etx_basic_intended.txt @@ -0,0 +1,732 @@ + configure + echo "Terminal Configuration" + # Terminal Configuration + terminal + timeout soon + exit + echo "System Configuration" + # System Configuration + system + name "ETX001" + echo "LLDP Configuration" + # LLDP Configuration + lldp + no shutdown + exit + exit + echo "Management configuration" + # Management configuration + management + login-user "net-creds-1" + level oper + password "abcdefghijklmnopqrstuvwxyz123456789abcde" hash + no shutdown + exit + login-user "net-creds-2" + level su + password "abcdefghijklmnopqrstuvwxyz123456789zyxwv" hash + no shutdown + exit + echo "SNMP Configuration" + # SNMP Configuration + snmp + user "snmpv2" none-auth + no shutdown + exit + access-group "snmpv2" snmpv2c no-auth-no-priv + read-view "ntc2" + write-view "ntc2" + notify-view "ntc2" + no shutdown + exit + access-group "v2_read" snmpv2c no-auth-no-priv + write-view "ntc2" + exit + security-to-group snmpv2c sec-name "snmpv2" + group-name "snmpv2" + no shutdown + exit + community "ntccommunity" + name "ntccommunity" + sec-name "v2_write" + no shutdown + exit + community "public" + name "public" + sec-name "v2_read" + no shutdown + exit + community "read" + name "private" + sec-name "v2_read" + no shutdown + exit + community "trap" + name "private" + sec-name "v2_trap" + no shutdown + exit + community "trapCommunity" + name "trapCommunity" + sec-name "v2_trap" + no shutdown + exit + community "write" + name "private" + sec-name "v2_write" + no shutdown + exit + target-params "example1" + message-processing-model snmpv2c + version snmpv2c + security name "v2_trap" level no-auth-no-priv + no shutdown + exit + target-params "example2" + message-processing-model snmpv2c + version snmpv2c + security name "v2_trap" level no-auth-no-priv + no shutdown + exit + config-change-notification + exit + exit + echo "Port Configuration" + # Port Configuration + port + l2cp-profile "network" + mac "01-80-c2-00-00-02" peer + mac "01-80-c2-00-00-0e" peer + exit + l2cp-profile "EXAMPLE-ONE" + mac "01-80-c2-00-00-01" discard + exit + l2cp-profile "EXAMPLE-TWO" + mac "01-80-c2-00-00-02" peer + mac "01-80-c2-00-00-0e" peer + exit + l2cp-profile "EXAMPLE-THREE" + mac "01-80-c2-00-00-00" discard + mac "01-80-c2-00-00-01" discard + mac "01-80-c2-00-00-02" discard + mac "01-80-c2-00-00-03" discard + mac "01-80-c2-00-00-04" discard + mac "01-80-c2-00-00-05" discard + mac "01-80-c2-00-00-06" discard + mac "01-80-c2-00-00-07" discard + mac "01-80-c2-00-00-08" discard + mac "01-80-c2-00-00-09" discard + mac "01-80-c2-00-00-0a" discard + mac "01-80-c2-00-00-0b" discard + mac "01-80-c2-00-00-0c" discard + mac "01-80-c2-00-00-0d" discard + mac "01-80-c2-00-00-0e" discard + mac "01-80-c2-00-00-0f" discard + mac "01-80-c2-00-00-10" discard + mac "01-80-c2-00-00-20" discard + mac "01-80-c2-00-00-21" discard + mac "01-80-c2-00-00-22" discard + mac "01-80-c2-00-00-23" discard + mac "01-80-c2-00-00-24" discard + mac "01-80-c2-00-00-25" discard + mac "01-80-c2-00-00-26" discard + mac "01-80-c2-00-00-27" discard + mac "01-80-c2-00-00-28" discard + mac "01-80-c2-00-00-29" discard + mac "01-80-c2-00-00-2a" discard + mac "01-80-c2-00-00-2b" discard + mac "01-80-c2-00-00-2c" discard + mac "01-80-c2-00-00-2d" discard + mac "01-80-c2-00-00-2e" discard + mac "01-80-c2-00-00-2f" discard + mac "01-00-0c-cc-cc-cc" discard + mac "01-00-0c-cc-cc-cd" discard + default discard + exit + l2cp-profile "EXAMPLE-FOUR" + exit + ethernet 1/1 + shutdown + no auto-negotiation + speed-duplex 1000-full-duplex + egress-mtu 9200 + l2cp profile "network" + lldp + nearest-bridge-mode tx-rx + nearest-bridge-basic-management port-description sys-name sys-description sys-capabilities management-address + nearest-bridge-802.3 max-frame-size + exit + exit + ethernet 1/2 + shutdown + name "description for eth1/2" + egress-mtu 9000 + exit + ethernet 1/3 + name "description for eth1/3" + speed-duplex 1000-full-duplex + egress-mtu 12000 + l2cp profile "network" + lldp + nearest-bridge-mode tx-rx + nearest-bridge-basic-management port-description sys-name sys-description sys-capabilities management-address + nearest-bridge-802.3 max-frame-size + exit + exit + ethernet 1/4 + name "description for eth1/4" + tag-ethernet-type 0x88a8 + egress-mtu 12000 + l2cp profile "EXAMPLE-THREE" + exit + ethernet 1/5 + name "description for eth1/5" + egress-mtu 12000 + l2cp profile "EXAMPLE-ONE" + exit + ethernet 1/6 + name "description for eth1/6" + egress-mtu 9000 + exit + ethernet 1/7 + name "description for eth1/7" + egress-mtu 12000 + l2cp profile "EXAMPLE-ONE" + exit + ethernet 1/8 + name "description for eth1/8" + egress-mtu 9008 + l2cp profile "EXAMPLE-THREE" + lldp + nearest-bridge-mode tx-rx + nearest-bridge-basic-management port-description sys-name sys-description sys-capabilities management-address + nearest-bridge-802.3 max-frame-size + exit + exit + ethernet 1/10 + name "description for eth1/9" + egress-mtu 12000 + l2cp profile "EXAMPLE-ONE" + exit + ethernet 3/1 + shutdown + exit + ethernet 3/2 + name "description for eth3/2" + egress-mtu 12000 + l2cp profile "EXAMPLE-ONE" + exit + ethernet 4/1 + name "description for eth4/1" + egress-mtu 12000 + l2cp profile "network" + lldp + nearest-bridge-mode tx-rx + nearest-bridge-basic-management port-description sys-name sys-description sys-capabilities management-address + nearest-bridge-802.3 max-frame-size + exit + exit + ethernet 4/2 + name "description for eth4/2" + exit + echo "Service Virtual Interface- Port Configuration" + # Service Virtual Interface- Port Configuration + svi 1 + name "1" + no shutdown + exit + svi 3 + name "3" + exit + echo "LAG - Port Configuration" + # LAG - Port Configuration + lag 1 + shutdown + bind ethernet 1/1 + bind ethernet 1/2 + anchor-port ethernet 1/1 + exit + lag 7 + shutdown + no anchor-port + exit + exit + echo "Bridge Configuration" + # Bridge Configuration + bridge 1 + name "MGMT" + echo "Bridge Port Configuration" + # Bridge Port Configuration + port 1 + name "svi 1" + no shutdown + exit + port 2 + name "example" + no shutdown + exit + port 3 + name "example" + no shutdown + exit + port 4 + name "example" + no shutdown + exit + port 5 + name "example" + no shutdown + exit + echo "VLAN Configuration" + # VLAN Configuration + vlan 99 + exit + exit + echo "Flows Configuration" + # Flows Configuration + flows + rate-sampling-window 1 + echo "Classifier Profile Configuration" + # Classifier Profile Configuration + classifier-profile "mgmt" match-any + match untagged + exit + classifier-profile "CP-ONE" match-any + match vlan 1103 + exit + classifier-profile "CP-TWO" match-any + match vlan 1103 + exit + classifier-profile "CP-THREE" match-any + match vlan 1201 + exit + classifier-profile "CP-FOUR" match-any + match vlan 1201 + exit + classifier-profile "CP-FIVE" match-any + match vlan 1103 + exit + classifier-profile "CP-SIX" match-any + match vlan 1103 + exit + classifier-profile "CP-SEVEN" match-any + match vlan 1155 dst-ip 192.168.192.2 to-dst-ip 192.168.192.2 + exit + classifier-profile "CP-EIGHT" match-any + match all + exit + classifier-profile "CP-NINE" match-any + match all + exit + classifier-profile "CP-TEN" match-any + match vlan 1155 + exit + classifier-profile "CP-ELEVEN" match-any + match vlan 1202 + exit + classifier-profile "CP-TWELVE" match-any + match all + exit + classifier-profile "CP-A" match-any + match vlan 22 + exit + classifier-profile "CP-B" match-any + match all + exit + classifier-profile "CP-C" match-any + match vlan 777 + exit + classifier-profile "CP-D" match-any + match all + exit + classifier-profile "CP-E" match-any + match vlan 1102 + exit + classifier-profile "CP-F" match-any + match vlan 88 + exit + classifier-profile "CP-G" match-any + match vlan 88 + exit + echo "Flow Configuration" + # Flow Configuration + flow "flow1" + classifier "mgmt" + policer profile "mgmt_policer" + vlan-tag push vlan 99 p-bit fixed 7 + ingress-port svi 1 + egress-port bridge-port 1 1 + reverse-direction + no shutdown + exit + flow "flow2" + classifier "CP-THREE" + policer profile "50m" + mark all + vlan 1201 + p-bit 1 + exit + ingress-port ethernet 3/1 + egress-port ethernet 4/1 queue 1 block 0/1 + service-name "R" + no shutdown + exit + flow "flow3" + classifier "mgmt" + policer profile "mgmt_policer" + vlan-tag push vlan 99 p-bit fixed 7 + ingress-port ethernet 4/1 + egress-port bridge-port 1 2 + reverse-direction block 0/1 + no shutdown + exit + flow "flow4" + classifier "mgmt" + policer profile "mgmt_policer" + vlan-tag push vlan 99 p-bit fixed 7 + ingress-port ethernet 1/1 + egress-port bridge-port 1 4 + reverse-direction block 0/1 + no shutdown + exit + flow "flow5" + classifier "CP-ONE" + no policer + ingress-port ethernet 1/3 + egress-port ethernet 4/1 queue-map-profile "MTU" block 0/1 + service-name "Q" + no shutdown + exit + flow "flow6" + classifier "CP-TWO" + no policer + ingress-port ethernet 4/1 + egress-port ethernet 1/3 queue-map-profile "MTU" block 0/1 + service-name "P" + no shutdown + exit + flow "flow7" + classifier "CP-FOUR" + no policer + mark all + vlan 1201 + exit + ingress-port ethernet 4/1 + egress-port ethernet 3/1 queue 1 block 0/1 + service-name "O" + no shutdown + exit + flow "flow8" + classifier "mgmt" + policer profile "mgmt_policer" + vlan-tag push vlan 99 p-bit fixed 7 + ingress-port ethernet 1/8 + egress-port bridge-port 1 5 + reverse-direction block 0/1 + no shutdown + exit + flow "flow9" + shutdown + classifier "mgmt" + policer profile "Policer1" + vlan-tag push vlan 1111 p-bit fixed 4 + ingress-port ethernet 3/1 + egress-port ethernet 4/2 queue 1 block 0/1 + service-name "N" + pm-collection interval 300 + exit + flow "flow10" + classifier "CP-EIGHT" + policer profile "10m" + vlan-tag push vlan 1202 p-bit fixed 3 + ingress-port ethernet 3/2 + egress-port ethernet 4/1 queue 1 block 0/1 + service-name "M" + no shutdown + exit + flow "flow11" + classifier "CP-ELEVEN" + no policer + vlan-tag pop vlan + ingress-port ethernet 4/1 + egress-port ethernet 3/2 queue 1 block 0/1 + service-name "L" + no shutdown + exit + flow "flow12" + shutdown + classifier "CP-FIVE" + no policer + ingress-port ethernet 1/3 + egress-port ethernet 4/1 queue-map-profile "MTU" block 0/1 + service-name "K" + exit + flow "flow13" + classifier "CP-SEVEN" + policer profile "2g" + mark all + mac swap + ip swap + exit + ingress-port ethernet 4/1 + egress-port ethernet 4/1 queue 0 block 0/1 + no shutdown + exit + flow "flow14" + shutdown + classifier "CP-SIX" + no policer + ingress-port ethernet 4/1 + egress-port ethernet 1/3 queue-map-profile "MTU" block 0/1 + service-name "J" + exit + flow "flow15" + classifier "CP-NINE" + policer profile "2g" + vlan-tag push vlan 1155 p-bit fixed 1 + ingress-port ethernet 1/5 + egress-port ethernet 4/1 queue 1 block 0/1 + service-name "I" + no shutdown + exit + flow "flow16" + classifier "CP-TEN" + no policer + vlan-tag pop vlan + ingress-port ethernet 4/1 + egress-port ethernet 1/5 queue 1 block 0/1 + service-name "H" + no shutdown + exit + flow "flow17" + classifier "CP-D" + policer profile "100m" + vlan-tag push vlan 1102 p-bit fixed 1 + ingress-port ethernet 1/7 + egress-port ethernet 4/1 queue 1 block 0/1 + service-name "G" + no shutdown + exit + flow "flow18" + classifier "CP-TWELVE" + policer profile "50m" + vlan-tag push vlan 22 p-bit fixed 3 + ingress-port ethernet 1/8 + egress-port ethernet 4/1 queue 1 block 0/1 + service-name "F" + no shutdown + exit + flow "flow19" + classifier "CP-A" + no policer + vlan-tag pop vlan + ingress-port ethernet 4/1 + egress-port ethernet 1/8 queue 1 block 0/1 + service-name "E" + no shutdown + exit + flow "flow20" + classifier "CP-E" + no policer + vlan-tag pop vlan + ingress-port ethernet 4/1 + egress-port ethernet 1/7 queue 1 block 0/1 + service-name "D" + no shutdown + exit + flow "flow21" + classifier "CP-B" + policer profile "100_Mbps" + vlan-tag push vlan 777 p-bit fixed 3 + ingress-port ethernet 1/10 + egress-port ethernet 4/1 queue 1 block 0/1 + service-name "C" + no shutdown + exit + flow "flow22" + classifier "CP-C" + no policer + vlan-tag pop vlan + ingress-port ethernet 4/1 + egress-port ethernet 1/10 queue 1 block 0/1 + service-name "B" + no shutdown + exit + flow "flow23" + classifier "CP-F" + no policer + ingress-port ethernet 1/3 + egress-port ethernet 4/1 queue 1 block 0/1 + service-name "A" + no shutdown + exit + flow "flow24" + classifier "CP-G" + no policer + ingress-port ethernet 4/1 + egress-port ethernet 1/3 queue 1 block 0/1 + service-name "A" + no shutdown + exit + exit + router 1 + name "Router#1" + interface 1 + name "ROUTER:DESCRIPTION:INTENDED" + bind svi 11 + dhcp + dhcp-client + client-id mac + exit + no shutdown + exit + static-route 0.0.0.0/0 address 1.1.1.1 metric 1 + exit + exit + configure + oam + echo "OAM CFM Configuration" + # OAM CFM Configuration + cfm + md-level-mip 2 + measurement-bin-profile "cfm1" + thresholds 8000,10000,11200,14000 + exit + measurement-bin-profile "cfm2" + thresholds 1600,2000,2400,3000 + exit + measurement-bin-profile "cfm3" + thresholds 20000,25000,28000,35000 + exit + measurement-bin-profile "cfm4" + thresholds 3200,4000,6400,8000 + exit + measurement-bin-profile "cfm5" + thresholds 61600,77000,110400,138000 + exit + measurement-bin-profile "cfm5" + thresholds 8000,10000 + exit + measurement-bin-profile "cfm6" + thresholds 16000,20000,32000,40000 + exit + measurement-bin-profile "cfm7" + thresholds 6400,8000 + exit + measurement-bin-profile "cfm8" + thresholds 60000,75000,120000,150000 + exit + measurement-bin-profile "cfm9" + thresholds 32000,40000 + exit + measurement-bin-profile "cfma" + thresholds 92000,115000,184000,230000 + exit + measurement-bin-profile "cfmb" + thresholds 32000,40000 + exit + measurement-bin-profile "cfmc" + thresholds 29600,37000,59200,74000 + exit + measurement-bin-profile "cfmd" + thresholds 100000,110400,125000,138000 + exit + measurement-bin-profile "cfme" + thresholds 184000,230000,368000,460000 + exit + measurement-bin-profile "cfmf" + thresholds 8000,10000,40000,50000 + exit + measurement-bin-profile "cfmg" + thresholds 9600,12000 + exit + measurement-bin-profile "cfmh" + thresholds 40000,50000 + exit + measurement-bin-profile "cfmi" + thresholds 59200,74000 + exit + measurement-bin-profile "cfmj" + thresholds 9600,12000 + exit + measurement-bin-profile "cfmk" + thresholds 200000,250000 + exit + measurement-bin-profile "cfml" + thresholds 40000,50000 + exit + measurement-bin-profile "cfmm" + thresholds 368000,460000 + exit + measurement-bin-profile "cfmn" + thresholds 40000,50000 + exit + maintenance-domain 1 + name string "MD1" + maintenance-association 1 + name string "MA1" + mep 1 + no bind + client-md-level 4 + exit + exit + exit + maintenance-domain 2 + md-level 2 + name string "ABC-DEF" + maintenance-association 2 + name string "MA2" + mep 1 + bind ethernet 1/8 + flow uni-direction rx "MA2-out" + flow uni-direction tx "MA2-in" + remote-mep 2 + direction up + customer-tags-excluded + client-md-level 3 + no shutdown + service 1 + classification priority-bit 3 + lmm-interval 100ms + dest-ne 1 + no delay + no loss + remote mep-id 2 + exit + no shutdown + exit + exit + exit + exit + maintenance-domain 3 + name string "ABC-DEF" + maintenance-association 2 + name string "MD3" + mep 2 + bind ethernet 1/10 + flow uni-direction rx "MD3-out" + flow uni-direction tx "MD3-in" + remote-mep 1 + ccm-priority 3 + direction up + customer-tags-excluded + client-md-level 4 + no shutdown + service 1 + delay-threshold 26000 + delay-var-threshold 8000 + classification priority-bit 3 + dest-ne 1 + loss single-ended slm + remote mep-id 1 + delay-measurement-bin profile "cfm1" + delay-var-measurement-bin profile "cfm2" + exit + no shutdown + exit + exit + exit + exit + exit + exit + exit diff --git a/tests/unit/mock/config/compliance/compliance/rad_etx/etx_basic_received.json b/tests/unit/mock/config/compliance/compliance/rad_etx/etx_basic_received.json new file mode 100644 index 00000000..ef25f5b7 --- /dev/null +++ b/tests/unit/mock/config/compliance/compliance/rad_etx/etx_basic_received.json @@ -0,0 +1,32 @@ +{ + "management": { + "actual": "management\n login-user \"net-creds-1\"\n level su\n password \"abcdefghijklmnopqrstuvwxyz123456789abcde\" hash\n no shutdown\n exit\n login-user \"net-creds-2\"\n level oper\n password \"abcdefghijklmnopqrstuvwxyz123456789zyxwv\" hash\n no shutdown\n exit\n echo \"SNMP Configuration\"\n snmp\n user \"snmpv2\" none-auth\n no shutdown\n exit\n access-group \"snmpv2\" snmpv2c no-auth-no-priv\n read-view \"ntc\"\n write-view \"ntc\"\n notify-view \"ntc\"\n no shutdown\n exit\n access-group \"v2_read\" snmpv2c no-auth-no-priv\n write-view \"ntc\"\n exit\n security-to-group snmpv2c sec-name \"snmpv2\"\n group-name \"snmpv2\"\n no shutdown\n exit\n community \"ntccommunity\"\n name \"ntccommunity\"\n sec-name \"v2_write\"\n no shutdown\n exit\n community \"public\"\n name \"public\"\n sec-name \"v2_read\"\n no shutdown\n exit\n community \"read\"\n name \"private\"\n sec-name \"v2_read\"\n no shutdown\n exit\n community \"trap\"\n name \"private\"\n sec-name \"v2_trap\"\n no shutdown\n exit\n community \"trapCommunity\"\n name \"trapCommunity\"\n sec-name \"v2_trap\"\n no shutdown\n exit\n community \"write\"\n name \"private\"\n sec-name \"v2_write\"\n no shutdown\n exit\n target-params \"example1\"\n message-processing-model snmpv2c\n version snmpv2c\n security name \"v2_trap\" level no-auth-no-priv\n no shutdown\n exit\n target-params \"example2\"\n message-processing-model snmpv2c\n version snmpv2c\n security name \"v2_trap\" level no-auth-no-priv\n no shutdown\n exit\n config-change-notification\n exit", + "cannot_parse": true, + "compliant": false, + "extra": "access-group \"snmpv2\" snmpv2c no-auth-no-priv\n read-view \"ntc\"\n write-view \"ntc\"\n notify-view \"ntc\"\naccess-group \"v2_read\" snmpv2c no-auth-no-priv\n write-view \"ntc\"", + "intended": "management\n login-user \"net-creds-1\"\n level oper\n password \"abcdefghijklmnopqrstuvwxyz123456789abcde\" hash\n no shutdown\n exit\n login-user \"net-creds-2\"\n level su\n password \"abcdefghijklmnopqrstuvwxyz123456789zyxwv\" hash\n no shutdown\n exit\n echo \"SNMP Configuration\"\n snmp\n user \"snmpv2\" none-auth\n no shutdown\n exit\n access-group \"snmpv2\" snmpv2c no-auth-no-priv\n read-view \"ntc2\"\n write-view \"ntc2\"\n notify-view \"ntc2\"\n no shutdown\n exit\n access-group \"v2_read\" snmpv2c no-auth-no-priv\n write-view \"ntc2\"\n exit\n security-to-group snmpv2c sec-name \"snmpv2\"\n group-name \"snmpv2\"\n no shutdown\n exit\n community \"ntccommunity\"\n name \"ntccommunity\"\n sec-name \"v2_write\"\n no shutdown\n exit\n community \"public\"\n name \"public\"\n sec-name \"v2_read\"\n no shutdown\n exit\n community \"read\"\n name \"private\"\n sec-name \"v2_read\"\n no shutdown\n exit\n community \"trap\"\n name \"private\"\n sec-name \"v2_trap\"\n no shutdown\n exit\n community \"trapCommunity\"\n name \"trapCommunity\"\n sec-name \"v2_trap\"\n no shutdown\n exit\n community \"write\"\n name \"private\"\n sec-name \"v2_write\"\n no shutdown\n exit\n target-params \"example1\"\n message-processing-model snmpv2c\n version snmpv2c\n security name \"v2_trap\" level no-auth-no-priv\n no shutdown\n exit\n target-params \"example2\"\n message-processing-model snmpv2c\n version snmpv2c\n security name \"v2_trap\" level no-auth-no-priv\n no shutdown\n exit\n config-change-notification\n exit", + "missing": "access-group \"snmpv2\" snmpv2c no-auth-no-priv\n read-view \"ntc2\"\n write-view \"ntc2\"\n notify-view \"ntc2\"\naccess-group \"v2_read\" snmpv2c no-auth-no-priv\n write-view \"ntc2\"", + "ordered_compliant": false, + "unordered_compliant": false + }, + "router": { + "actual": "router 1\n name \"Router#1\"\n interface 1\n name \"ROUTER:DESCRIPTION\"\n bind svi 1\n dhcp\n dhcp-client\n client-id mac\n exit\n no shutdown\n exit\n static-route 0.0.0.0/0 address 1.1.1.1 metric 1", + "cannot_parse": true, + "compliant": false, + "extra": "name \"ROUTER:DESCRIPTION\"\nbind svi 1", + "intended": "router 1\n name \"Router#1\"\n interface 1\n name \"ROUTER:DESCRIPTION:INTENDED\"\n bind svi 11\n dhcp\n dhcp-client\n client-id mac\n exit\n no shutdown\n exit\n static-route 0.0.0.0/0 address 1.1.1.1 metric 1", + "missing": "name \"ROUTER:DESCRIPTION:INTENDED\"\nbind svi 11", + "ordered_compliant": false, + "unordered_compliant": false + }, + "terminal": { + "actual": "terminal\n timeout forever", + "cannot_parse": true, + "compliant": false, + "extra": "terminal\n timeout forever", + "intended": "terminal\n timeout soon", + "missing": "terminal\n timeout soon", + "ordered_compliant": false, + "unordered_compliant": false + } +} diff --git a/tests/unit/mock/config/compliance/feature_compliance/ios_basic_received.py b/tests/unit/mock/config/compliance/feature_compliance/ios_basic_received.py index 2b4e40a5..afd33954 100644 --- a/tests/unit/mock/config/compliance/feature_compliance/ios_basic_received.py +++ b/tests/unit/mock/config/compliance/feature_compliance/ios_basic_received.py @@ -1,9 +1,9 @@ data = { - "actual": "ntp server 10.10.10.10\n" "ntp server 10.10.10.11\n" "ntp server 10.10.10.12", + "actual": "ntp server 10.10.10.10\nntp server 10.10.10.11\nntp server 10.10.10.12", "cannot_parse": True, "compliant": True, "extra": "", - "intended": "ntp server 10.10.10.10\n" "ntp server 10.10.10.12\n" "ntp server 10.10.10.11", + "intended": "ntp server 10.10.10.10\nntp server 10.10.10.12\nntp server 10.10.10.11", "missing": "", "ordered_compliant": False, "unordered_compliant": True, diff --git a/tests/unit/mock/config/compliance/feature_compliance/ios_empty_banner_received.py b/tests/unit/mock/config/compliance/feature_compliance/ios_empty_banner_received.py index 0200280f..51510b2b 100755 --- a/tests/unit/mock/config/compliance/feature_compliance/ios_empty_banner_received.py +++ b/tests/unit/mock/config/compliance/feature_compliance/ios_empty_banner_received.py @@ -3,8 +3,8 @@ "cannot_parse": True, "compliant": False, "extra": "banner motd ^C^C", - "intended": "banner motd ^C\n" "actual banner example\n^C", - "missing": "banner motd ^C\n" "actual banner example\n^C", + "intended": "banner motd ^C\nactual banner example\n^C", + "missing": "banner motd ^C\nactual banner example\n^C", "ordered_compliant": False, "unordered_compliant": False, } diff --git a/tests/unit/mock/config/compliance/feature_compliance/ios_empty_dst_received.py b/tests/unit/mock/config/compliance/feature_compliance/ios_empty_dst_received.py index b2a98fed..17569872 100644 --- a/tests/unit/mock/config/compliance/feature_compliance/ios_empty_dst_received.py +++ b/tests/unit/mock/config/compliance/feature_compliance/ios_empty_dst_received.py @@ -1,8 +1,8 @@ data = { - "actual": "ntp server 10.10.10.10\n" "ntp server 10.10.10.11\n" "ntp server 10.10.10.12", + "actual": "ntp server 10.10.10.10\nntp server 10.10.10.11\nntp server 10.10.10.12", "cannot_parse": True, "compliant": False, - "extra": "ntp server 10.10.10.10\n" "ntp server 10.10.10.11\n" "ntp server 10.10.10.12", + "extra": "ntp server 10.10.10.10\nntp server 10.10.10.11\nntp server 10.10.10.12", "intended": "", "missing": "", "ordered_compliant": False, diff --git a/tests/unit/mock/config/compliance/feature_compliance/ios_empty_src_received.py b/tests/unit/mock/config/compliance/feature_compliance/ios_empty_src_received.py index 4df8ec76..bbc79084 100644 --- a/tests/unit/mock/config/compliance/feature_compliance/ios_empty_src_received.py +++ b/tests/unit/mock/config/compliance/feature_compliance/ios_empty_src_received.py @@ -3,8 +3,8 @@ "cannot_parse": True, "compliant": False, "extra": "", - "intended": "ntp server 10.10.10.10\n" "ntp server 10.10.10.12\n" "ntp server 10.10.10.11", - "missing": "ntp server 10.10.10.10\n" "ntp server 10.10.10.12\n" "ntp server 10.10.10.11", + "intended": "ntp server 10.10.10.10\nntp server 10.10.10.12\nntp server 10.10.10.11", + "missing": "ntp server 10.10.10.10\nntp server 10.10.10.12\nntp server 10.10.10.11", "ordered_compliant": False, "unordered_compliant": False, } diff --git a/tests/unit/mock/config/parser/base/nvidia_onyx/onyx_full_received.py b/tests/unit/mock/config/parser/base/nvidia_onyx/onyx_full_received.py new file mode 100644 index 00000000..988bfa16 --- /dev/null +++ b/tests/unit/mock/config/parser/base/nvidia_onyx/onyx_full_received.py @@ -0,0 +1,77 @@ +from netutils.config.parser import ConfigLine + +data = [ + ConfigLine(config_line="no cli default prefix-modes enable", parents=()), + ConfigLine(config_line="protocol mlag", parents=()), + ConfigLine(config_line="interface ethernet 1/1 shutdown", parents=()), + ConfigLine(config_line="interface ethernet 1/2 shutdown", parents=()), + ConfigLine(config_line="interface ethernet 1/3 shutdown", parents=()), + ConfigLine(config_line="interface ethernet 1/4 shutdown", parents=()), + ConfigLine(config_line="interface ethernet 1/5 shutdown", parents=()), + ConfigLine(config_line="interface ethernet 1/6 shutdown", parents=()), + ConfigLine(config_line="interface ethernet 1/7 shutdown", parents=()), + ConfigLine(config_line="interface ethernet 1/8 shutdown", parents=()), + ConfigLine(config_line="interface ethernet 1/9 shutdown", parents=()), + ConfigLine(config_line="interface ethernet 1/10 shutdown", parents=()), + ConfigLine(config_line="interface ethernet 1/11 shutdown", parents=()), + ConfigLine(config_line="interface ethernet 1/12 shutdown", parents=()), + ConfigLine(config_line="interface ethernet 1/13 shutdown", parents=()), + ConfigLine(config_line="interface ethernet 1/14 shutdown", parents=()), + ConfigLine(config_line="interface ethernet 1/15 shutdown", parents=()), + ConfigLine(config_line="interface ethernet 1/16 shutdown", parents=()), + ConfigLine(config_line="lacp", parents=()), + ConfigLine(config_line="vlan 1", parents=()), + ConfigLine(config_line="vlan 2", parents=()), + ConfigLine(config_line="vlan 3", parents=()), + ConfigLine(config_line="vlan 100", parents=()), + ConfigLine(config_line='vlan 1 name "DEFUALT"', parents=()), + ConfigLine(config_line='vlan 2 name "VLAN2"', parents=()), + ConfigLine(config_line='vlan 3 name "VLAN3"', parents=()), + ConfigLine(config_line='vlan 100 name "VLAN 100"', parents=()), + ConfigLine(config_line="no spanning-tree", parents=()), + ConfigLine(config_line="ip routing vrf default", parents=()), + ConfigLine(config_line="dcb priority-flow-control enable force", parents=()), + ConfigLine(config_line="interface port-channel 1 dcb priority-flow-control mode on force", parents=()), + ConfigLine(config_line="protocol telemetry", parents=()), + ConfigLine(config_line="no mlag shutdown", parents=()), + ConfigLine(config_line="no interface mgmt0 dhcp", parents=()), + ConfigLine(config_line="interface mgmt0 ip address 192.168.0.2 /24", parents=()), + ConfigLine(config_line="interface mgmt1 shutdown", parents=()), + ConfigLine(config_line="no interface mgmt0 ipv6 dhcp client enable", parents=()), + ConfigLine(config_line="ip name-server vrf vrf-default 192.168.0.254", parents=()), + ConfigLine(config_line="ip name-server vrf vrf-default 192.168.0.253", parents=()), + ConfigLine(config_line="hostname HOSTNAME", parents=()), + ConfigLine(config_line="ip route vrf default 0.0.0.0/0 192.168.0.1", parents=()), + ConfigLine(config_line="no ipv6 enable", parents=()), + ConfigLine(config_line="logging events interfaces enable", parents=()), + ConfigLine(config_line="logging events interfaces interval 30", parents=()), + ConfigLine(config_line="logging format welf", parents=()), + ConfigLine(config_line="logging vrf default 192.168.0.254", parents=()), + ConfigLine(config_line="logging vrf default 192.168.0.254 trap info", parents=()), + ConfigLine(config_line="username localaccount", parents=()), + ConfigLine(config_line="ldap base-dn DC=example,DC=org", parents=()), + ConfigLine(config_line="ldap bind-dn CN=onyxauth,DC=example,DC=org", parents=()), + ConfigLine(config_line="aaa authentication login default ldap local", parents=()), + ConfigLine(config_line="aaa authorization map order remote-only", parents=()), + ConfigLine(config_line="no password hardening enable", parents=()), + ConfigLine(config_line="snmp-server community public ro", parents=()), + ConfigLine(config_line="snmp-server vrf default enable", parents=()), + ConfigLine(config_line="stats sample telemetry enable", parents=()), + ConfigLine(config_line='banner login "\n\nMULTI LINE BANNER"', parents=()), + ConfigLine(config_line='banner motd "SINGLE LINE BANNER"', parents=()), + ConfigLine(config_line="clock timezone Europe Western Madrid", parents=()), + ConfigLine(config_line="json-gw synchronous-request-timeout 50", parents=()), + ConfigLine(config_line="no ntp server 192.168.0.254 disable", parents=()), + ConfigLine(config_line="ntp server 192.168.0.254 keyID 0", parents=()), + ConfigLine(config_line="ntp vrf default enable", parents=()), + ConfigLine(config_line="stats chd telemetry enable", parents=()), + ConfigLine(config_line="terminal sysrq enable", parents=()), + ConfigLine(config_line="no web client cert-verify", parents=()), + ConfigLine(config_line="web vrf default enable", parents=()), + ConfigLine(config_line="no ip filter chain forward rule all", parents=()), + ConfigLine(config_line="no ip filter chain input rule all", parents=()), + ConfigLine(config_line="no ip filter chain logging rule all", parents=()), + ConfigLine(config_line="no ip filter chain output rule all", parents=()), + ConfigLine(config_line="no ip filter enable", parents=()), + ConfigLine(config_line="ssh server login timeout 300", parents=()), +] diff --git a/tests/unit/mock/config/parser/base/nvidia_onyx/onyx_full_sent.txt b/tests/unit/mock/config/parser/base/nvidia_onyx/onyx_full_sent.txt new file mode 100644 index 00000000..17dbe872 --- /dev/null +++ b/tests/unit/mock/config/parser/base/nvidia_onyx/onyx_full_sent.txt @@ -0,0 +1,182 @@ +## +## Active saved database "initial" +## Generated at XXXXX/XX/XX XX:XX:XX +## Hostname: HOSTNAME +## Product release: X.XX.X +## + +## +## Running-config temporary prefix mode setting +## +no cli default prefix-modes enable + +## +## MLAG protocol +## + protocol mlag + +## +## Interface Ethernet configuration +## + interface ethernet 1/1 shutdown + interface ethernet 1/2 shutdown + interface ethernet 1/3 shutdown + interface ethernet 1/4 shutdown + interface ethernet 1/5 shutdown + interface ethernet 1/6 shutdown + interface ethernet 1/7 shutdown + interface ethernet 1/8 shutdown + interface ethernet 1/9 shutdown + interface ethernet 1/10 shutdown + interface ethernet 1/11 shutdown + interface ethernet 1/12 shutdown + interface ethernet 1/13 shutdown + interface ethernet 1/14 shutdown + interface ethernet 1/15 shutdown + interface ethernet 1/16 shutdown + +## +## LAG configuration +## + lacp + +## +## VLAN configuration +## + vlan 1 + vlan 2 + vlan 3 + vlan 100 + vlan 1 name "DEFUALT" + vlan 2 name "VLAN2" + vlan 3 name "VLAN3" + vlan 100 name "VLAN 100" + +## +## STP configuration +## +no spanning-tree + +## +## L3 configuration +## + ip routing vrf default + +## +## DCBX PFC configuration +## + dcb priority-flow-control enable force + interface port-channel 1 dcb priority-flow-control mode on force + +## +## Telemetry configuration +## + protocol telemetry + +## +## MLAG configurations +## +no mlag shutdown + +## +## Network interface configuration +## +no interface mgmt0 dhcp + interface mgmt0 ip address 192.168.0.2 /24 + interface mgmt1 shutdown + +## +## Network interface IPv6 configuration +## +no interface mgmt0 ipv6 dhcp client enable + +## +## Other IP configuration +## + ip name-server vrf vrf-default 192.168.0.254 + ip name-server vrf vrf-default 192.168.0.253 + hostname HOSTNAME + ip route vrf default 0.0.0.0/0 192.168.0.1 + +## +## Other IPv6 configuration +## +no ipv6 enable + +## +## Logging configuration +## + logging events interfaces enable + logging events interfaces interval 30 + logging format welf + logging vrf default 192.168.0.254 + logging vrf default 192.168.0.254 trap info + +## +## Local user account configuration +## + username localaccount + +## +## AAA remote server configuration +## + ldap base-dn DC=example,DC=org + ldap bind-dn CN=onyxauth,DC=example,DC=org +# ldap bind-password ******** + +## +## AAA configuration +## + aaa authentication login default ldap local + aaa authorization map order remote-only + +## +## Password restriction configuration +## +no password hardening enable + +## +## SNMP configuration +## + snmp-server community public ro + snmp-server vrf default enable + +## +## Network management configuration +## + stats sample telemetry enable +# web proxy auth basic password ******** + banner login " + +MULTI LINE BANNER" + banner motd "SINGLE LINE BANNER" + clock timezone Europe Western Madrid + json-gw synchronous-request-timeout 50 +no ntp server 192.168.0.254 disable + ntp server 192.168.0.254 keyID 0 + ntp vrf default enable + stats chd telemetry enable + terminal sysrq enable +no web client cert-verify + web vrf default enable + +## +## IPv4 packet filtering configuration +## +no ip filter chain forward rule all +no ip filter chain input rule all +no ip filter chain logging rule all +no ip filter chain output rule all +no ip filter enable + +## +## SSH and Key configuration +## + ssh server login timeout 300 + +## +## X.509 certificates configuration +## +# +# Certificate name system-self-signed, ID +# (public-cert config omitted since private-key config is hidden) diff --git a/tests/unit/mock/config/parser/base/rad_etx/etx_full_received.py b/tests/unit/mock/config/parser/base/rad_etx/etx_full_received.py new file mode 100644 index 00000000..7aeeef9d --- /dev/null +++ b/tests/unit/mock/config/parser/base/rad_etx/etx_full_received.py @@ -0,0 +1,1454 @@ +from netutils.config.parser import ConfigLine + +data = [ + ConfigLine(config_line='echo "Terminal Configuration"', parents=()), + ConfigLine(config_line="terminal", parents=()), + ConfigLine(config_line=" timeout forever", parents=("terminal",)), + ConfigLine(config_line="exit", parents=()), + ConfigLine(config_line='echo "System Configuration"', parents=()), + ConfigLine(config_line="system", parents=()), + ConfigLine(config_line=' name "ETX001"', parents=("system",)), + ConfigLine(config_line=' echo "LLDP Configuration"', parents=("system",)), + ConfigLine(config_line=" lldp", parents=("system",)), + ConfigLine(config_line=" no shutdown", parents=("system", " lldp")), + ConfigLine(config_line=" exit", parents=("system",)), + ConfigLine(config_line="exit", parents=()), + ConfigLine(config_line='echo "Management configuration"', parents=()), + ConfigLine(config_line="management", parents=()), + ConfigLine(config_line=' login-user "net-creds-1"', parents=("management",)), + ConfigLine(config_line=" level su", parents=("management", ' login-user "net-creds-1"')), + ConfigLine( + config_line=' password "abcdefghijklmnopqrstuvwxyz123456789abcde" hash', + parents=("management", ' login-user "net-creds-1"'), + ), + ConfigLine(config_line=" no shutdown", parents=("management", ' login-user "net-creds-1"')), + ConfigLine(config_line=" exit", parents=("management",)), + ConfigLine(config_line=' login-user "net-creds-2"', parents=("management",)), + ConfigLine(config_line=" level oper", parents=("management", ' login-user "net-creds-2"')), + ConfigLine( + config_line=' password "abcdefghijklmnopqrstuvwxyz123456789zyxwv" hash', + parents=("management", ' login-user "net-creds-2"'), + ), + ConfigLine(config_line=" no shutdown", parents=("management", ' login-user "net-creds-2"')), + ConfigLine(config_line=" exit", parents=("management",)), + ConfigLine(config_line=' echo "SNMP Configuration"', parents=("management",)), + ConfigLine(config_line=" snmp", parents=("management",)), + ConfigLine(config_line=' user "snmpv2" none-auth', parents=("management", " snmp")), + ConfigLine( + config_line=" no shutdown", parents=("management", " snmp", ' user "snmpv2" none-auth') + ), + ConfigLine(config_line=" exit", parents=("management", " snmp")), + ConfigLine(config_line=' access-group "snmpv2" snmpv2c no-auth-no-priv', parents=("management", " snmp")), + ConfigLine( + config_line=' read-view "ntc"', + parents=("management", " snmp", ' access-group "snmpv2" snmpv2c no-auth-no-priv'), + ), + ConfigLine( + config_line=' write-view "ntc"', + parents=("management", " snmp", ' access-group "snmpv2" snmpv2c no-auth-no-priv'), + ), + ConfigLine( + config_line=' notify-view "ntc"', + parents=("management", " snmp", ' access-group "snmpv2" snmpv2c no-auth-no-priv'), + ), + ConfigLine( + config_line=" no shutdown", + parents=("management", " snmp", ' access-group "snmpv2" snmpv2c no-auth-no-priv'), + ), + ConfigLine(config_line=" exit", parents=("management", " snmp")), + ConfigLine( + config_line=' access-group "v2_read" snmpv2c no-auth-no-priv', parents=("management", " snmp") + ), + ConfigLine( + config_line=' write-view "ntc"', + parents=("management", " snmp", ' access-group "v2_read" snmpv2c no-auth-no-priv'), + ), + ConfigLine(config_line=" exit", parents=("management", " snmp")), + ConfigLine(config_line=' security-to-group snmpv2c sec-name "snmpv2"', parents=("management", " snmp")), + ConfigLine( + config_line=' group-name "snmpv2"', + parents=("management", " snmp", ' security-to-group snmpv2c sec-name "snmpv2"'), + ), + ConfigLine( + config_line=" no shutdown", + parents=("management", " snmp", ' security-to-group snmpv2c sec-name "snmpv2"'), + ), + ConfigLine(config_line=" exit", parents=("management", " snmp")), + ConfigLine(config_line=' community "ntccommunity"', parents=("management", " snmp")), + ConfigLine( + config_line=' name "ntccommunity"', + parents=("management", " snmp", ' community "ntccommunity"'), + ), + ConfigLine( + config_line=' sec-name "v2_write"', + parents=("management", " snmp", ' community "ntccommunity"'), + ), + ConfigLine( + config_line=" no shutdown", parents=("management", " snmp", ' community "ntccommunity"') + ), + ConfigLine(config_line=" exit", parents=("management", " snmp")), + ConfigLine(config_line=' community "public"', parents=("management", " snmp")), + ConfigLine( + config_line=' name "public"', parents=("management", " snmp", ' community "public"') + ), + ConfigLine( + config_line=' sec-name "v2_read"', parents=("management", " snmp", ' community "public"') + ), + ConfigLine(config_line=" no shutdown", parents=("management", " snmp", ' community "public"')), + ConfigLine(config_line=" exit", parents=("management", " snmp")), + ConfigLine(config_line=' community "read"', parents=("management", " snmp")), + ConfigLine( + config_line=' name "private"', parents=("management", " snmp", ' community "read"') + ), + ConfigLine( + config_line=' sec-name "v2_read"', parents=("management", " snmp", ' community "read"') + ), + ConfigLine(config_line=" no shutdown", parents=("management", " snmp", ' community "read"')), + ConfigLine(config_line=" exit", parents=("management", " snmp")), + ConfigLine(config_line=' community "trap"', parents=("management", " snmp")), + ConfigLine( + config_line=' name "private"', parents=("management", " snmp", ' community "trap"') + ), + ConfigLine( + config_line=' sec-name "v2_trap"', parents=("management", " snmp", ' community "trap"') + ), + ConfigLine(config_line=" no shutdown", parents=("management", " snmp", ' community "trap"')), + ConfigLine(config_line=" exit", parents=("management", " snmp")), + ConfigLine(config_line=' community "trapCommunity"', parents=("management", " snmp")), + ConfigLine( + config_line=' name "trapCommunity"', + parents=("management", " snmp", ' community "trapCommunity"'), + ), + ConfigLine( + config_line=' sec-name "v2_trap"', + parents=("management", " snmp", ' community "trapCommunity"'), + ), + ConfigLine( + config_line=" no shutdown", parents=("management", " snmp", ' community "trapCommunity"') + ), + ConfigLine(config_line=" exit", parents=("management", " snmp")), + ConfigLine(config_line=' community "write"', parents=("management", " snmp")), + ConfigLine( + config_line=' name "private"', parents=("management", " snmp", ' community "write"') + ), + ConfigLine( + config_line=' sec-name "v2_write"', parents=("management", " snmp", ' community "write"') + ), + ConfigLine(config_line=" no shutdown", parents=("management", " snmp", ' community "write"')), + ConfigLine(config_line=" exit", parents=("management", " snmp")), + ConfigLine(config_line=' target-params "example1"', parents=("management", " snmp")), + ConfigLine( + config_line=" message-processing-model snmpv2c", + parents=("management", " snmp", ' target-params "example1"'), + ), + ConfigLine( + config_line=" version snmpv2c", + parents=("management", " snmp", ' target-params "example1"'), + ), + ConfigLine( + config_line=' security name "v2_trap" level no-auth-no-priv', + parents=("management", " snmp", ' target-params "example1"'), + ), + ConfigLine( + config_line=" no shutdown", parents=("management", " snmp", ' target-params "example1"') + ), + ConfigLine(config_line=" exit", parents=("management", " snmp")), + ConfigLine(config_line=' target-params "example2"', parents=("management", " snmp")), + ConfigLine( + config_line=" message-processing-model snmpv2c", + parents=("management", " snmp", ' target-params "example2"'), + ), + ConfigLine( + config_line=" version snmpv2c", + parents=("management", " snmp", ' target-params "example2"'), + ), + ConfigLine( + config_line=' security name "v2_trap" level no-auth-no-priv', + parents=("management", " snmp", ' target-params "example2"'), + ), + ConfigLine( + config_line=" no shutdown", parents=("management", " snmp", ' target-params "example2"') + ), + ConfigLine(config_line=" exit", parents=("management", " snmp")), + ConfigLine(config_line=" config-change-notification", parents=("management", " snmp")), + ConfigLine(config_line=" exit", parents=("management",)), + ConfigLine(config_line="exit", parents=()), + ConfigLine(config_line='echo "Port Configuration"', parents=()), + ConfigLine(config_line="port", parents=()), + ConfigLine(config_line=' l2cp-profile "network"', parents=("port",)), + ConfigLine(config_line=' mac "01-80-c2-00-00-02" peer', parents=("port", ' l2cp-profile "network"')), + ConfigLine(config_line=' mac "01-80-c2-00-00-0e" peer', parents=("port", ' l2cp-profile "network"')), + ConfigLine(config_line=" exit", parents=("port",)), + ConfigLine(config_line=' l2cp-profile "EXAMPLE-ONE"', parents=("port",)), + ConfigLine( + config_line=' mac "01-80-c2-00-00-01" discard', parents=("port", ' l2cp-profile "EXAMPLE-ONE"') + ), + ConfigLine(config_line=" exit", parents=("port",)), + ConfigLine(config_line=' l2cp-profile "EXAMPLE-TWO"', parents=("port",)), + ConfigLine(config_line=' mac "01-80-c2-00-00-02" peer', parents=("port", ' l2cp-profile "EXAMPLE-TWO"')), + ConfigLine(config_line=' mac "01-80-c2-00-00-0e" peer', parents=("port", ' l2cp-profile "EXAMPLE-TWO"')), + ConfigLine(config_line=" exit", parents=("port",)), + ConfigLine(config_line=' l2cp-profile "EXAMPLE-THREE"', parents=("port",)), + ConfigLine( + config_line=' mac "01-80-c2-00-00-00" discard', parents=("port", ' l2cp-profile "EXAMPLE-THREE"') + ), + ConfigLine( + config_line=' mac "01-80-c2-00-00-01" discard', parents=("port", ' l2cp-profile "EXAMPLE-THREE"') + ), + ConfigLine( + config_line=' mac "01-80-c2-00-00-02" discard', parents=("port", ' l2cp-profile "EXAMPLE-THREE"') + ), + ConfigLine( + config_line=' mac "01-80-c2-00-00-03" discard', parents=("port", ' l2cp-profile "EXAMPLE-THREE"') + ), + ConfigLine( + config_line=' mac "01-80-c2-00-00-04" discard', parents=("port", ' l2cp-profile "EXAMPLE-THREE"') + ), + ConfigLine( + config_line=' mac "01-80-c2-00-00-05" discard', parents=("port", ' l2cp-profile "EXAMPLE-THREE"') + ), + ConfigLine( + config_line=' mac "01-80-c2-00-00-06" discard', parents=("port", ' l2cp-profile "EXAMPLE-THREE"') + ), + ConfigLine( + config_line=' mac "01-80-c2-00-00-07" discard', parents=("port", ' l2cp-profile "EXAMPLE-THREE"') + ), + ConfigLine( + config_line=' mac "01-80-c2-00-00-08" discard', parents=("port", ' l2cp-profile "EXAMPLE-THREE"') + ), + ConfigLine( + config_line=' mac "01-80-c2-00-00-09" discard', parents=("port", ' l2cp-profile "EXAMPLE-THREE"') + ), + ConfigLine( + config_line=' mac "01-80-c2-00-00-0a" discard', parents=("port", ' l2cp-profile "EXAMPLE-THREE"') + ), + ConfigLine( + config_line=' mac "01-80-c2-00-00-0b" discard', parents=("port", ' l2cp-profile "EXAMPLE-THREE"') + ), + ConfigLine( + config_line=' mac "01-80-c2-00-00-0c" discard', parents=("port", ' l2cp-profile "EXAMPLE-THREE"') + ), + ConfigLine( + config_line=' mac "01-80-c2-00-00-0d" discard', parents=("port", ' l2cp-profile "EXAMPLE-THREE"') + ), + ConfigLine( + config_line=' mac "01-80-c2-00-00-0e" discard', parents=("port", ' l2cp-profile "EXAMPLE-THREE"') + ), + ConfigLine( + config_line=' mac "01-80-c2-00-00-0f" discard', parents=("port", ' l2cp-profile "EXAMPLE-THREE"') + ), + ConfigLine( + config_line=' mac "01-80-c2-00-00-10" discard', parents=("port", ' l2cp-profile "EXAMPLE-THREE"') + ), + ConfigLine( + config_line=' mac "01-80-c2-00-00-20" discard', parents=("port", ' l2cp-profile "EXAMPLE-THREE"') + ), + ConfigLine( + config_line=' mac "01-80-c2-00-00-21" discard', parents=("port", ' l2cp-profile "EXAMPLE-THREE"') + ), + ConfigLine( + config_line=' mac "01-80-c2-00-00-22" discard', parents=("port", ' l2cp-profile "EXAMPLE-THREE"') + ), + ConfigLine( + config_line=' mac "01-80-c2-00-00-23" discard', parents=("port", ' l2cp-profile "EXAMPLE-THREE"') + ), + ConfigLine( + config_line=' mac "01-80-c2-00-00-24" discard', parents=("port", ' l2cp-profile "EXAMPLE-THREE"') + ), + ConfigLine( + config_line=' mac "01-80-c2-00-00-25" discard', parents=("port", ' l2cp-profile "EXAMPLE-THREE"') + ), + ConfigLine( + config_line=' mac "01-80-c2-00-00-26" discard', parents=("port", ' l2cp-profile "EXAMPLE-THREE"') + ), + ConfigLine( + config_line=' mac "01-80-c2-00-00-27" discard', parents=("port", ' l2cp-profile "EXAMPLE-THREE"') + ), + ConfigLine( + config_line=' mac "01-80-c2-00-00-28" discard', parents=("port", ' l2cp-profile "EXAMPLE-THREE"') + ), + ConfigLine( + config_line=' mac "01-80-c2-00-00-29" discard', parents=("port", ' l2cp-profile "EXAMPLE-THREE"') + ), + ConfigLine( + config_line=' mac "01-80-c2-00-00-2a" discard', parents=("port", ' l2cp-profile "EXAMPLE-THREE"') + ), + ConfigLine( + config_line=' mac "01-80-c2-00-00-2b" discard', parents=("port", ' l2cp-profile "EXAMPLE-THREE"') + ), + ConfigLine( + config_line=' mac "01-80-c2-00-00-2c" discard', parents=("port", ' l2cp-profile "EXAMPLE-THREE"') + ), + ConfigLine( + config_line=' mac "01-80-c2-00-00-2d" discard', parents=("port", ' l2cp-profile "EXAMPLE-THREE"') + ), + ConfigLine( + config_line=' mac "01-80-c2-00-00-2e" discard', parents=("port", ' l2cp-profile "EXAMPLE-THREE"') + ), + ConfigLine( + config_line=' mac "01-80-c2-00-00-2f" discard', parents=("port", ' l2cp-profile "EXAMPLE-THREE"') + ), + ConfigLine( + config_line=' mac "01-00-0c-cc-cc-cc" discard', parents=("port", ' l2cp-profile "EXAMPLE-THREE"') + ), + ConfigLine( + config_line=' mac "01-00-0c-cc-cc-cd" discard', parents=("port", ' l2cp-profile "EXAMPLE-THREE"') + ), + ConfigLine(config_line=" default discard", parents=("port", ' l2cp-profile "EXAMPLE-THREE"')), + ConfigLine(config_line=" exit", parents=("port",)), + ConfigLine(config_line=' l2cp-profile "EXAMPLE-FOUR"', parents=("port",)), + ConfigLine(config_line=" exit", parents=("port",)), + ConfigLine(config_line=" ethernet 1/1", parents=("port",)), + ConfigLine(config_line=" shutdown", parents=("port", " ethernet 1/1")), + ConfigLine(config_line=" no auto-negotiation", parents=("port", " ethernet 1/1")), + ConfigLine(config_line=" speed-duplex 1000-full-duplex", parents=("port", " ethernet 1/1")), + ConfigLine(config_line=" egress-mtu 9200", parents=("port", " ethernet 1/1")), + ConfigLine(config_line=' l2cp profile "network"', parents=("port", " ethernet 1/1")), + ConfigLine(config_line=" lldp", parents=("port", " ethernet 1/1")), + ConfigLine( + config_line=" nearest-bridge-mode tx-rx", parents=("port", " ethernet 1/1", " lldp") + ), + ConfigLine( + config_line=" nearest-bridge-basic-management port-description sys-name sys-description sys-capabilities management-address", + parents=("port", " ethernet 1/1", " lldp"), + ), + ConfigLine( + config_line=" nearest-bridge-802.3 max-frame-size", + parents=("port", " ethernet 1/1", " lldp"), + ), + ConfigLine(config_line=" exit", parents=("port", " ethernet 1/1")), + ConfigLine(config_line=" exit", parents=("port",)), + ConfigLine(config_line=" ethernet 1/2", parents=("port",)), + ConfigLine(config_line=" shutdown", parents=("port", " ethernet 1/2")), + ConfigLine(config_line=' name "description for eth1/2"', parents=("port", " ethernet 1/2")), + ConfigLine(config_line=" egress-mtu 9000", parents=("port", " ethernet 1/2")), + ConfigLine(config_line=" exit", parents=("port",)), + ConfigLine(config_line=" ethernet 1/3", parents=("port",)), + ConfigLine(config_line=' name "description for eth1/3"', parents=("port", " ethernet 1/3")), + ConfigLine(config_line=" speed-duplex 1000-full-duplex", parents=("port", " ethernet 1/3")), + ConfigLine(config_line=" egress-mtu 12000", parents=("port", " ethernet 1/3")), + ConfigLine(config_line=' l2cp profile "network"', parents=("port", " ethernet 1/3")), + ConfigLine(config_line=" lldp", parents=("port", " ethernet 1/3")), + ConfigLine( + config_line=" nearest-bridge-mode tx-rx", parents=("port", " ethernet 1/3", " lldp") + ), + ConfigLine( + config_line=" nearest-bridge-basic-management port-description sys-name sys-description sys-capabilities management-address", + parents=("port", " ethernet 1/3", " lldp"), + ), + ConfigLine( + config_line=" nearest-bridge-802.3 max-frame-size", + parents=("port", " ethernet 1/3", " lldp"), + ), + ConfigLine(config_line=" exit", parents=("port", " ethernet 1/3")), + ConfigLine(config_line=" exit", parents=("port",)), + ConfigLine(config_line=" ethernet 1/4", parents=("port",)), + ConfigLine(config_line=' name "description for eth1/4"', parents=("port", " ethernet 1/4")), + ConfigLine(config_line=" tag-ethernet-type 0x88a8", parents=("port", " ethernet 1/4")), + ConfigLine(config_line=" egress-mtu 12000", parents=("port", " ethernet 1/4")), + ConfigLine(config_line=' l2cp profile "EXAMPLE-THREE"', parents=("port", " ethernet 1/4")), + ConfigLine(config_line=" exit", parents=("port",)), + ConfigLine(config_line=" ethernet 1/5", parents=("port",)), + ConfigLine(config_line=' name "description for eth1/5"', parents=("port", " ethernet 1/5")), + ConfigLine(config_line=" egress-mtu 12000", parents=("port", " ethernet 1/5")), + ConfigLine(config_line=' l2cp profile "EXAMPLE-ONE"', parents=("port", " ethernet 1/5")), + ConfigLine(config_line=" exit", parents=("port",)), + ConfigLine(config_line=" ethernet 1/6", parents=("port",)), + ConfigLine(config_line=' name "description for eth1/6"', parents=("port", " ethernet 1/6")), + ConfigLine(config_line=" egress-mtu 9000", parents=("port", " ethernet 1/6")), + ConfigLine(config_line=" exit", parents=("port",)), + ConfigLine(config_line=" ethernet 1/7", parents=("port",)), + ConfigLine(config_line=' name "description for eth1/7"', parents=("port", " ethernet 1/7")), + ConfigLine(config_line=" egress-mtu 12000", parents=("port", " ethernet 1/7")), + ConfigLine(config_line=' l2cp profile "EXAMPLE-ONE"', parents=("port", " ethernet 1/7")), + ConfigLine(config_line=" exit", parents=("port",)), + ConfigLine(config_line=" ethernet 1/8", parents=("port",)), + ConfigLine(config_line=' name "description for eth1/8"', parents=("port", " ethernet 1/8")), + ConfigLine(config_line=" egress-mtu 9008", parents=("port", " ethernet 1/8")), + ConfigLine(config_line=' l2cp profile "EXAMPLE-THREE"', parents=("port", " ethernet 1/8")), + ConfigLine(config_line=" lldp", parents=("port", " ethernet 1/8")), + ConfigLine( + config_line=" nearest-bridge-mode tx-rx", parents=("port", " ethernet 1/8", " lldp") + ), + ConfigLine( + config_line=" nearest-bridge-basic-management port-description sys-name sys-description sys-capabilities management-address", + parents=("port", " ethernet 1/8", " lldp"), + ), + ConfigLine( + config_line=" nearest-bridge-802.3 max-frame-size", + parents=("port", " ethernet 1/8", " lldp"), + ), + ConfigLine(config_line=" exit", parents=("port", " ethernet 1/8")), + ConfigLine(config_line=" exit", parents=("port",)), + ConfigLine(config_line=" ethernet 1/10", parents=("port",)), + ConfigLine(config_line=' name "description for eth1/9"', parents=("port", " ethernet 1/10")), + ConfigLine(config_line=" egress-mtu 12000", parents=("port", " ethernet 1/10")), + ConfigLine(config_line=' l2cp profile "EXAMPLE-ONE"', parents=("port", " ethernet 1/10")), + ConfigLine(config_line=" exit", parents=("port",)), + ConfigLine(config_line=" ethernet 3/1", parents=("port",)), + ConfigLine(config_line=" shutdown", parents=("port", " ethernet 3/1")), + ConfigLine(config_line=" exit", parents=("port",)), + ConfigLine(config_line=" ethernet 3/2", parents=("port",)), + ConfigLine(config_line=' name "description for eth3/2"', parents=("port", " ethernet 3/2")), + ConfigLine(config_line=" egress-mtu 12000", parents=("port", " ethernet 3/2")), + ConfigLine(config_line=' l2cp profile "EXAMPLE-ONE"', parents=("port", " ethernet 3/2")), + ConfigLine(config_line=" exit", parents=("port",)), + ConfigLine(config_line=" ethernet 4/1", parents=("port",)), + ConfigLine(config_line=' name "description for eth4/1"', parents=("port", " ethernet 4/1")), + ConfigLine(config_line=" egress-mtu 12000", parents=("port", " ethernet 4/1")), + ConfigLine(config_line=' l2cp profile "network"', parents=("port", " ethernet 4/1")), + ConfigLine(config_line=" lldp", parents=("port", " ethernet 4/1")), + ConfigLine( + config_line=" nearest-bridge-mode tx-rx", parents=("port", " ethernet 4/1", " lldp") + ), + ConfigLine( + config_line=" nearest-bridge-basic-management port-description sys-name sys-description sys-capabilities management-address", + parents=("port", " ethernet 4/1", " lldp"), + ), + ConfigLine( + config_line=" nearest-bridge-802.3 max-frame-size", + parents=("port", " ethernet 4/1", " lldp"), + ), + ConfigLine(config_line=" exit", parents=("port", " ethernet 4/1")), + ConfigLine(config_line=" exit", parents=("port",)), + ConfigLine(config_line=" ethernet 4/2", parents=("port",)), + ConfigLine(config_line=' name "description for eth4/2"', parents=("port", " ethernet 4/2")), + ConfigLine(config_line=" exit", parents=("port",)), + ConfigLine(config_line=' echo "Service Virtual Interface- Port Configuration"', parents=("port",)), + ConfigLine(config_line=" svi 1", parents=("port",)), + ConfigLine(config_line=' name "1"', parents=("port", " svi 1")), + ConfigLine(config_line=" no shutdown", parents=("port", " svi 1")), + ConfigLine(config_line=" exit", parents=("port",)), + ConfigLine(config_line=" svi 3", parents=("port",)), + ConfigLine(config_line=' name "3"', parents=("port", " svi 3")), + ConfigLine(config_line=" exit", parents=("port",)), + ConfigLine(config_line=' echo "LAG - Port Configuration"', parents=("port",)), + ConfigLine(config_line=" lag 1", parents=("port",)), + ConfigLine(config_line=" shutdown", parents=("port", " lag 1")), + ConfigLine(config_line=" bind ethernet 1/1", parents=("port", " lag 1")), + ConfigLine(config_line=" bind ethernet 1/2", parents=("port", " lag 1")), + ConfigLine(config_line=" anchor-port ethernet 1/1", parents=("port", " lag 1")), + ConfigLine(config_line=" exit", parents=("port",)), + ConfigLine(config_line=" lag 7", parents=("port",)), + ConfigLine(config_line=" shutdown", parents=("port", " lag 7")), + ConfigLine(config_line=" no anchor-port", parents=("port", " lag 7")), + ConfigLine(config_line=" exit", parents=("port",)), + ConfigLine(config_line="exit", parents=()), + ConfigLine(config_line='echo "Bridge Configuration"', parents=()), + ConfigLine(config_line="bridge 1", parents=()), + ConfigLine(config_line=' name "MGMT"', parents=("bridge 1",)), + ConfigLine(config_line=' echo "Bridge Port Configuration"', parents=("bridge 1",)), + ConfigLine(config_line=" port 1", parents=("bridge 1",)), + ConfigLine(config_line=' name "svi 1"', parents=("bridge 1", " port 1")), + ConfigLine(config_line=" no shutdown", parents=("bridge 1", " port 1")), + ConfigLine(config_line=" exit", parents=("bridge 1",)), + ConfigLine(config_line=" port 2", parents=("bridge 1",)), + ConfigLine(config_line=' name "example"', parents=("bridge 1", " port 2")), + ConfigLine(config_line=" no shutdown", parents=("bridge 1", " port 2")), + ConfigLine(config_line=" exit", parents=("bridge 1",)), + ConfigLine(config_line=" port 3", parents=("bridge 1",)), + ConfigLine(config_line=' name "example"', parents=("bridge 1", " port 3")), + ConfigLine(config_line=" no shutdown", parents=("bridge 1", " port 3")), + ConfigLine(config_line=" exit", parents=("bridge 1",)), + ConfigLine(config_line=" port 4", parents=("bridge 1",)), + ConfigLine(config_line=' name "example"', parents=("bridge 1", " port 4")), + ConfigLine(config_line=" no shutdown", parents=("bridge 1", " port 4")), + ConfigLine(config_line=" exit", parents=("bridge 1",)), + ConfigLine(config_line=" port 5", parents=("bridge 1",)), + ConfigLine(config_line=' name "example"', parents=("bridge 1", " port 5")), + ConfigLine(config_line=" no shutdown", parents=("bridge 1", " port 5")), + ConfigLine(config_line=" exit", parents=("bridge 1",)), + ConfigLine(config_line=' echo "VLAN Configuration"', parents=("bridge 1",)), + ConfigLine(config_line=" vlan 99", parents=("bridge 1",)), + ConfigLine(config_line=" exit", parents=("bridge 1",)), + ConfigLine(config_line="exit", parents=()), + ConfigLine(config_line='echo "Flows Configuration"', parents=()), + ConfigLine(config_line="flows", parents=()), + ConfigLine(config_line=" rate-sampling-window 1", parents=("flows",)), + ConfigLine(config_line=' echo "Classifier Profile Configuration"', parents=("flows",)), + ConfigLine(config_line=' classifier-profile "mgmt" match-any', parents=("flows",)), + ConfigLine(config_line=" match untagged", parents=("flows", ' classifier-profile "mgmt" match-any')), + ConfigLine(config_line=" exit", parents=("flows",)), + ConfigLine(config_line=' classifier-profile "CP-ONE" match-any', parents=("flows",)), + ConfigLine(config_line=" match vlan 1103", parents=("flows", ' classifier-profile "CP-ONE" match-any')), + ConfigLine(config_line=" exit", parents=("flows",)), + ConfigLine(config_line=' classifier-profile "CP-TWO" match-any', parents=("flows",)), + ConfigLine(config_line=" match vlan 1103", parents=("flows", ' classifier-profile "CP-TWO" match-any')), + ConfigLine(config_line=" exit", parents=("flows",)), + ConfigLine(config_line=' classifier-profile "CP-THREE" match-any', parents=("flows",)), + ConfigLine(config_line=" match vlan 1201", parents=("flows", ' classifier-profile "CP-THREE" match-any')), + ConfigLine(config_line=" exit", parents=("flows",)), + ConfigLine(config_line=' classifier-profile "CP-FOUR" match-any', parents=("flows",)), + ConfigLine(config_line=" match vlan 1201", parents=("flows", ' classifier-profile "CP-FOUR" match-any')), + ConfigLine(config_line=" exit", parents=("flows",)), + ConfigLine(config_line=' classifier-profile "CP-FIVE" match-any', parents=("flows",)), + ConfigLine(config_line=" match vlan 1103", parents=("flows", ' classifier-profile "CP-FIVE" match-any')), + ConfigLine(config_line=" exit", parents=("flows",)), + ConfigLine(config_line=' classifier-profile "CP-SIX" match-any', parents=("flows",)), + ConfigLine(config_line=" match vlan 1103", parents=("flows", ' classifier-profile "CP-SIX" match-any')), + ConfigLine(config_line=" exit", parents=("flows",)), + ConfigLine(config_line=' classifier-profile "CP-SEVEN" match-any', parents=("flows",)), + ConfigLine( + config_line=" match vlan 1155 dst-ip 192.168.192.2 to-dst-ip 192.168.192.2", + parents=("flows", ' classifier-profile "CP-SEVEN" match-any'), + ), + ConfigLine(config_line=" exit", parents=("flows",)), + ConfigLine(config_line=' classifier-profile "CP-EIGHT" match-any', parents=("flows",)), + ConfigLine(config_line=" match all", parents=("flows", ' classifier-profile "CP-EIGHT" match-any')), + ConfigLine(config_line=" exit", parents=("flows",)), + ConfigLine(config_line=' classifier-profile "CP-NINE" match-any', parents=("flows",)), + ConfigLine(config_line=" match all", parents=("flows", ' classifier-profile "CP-NINE" match-any')), + ConfigLine(config_line=" exit", parents=("flows",)), + ConfigLine(config_line=' classifier-profile "CP-TEN" match-any', parents=("flows",)), + ConfigLine(config_line=" match vlan 1155", parents=("flows", ' classifier-profile "CP-TEN" match-any')), + ConfigLine(config_line=" exit", parents=("flows",)), + ConfigLine(config_line=' classifier-profile "CP-ELEVEN" match-any', parents=("flows",)), + ConfigLine( + config_line=" match vlan 1202", parents=("flows", ' classifier-profile "CP-ELEVEN" match-any') + ), + ConfigLine(config_line=" exit", parents=("flows",)), + ConfigLine(config_line=' classifier-profile "CP-TWELVE" match-any', parents=("flows",)), + ConfigLine(config_line=" match all", parents=("flows", ' classifier-profile "CP-TWELVE" match-any')), + ConfigLine(config_line=" exit", parents=("flows",)), + ConfigLine(config_line=' classifier-profile "CP-A" match-any', parents=("flows",)), + ConfigLine(config_line=" match vlan 22", parents=("flows", ' classifier-profile "CP-A" match-any')), + ConfigLine(config_line=" exit", parents=("flows",)), + ConfigLine(config_line=' classifier-profile "CP-B" match-any', parents=("flows",)), + ConfigLine(config_line=" match all", parents=("flows", ' classifier-profile "CP-B" match-any')), + ConfigLine(config_line=" exit", parents=("flows",)), + ConfigLine(config_line=' classifier-profile "CP-C" match-any', parents=("flows",)), + ConfigLine(config_line=" match vlan 777", parents=("flows", ' classifier-profile "CP-C" match-any')), + ConfigLine(config_line=" exit", parents=("flows",)), + ConfigLine(config_line=' classifier-profile "CP-D" match-any', parents=("flows",)), + ConfigLine(config_line=" match all", parents=("flows", ' classifier-profile "CP-D" match-any')), + ConfigLine(config_line=" exit", parents=("flows",)), + ConfigLine(config_line=' classifier-profile "CP-E" match-any', parents=("flows",)), + ConfigLine(config_line=" match vlan 1102", parents=("flows", ' classifier-profile "CP-E" match-any')), + ConfigLine(config_line=" exit", parents=("flows",)), + ConfigLine(config_line=' classifier-profile "CP-F" match-any', parents=("flows",)), + ConfigLine(config_line=" match vlan 88", parents=("flows", ' classifier-profile "CP-F" match-any')), + ConfigLine(config_line=" exit", parents=("flows",)), + ConfigLine(config_line=' classifier-profile "CP-G" match-any', parents=("flows",)), + ConfigLine(config_line=" match vlan 88", parents=("flows", ' classifier-profile "CP-G" match-any')), + ConfigLine(config_line=" exit", parents=("flows",)), + ConfigLine(config_line=' echo "Flow Configuration"', parents=("flows",)), + ConfigLine(config_line=' flow "flow1"', parents=("flows",)), + ConfigLine(config_line=' classifier "mgmt"', parents=("flows", ' flow "flow1"')), + ConfigLine(config_line=' policer profile "mgmt_policer"', parents=("flows", ' flow "flow1"')), + ConfigLine(config_line=" vlan-tag push vlan 99 p-bit fixed 7", parents=("flows", ' flow "flow1"')), + ConfigLine(config_line=" ingress-port svi 1", parents=("flows", ' flow "flow1"')), + ConfigLine(config_line=" egress-port bridge-port 1 1", parents=("flows", ' flow "flow1"')), + ConfigLine(config_line=" reverse-direction", parents=("flows", ' flow "flow1"')), + ConfigLine(config_line=" no shutdown", parents=("flows", ' flow "flow1"')), + ConfigLine(config_line=" exit", parents=("flows",)), + ConfigLine(config_line=' flow "flow2"', parents=("flows",)), + ConfigLine(config_line=' classifier "CP-THREE"', parents=("flows", ' flow "flow2"')), + ConfigLine(config_line=' policer profile "50m"', parents=("flows", ' flow "flow2"')), + ConfigLine(config_line=" mark all", parents=("flows", ' flow "flow2"')), + ConfigLine(config_line=" vlan 1201", parents=("flows", ' flow "flow2"', " mark all")), + ConfigLine(config_line=" p-bit 1", parents=("flows", ' flow "flow2"', " mark all")), + ConfigLine(config_line=" exit", parents=("flows", ' flow "flow2"')), + ConfigLine(config_line=" ingress-port ethernet 3/1", parents=("flows", ' flow "flow2"')), + ConfigLine(config_line=" egress-port ethernet 4/1 queue 1 block 0/1", parents=("flows", ' flow "flow2"')), + ConfigLine(config_line=' service-name "R"', parents=("flows", ' flow "flow2"')), + ConfigLine(config_line=" no shutdown", parents=("flows", ' flow "flow2"')), + ConfigLine(config_line=" exit", parents=("flows",)), + ConfigLine(config_line=' flow "flow3"', parents=("flows",)), + ConfigLine(config_line=' classifier "mgmt"', parents=("flows", ' flow "flow3"')), + ConfigLine(config_line=' policer profile "mgmt_policer"', parents=("flows", ' flow "flow3"')), + ConfigLine(config_line=" vlan-tag push vlan 99 p-bit fixed 7", parents=("flows", ' flow "flow3"')), + ConfigLine(config_line=" ingress-port ethernet 4/1", parents=("flows", ' flow "flow3"')), + ConfigLine(config_line=" egress-port bridge-port 1 2", parents=("flows", ' flow "flow3"')), + ConfigLine(config_line=" reverse-direction block 0/1", parents=("flows", ' flow "flow3"')), + ConfigLine(config_line=" no shutdown", parents=("flows", ' flow "flow3"')), + ConfigLine(config_line=" exit", parents=("flows",)), + ConfigLine(config_line=' flow "flow4"', parents=("flows",)), + ConfigLine(config_line=' classifier "mgmt"', parents=("flows", ' flow "flow4"')), + ConfigLine(config_line=' policer profile "mgmt_policer"', parents=("flows", ' flow "flow4"')), + ConfigLine(config_line=" vlan-tag push vlan 99 p-bit fixed 7", parents=("flows", ' flow "flow4"')), + ConfigLine(config_line=" ingress-port ethernet 1/1", parents=("flows", ' flow "flow4"')), + ConfigLine(config_line=" egress-port bridge-port 1 4", parents=("flows", ' flow "flow4"')), + ConfigLine(config_line=" reverse-direction block 0/1", parents=("flows", ' flow "flow4"')), + ConfigLine(config_line=" no shutdown", parents=("flows", ' flow "flow4"')), + ConfigLine(config_line=" exit", parents=("flows",)), + ConfigLine(config_line=' flow "flow5"', parents=("flows",)), + ConfigLine(config_line=' classifier "CP-ONE"', parents=("flows", ' flow "flow5"')), + ConfigLine(config_line=" no policer", parents=("flows", ' flow "flow5"')), + ConfigLine(config_line=" ingress-port ethernet 1/3", parents=("flows", ' flow "flow5"')), + ConfigLine( + config_line=' egress-port ethernet 4/1 queue-map-profile "MTU" block 0/1', + parents=("flows", ' flow "flow5"'), + ), + ConfigLine(config_line=' service-name "Q"', parents=("flows", ' flow "flow5"')), + ConfigLine(config_line=" no shutdown", parents=("flows", ' flow "flow5"')), + ConfigLine(config_line=" exit", parents=("flows",)), + ConfigLine(config_line=' flow "flow6"', parents=("flows",)), + ConfigLine(config_line=' classifier "CP-TWO"', parents=("flows", ' flow "flow6"')), + ConfigLine(config_line=" no policer", parents=("flows", ' flow "flow6"')), + ConfigLine(config_line=" ingress-port ethernet 4/1", parents=("flows", ' flow "flow6"')), + ConfigLine( + config_line=' egress-port ethernet 1/3 queue-map-profile "MTU" block 0/1', + parents=("flows", ' flow "flow6"'), + ), + ConfigLine(config_line=' service-name "P"', parents=("flows", ' flow "flow6"')), + ConfigLine(config_line=" no shutdown", parents=("flows", ' flow "flow6"')), + ConfigLine(config_line=" exit", parents=("flows",)), + ConfigLine(config_line=' flow "flow7"', parents=("flows",)), + ConfigLine(config_line=' classifier "CP-FOUR"', parents=("flows", ' flow "flow7"')), + ConfigLine(config_line=" no policer", parents=("flows", ' flow "flow7"')), + ConfigLine(config_line=" mark all", parents=("flows", ' flow "flow7"')), + ConfigLine(config_line=" vlan 1201", parents=("flows", ' flow "flow7"', " mark all")), + ConfigLine(config_line=" exit", parents=("flows", ' flow "flow7"')), + ConfigLine(config_line=" ingress-port ethernet 4/1", parents=("flows", ' flow "flow7"')), + ConfigLine(config_line=" egress-port ethernet 3/1 queue 1 block 0/1", parents=("flows", ' flow "flow7"')), + ConfigLine(config_line=' service-name "O"', parents=("flows", ' flow "flow7"')), + ConfigLine(config_line=" no shutdown", parents=("flows", ' flow "flow7"')), + ConfigLine(config_line=" exit", parents=("flows",)), + ConfigLine(config_line=' flow "flow8"', parents=("flows",)), + ConfigLine(config_line=' classifier "mgmt"', parents=("flows", ' flow "flow8"')), + ConfigLine(config_line=' policer profile "mgmt_policer"', parents=("flows", ' flow "flow8"')), + ConfigLine(config_line=" vlan-tag push vlan 99 p-bit fixed 7", parents=("flows", ' flow "flow8"')), + ConfigLine(config_line=" ingress-port ethernet 1/8", parents=("flows", ' flow "flow8"')), + ConfigLine(config_line=" egress-port bridge-port 1 5", parents=("flows", ' flow "flow8"')), + ConfigLine(config_line=" reverse-direction block 0/1", parents=("flows", ' flow "flow8"')), + ConfigLine(config_line=" no shutdown", parents=("flows", ' flow "flow8"')), + ConfigLine(config_line=" exit", parents=("flows",)), + ConfigLine(config_line=' flow "flow9"', parents=("flows",)), + ConfigLine(config_line=" shutdown", parents=("flows", ' flow "flow9"')), + ConfigLine(config_line=' classifier "mgmt"', parents=("flows", ' flow "flow9"')), + ConfigLine(config_line=' policer profile "Policer1"', parents=("flows", ' flow "flow9"')), + ConfigLine(config_line=" vlan-tag push vlan 1111 p-bit fixed 4", parents=("flows", ' flow "flow9"')), + ConfigLine(config_line=" ingress-port ethernet 3/1", parents=("flows", ' flow "flow9"')), + ConfigLine(config_line=" egress-port ethernet 4/2 queue 1 block 0/1", parents=("flows", ' flow "flow9"')), + ConfigLine(config_line=' service-name "N"', parents=("flows", ' flow "flow9"')), + ConfigLine(config_line=" pm-collection interval 300", parents=("flows", ' flow "flow9"')), + ConfigLine(config_line=" exit", parents=("flows",)), + ConfigLine(config_line=' flow "flow10"', parents=("flows",)), + ConfigLine(config_line=' classifier "CP-EIGHT"', parents=("flows", ' flow "flow10"')), + ConfigLine(config_line=' policer profile "10m"', parents=("flows", ' flow "flow10"')), + ConfigLine(config_line=" vlan-tag push vlan 1202 p-bit fixed 3", parents=("flows", ' flow "flow10"')), + ConfigLine(config_line=" ingress-port ethernet 3/2", parents=("flows", ' flow "flow10"')), + ConfigLine( + config_line=" egress-port ethernet 4/1 queue 1 block 0/1", parents=("flows", ' flow "flow10"') + ), + ConfigLine(config_line=' service-name "M"', parents=("flows", ' flow "flow10"')), + ConfigLine(config_line=" no shutdown", parents=("flows", ' flow "flow10"')), + ConfigLine(config_line=" exit", parents=("flows",)), + ConfigLine(config_line=' flow "flow11"', parents=("flows",)), + ConfigLine(config_line=' classifier "CP-ELEVEN"', parents=("flows", ' flow "flow11"')), + ConfigLine(config_line=" no policer", parents=("flows", ' flow "flow11"')), + ConfigLine(config_line=" vlan-tag pop vlan", parents=("flows", ' flow "flow11"')), + ConfigLine(config_line=" ingress-port ethernet 4/1", parents=("flows", ' flow "flow11"')), + ConfigLine( + config_line=" egress-port ethernet 3/2 queue 1 block 0/1", parents=("flows", ' flow "flow11"') + ), + ConfigLine(config_line=' service-name "L"', parents=("flows", ' flow "flow11"')), + ConfigLine(config_line=" no shutdown", parents=("flows", ' flow "flow11"')), + ConfigLine(config_line=" exit", parents=("flows",)), + ConfigLine(config_line=' flow "flow12"', parents=("flows",)), + ConfigLine(config_line=" shutdown", parents=("flows", ' flow "flow12"')), + ConfigLine(config_line=' classifier "CP-FIVE"', parents=("flows", ' flow "flow12"')), + ConfigLine(config_line=" no policer", parents=("flows", ' flow "flow12"')), + ConfigLine(config_line=" ingress-port ethernet 1/3", parents=("flows", ' flow "flow12"')), + ConfigLine( + config_line=' egress-port ethernet 4/1 queue-map-profile "MTU" block 0/1', + parents=("flows", ' flow "flow12"'), + ), + ConfigLine(config_line=' service-name "K"', parents=("flows", ' flow "flow12"')), + ConfigLine(config_line=" exit", parents=("flows",)), + ConfigLine(config_line=' flow "flow13"', parents=("flows",)), + ConfigLine(config_line=' classifier "CP-SEVEN"', parents=("flows", ' flow "flow13"')), + ConfigLine(config_line=' policer profile "2g"', parents=("flows", ' flow "flow13"')), + ConfigLine(config_line=" mark all", parents=("flows", ' flow "flow13"')), + ConfigLine(config_line=" mac swap", parents=("flows", ' flow "flow13"', " mark all")), + ConfigLine(config_line=" ip swap", parents=("flows", ' flow "flow13"', " mark all")), + ConfigLine(config_line=" exit", parents=("flows", ' flow "flow13"')), + ConfigLine(config_line=" ingress-port ethernet 4/1", parents=("flows", ' flow "flow13"')), + ConfigLine( + config_line=" egress-port ethernet 4/1 queue 0 block 0/1", parents=("flows", ' flow "flow13"') + ), + ConfigLine(config_line=" no shutdown", parents=("flows", ' flow "flow13"')), + ConfigLine(config_line=" exit", parents=("flows",)), + ConfigLine(config_line=' flow "flow14"', parents=("flows",)), + ConfigLine(config_line=" shutdown", parents=("flows", ' flow "flow14"')), + ConfigLine(config_line=' classifier "CP-SIX"', parents=("flows", ' flow "flow14"')), + ConfigLine(config_line=" no policer", parents=("flows", ' flow "flow14"')), + ConfigLine(config_line=" ingress-port ethernet 4/1", parents=("flows", ' flow "flow14"')), + ConfigLine( + config_line=' egress-port ethernet 1/3 queue-map-profile "MTU" block 0/1', + parents=("flows", ' flow "flow14"'), + ), + ConfigLine(config_line=' service-name "J"', parents=("flows", ' flow "flow14"')), + ConfigLine(config_line=" exit", parents=("flows",)), + ConfigLine(config_line=' flow "flow15"', parents=("flows",)), + ConfigLine(config_line=' classifier "CP-NINE"', parents=("flows", ' flow "flow15"')), + ConfigLine(config_line=' policer profile "2g"', parents=("flows", ' flow "flow15"')), + ConfigLine(config_line=" vlan-tag push vlan 1155 p-bit fixed 1", parents=("flows", ' flow "flow15"')), + ConfigLine(config_line=" ingress-port ethernet 1/5", parents=("flows", ' flow "flow15"')), + ConfigLine( + config_line=" egress-port ethernet 4/1 queue 1 block 0/1", parents=("flows", ' flow "flow15"') + ), + ConfigLine(config_line=' service-name "I"', parents=("flows", ' flow "flow15"')), + ConfigLine(config_line=" no shutdown", parents=("flows", ' flow "flow15"')), + ConfigLine(config_line=" exit", parents=("flows",)), + ConfigLine(config_line=' flow "flow16"', parents=("flows",)), + ConfigLine(config_line=' classifier "CP-TEN"', parents=("flows", ' flow "flow16"')), + ConfigLine(config_line=" no policer", parents=("flows", ' flow "flow16"')), + ConfigLine(config_line=" vlan-tag pop vlan", parents=("flows", ' flow "flow16"')), + ConfigLine(config_line=" ingress-port ethernet 4/1", parents=("flows", ' flow "flow16"')), + ConfigLine( + config_line=" egress-port ethernet 1/5 queue 1 block 0/1", parents=("flows", ' flow "flow16"') + ), + ConfigLine(config_line=' service-name "H"', parents=("flows", ' flow "flow16"')), + ConfigLine(config_line=" no shutdown", parents=("flows", ' flow "flow16"')), + ConfigLine(config_line=" exit", parents=("flows",)), + ConfigLine(config_line=' flow "flow17"', parents=("flows",)), + ConfigLine(config_line=' classifier "CP-D"', parents=("flows", ' flow "flow17"')), + ConfigLine(config_line=' policer profile "100m"', parents=("flows", ' flow "flow17"')), + ConfigLine(config_line=" vlan-tag push vlan 1102 p-bit fixed 1", parents=("flows", ' flow "flow17"')), + ConfigLine(config_line=" ingress-port ethernet 1/7", parents=("flows", ' flow "flow17"')), + ConfigLine( + config_line=" egress-port ethernet 4/1 queue 1 block 0/1", parents=("flows", ' flow "flow17"') + ), + ConfigLine(config_line=' service-name "G"', parents=("flows", ' flow "flow17"')), + ConfigLine(config_line=" no shutdown", parents=("flows", ' flow "flow17"')), + ConfigLine(config_line=" exit", parents=("flows",)), + ConfigLine(config_line=' flow "flow18"', parents=("flows",)), + ConfigLine(config_line=' classifier "CP-TWELVE"', parents=("flows", ' flow "flow18"')), + ConfigLine(config_line=' policer profile "50m"', parents=("flows", ' flow "flow18"')), + ConfigLine(config_line=" vlan-tag push vlan 22 p-bit fixed 3", parents=("flows", ' flow "flow18"')), + ConfigLine(config_line=" ingress-port ethernet 1/8", parents=("flows", ' flow "flow18"')), + ConfigLine( + config_line=" egress-port ethernet 4/1 queue 1 block 0/1", parents=("flows", ' flow "flow18"') + ), + ConfigLine(config_line=' service-name "F"', parents=("flows", ' flow "flow18"')), + ConfigLine(config_line=" no shutdown", parents=("flows", ' flow "flow18"')), + ConfigLine(config_line=" exit", parents=("flows",)), + ConfigLine(config_line=' flow "flow19"', parents=("flows",)), + ConfigLine(config_line=' classifier "CP-A"', parents=("flows", ' flow "flow19"')), + ConfigLine(config_line=" no policer", parents=("flows", ' flow "flow19"')), + ConfigLine(config_line=" vlan-tag pop vlan", parents=("flows", ' flow "flow19"')), + ConfigLine(config_line=" ingress-port ethernet 4/1", parents=("flows", ' flow "flow19"')), + ConfigLine( + config_line=" egress-port ethernet 1/8 queue 1 block 0/1", parents=("flows", ' flow "flow19"') + ), + ConfigLine(config_line=' service-name "E"', parents=("flows", ' flow "flow19"')), + ConfigLine(config_line=" no shutdown", parents=("flows", ' flow "flow19"')), + ConfigLine(config_line=" exit", parents=("flows",)), + ConfigLine(config_line=' flow "flow20"', parents=("flows",)), + ConfigLine(config_line=' classifier "CP-E"', parents=("flows", ' flow "flow20"')), + ConfigLine(config_line=" no policer", parents=("flows", ' flow "flow20"')), + ConfigLine(config_line=" vlan-tag pop vlan", parents=("flows", ' flow "flow20"')), + ConfigLine(config_line=" ingress-port ethernet 4/1", parents=("flows", ' flow "flow20"')), + ConfigLine( + config_line=" egress-port ethernet 1/7 queue 1 block 0/1", parents=("flows", ' flow "flow20"') + ), + ConfigLine(config_line=' service-name "D"', parents=("flows", ' flow "flow20"')), + ConfigLine(config_line=" no shutdown", parents=("flows", ' flow "flow20"')), + ConfigLine(config_line=" exit", parents=("flows",)), + ConfigLine(config_line=' flow "flow21"', parents=("flows",)), + ConfigLine(config_line=' classifier "CP-B"', parents=("flows", ' flow "flow21"')), + ConfigLine(config_line=' policer profile "100_Mbps"', parents=("flows", ' flow "flow21"')), + ConfigLine(config_line=" vlan-tag push vlan 777 p-bit fixed 3", parents=("flows", ' flow "flow21"')), + ConfigLine(config_line=" ingress-port ethernet 1/10", parents=("flows", ' flow "flow21"')), + ConfigLine( + config_line=" egress-port ethernet 4/1 queue 1 block 0/1", parents=("flows", ' flow "flow21"') + ), + ConfigLine(config_line=' service-name "C"', parents=("flows", ' flow "flow21"')), + ConfigLine(config_line=" no shutdown", parents=("flows", ' flow "flow21"')), + ConfigLine(config_line=" exit", parents=("flows",)), + ConfigLine(config_line=' flow "flow22"', parents=("flows",)), + ConfigLine(config_line=' classifier "CP-C"', parents=("flows", ' flow "flow22"')), + ConfigLine(config_line=" no policer", parents=("flows", ' flow "flow22"')), + ConfigLine(config_line=" vlan-tag pop vlan", parents=("flows", ' flow "flow22"')), + ConfigLine(config_line=" ingress-port ethernet 4/1", parents=("flows", ' flow "flow22"')), + ConfigLine( + config_line=" egress-port ethernet 1/10 queue 1 block 0/1", parents=("flows", ' flow "flow22"') + ), + ConfigLine(config_line=' service-name "B"', parents=("flows", ' flow "flow22"')), + ConfigLine(config_line=" no shutdown", parents=("flows", ' flow "flow22"')), + ConfigLine(config_line=" exit", parents=("flows",)), + ConfigLine(config_line=' flow "flow23"', parents=("flows",)), + ConfigLine(config_line=' classifier "CP-F"', parents=("flows", ' flow "flow23"')), + ConfigLine(config_line=" no policer", parents=("flows", ' flow "flow23"')), + ConfigLine(config_line=" ingress-port ethernet 1/3", parents=("flows", ' flow "flow23"')), + ConfigLine( + config_line=" egress-port ethernet 4/1 queue 1 block 0/1", parents=("flows", ' flow "flow23"') + ), + ConfigLine(config_line=' service-name "A"', parents=("flows", ' flow "flow23"')), + ConfigLine(config_line=" no shutdown", parents=("flows", ' flow "flow23"')), + ConfigLine(config_line=" exit", parents=("flows",)), + ConfigLine(config_line=' flow "flow24"', parents=("flows",)), + ConfigLine(config_line=' classifier "CP-G"', parents=("flows", ' flow "flow24"')), + ConfigLine(config_line=" no policer", parents=("flows", ' flow "flow24"')), + ConfigLine(config_line=" ingress-port ethernet 4/1", parents=("flows", ' flow "flow24"')), + ConfigLine( + config_line=" egress-port ethernet 1/3 queue 1 block 0/1", parents=("flows", ' flow "flow24"') + ), + ConfigLine(config_line=' service-name "A"', parents=("flows", ' flow "flow24"')), + ConfigLine(config_line=" no shutdown", parents=("flows", ' flow "flow24"')), + ConfigLine(config_line=" exit", parents=("flows",)), + ConfigLine(config_line="exit", parents=()), + ConfigLine(config_line="router 1", parents=()), + ConfigLine(config_line=' name "Router#1"', parents=("router 1",)), + ConfigLine(config_line=" interface 1", parents=("router 1",)), + ConfigLine(config_line=' name "ROUTER:DESCRIPTION"', parents=("router 1", " interface 1")), + ConfigLine(config_line=" bind svi 1", parents=("router 1", " interface 1")), + ConfigLine(config_line=" dhcp", parents=("router 1", " interface 1")), + ConfigLine(config_line=" dhcp-client", parents=("router 1", " interface 1")), + ConfigLine(config_line=" client-id mac", parents=("router 1", " interface 1", " dhcp-client")), + ConfigLine(config_line=" exit", parents=("router 1", " interface 1")), + ConfigLine(config_line=" no shutdown", parents=("router 1", " interface 1")), + ConfigLine(config_line=" exit", parents=("router 1",)), + ConfigLine(config_line=" static-route 0.0.0.0/0 address 1.1.1.1 metric 1", parents=("router 1",)), + ConfigLine(config_line="exit", parents=()), + ConfigLine(config_line=" exit", parents=("exit",)), + ConfigLine(config_line="oam", parents=()), + ConfigLine(config_line=' echo "OAM CFM Configuration"', parents=("oam",)), + ConfigLine(config_line=" cfm", parents=("oam",)), + ConfigLine(config_line=" md-level-mip 2", parents=("oam", " cfm")), + ConfigLine(config_line=' measurement-bin-profile "cfm1"', parents=("oam", " cfm")), + ConfigLine( + config_line=" thresholds 8000,10000,11200,14000", + parents=("oam", " cfm", ' measurement-bin-profile "cfm1"'), + ), + ConfigLine(config_line=" exit", parents=("oam", " cfm")), + ConfigLine(config_line=' measurement-bin-profile "cfm2"', parents=("oam", " cfm")), + ConfigLine( + config_line=" thresholds 1600,2000,2400,3000", + parents=("oam", " cfm", ' measurement-bin-profile "cfm2"'), + ), + ConfigLine(config_line=" exit", parents=("oam", " cfm")), + ConfigLine(config_line=' measurement-bin-profile "cfm3"', parents=("oam", " cfm")), + ConfigLine( + config_line=" thresholds 20000,25000,28000,35000", + parents=("oam", " cfm", ' measurement-bin-profile "cfm3"'), + ), + ConfigLine(config_line=" exit", parents=("oam", " cfm")), + ConfigLine(config_line=' measurement-bin-profile "cfm4"', parents=("oam", " cfm")), + ConfigLine( + config_line=" thresholds 3200,4000,6400,8000", + parents=("oam", " cfm", ' measurement-bin-profile "cfm4"'), + ), + ConfigLine(config_line=" exit", parents=("oam", " cfm")), + ConfigLine(config_line=' measurement-bin-profile "cfm5"', parents=("oam", " cfm")), + ConfigLine( + config_line=" thresholds 61600,77000,110400,138000", + parents=("oam", " cfm", ' measurement-bin-profile "cfm5"'), + ), + ConfigLine(config_line=" exit", parents=("oam", " cfm")), + ConfigLine(config_line=' measurement-bin-profile "cfm5"', parents=("oam", " cfm")), + ConfigLine( + config_line=" thresholds 8000,10000", + parents=("oam", " cfm", ' measurement-bin-profile "cfm5"'), + ), + ConfigLine(config_line=" exit", parents=("oam", " cfm")), + ConfigLine(config_line=' measurement-bin-profile "cfm6"', parents=("oam", " cfm")), + ConfigLine( + config_line=" thresholds 16000,20000,32000,40000", + parents=("oam", " cfm", ' measurement-bin-profile "cfm6"'), + ), + ConfigLine(config_line=" exit", parents=("oam", " cfm")), + ConfigLine(config_line=' measurement-bin-profile "cfm7"', parents=("oam", " cfm")), + ConfigLine( + config_line=" thresholds 6400,8000", + parents=("oam", " cfm", ' measurement-bin-profile "cfm7"'), + ), + ConfigLine(config_line=" exit", parents=("oam", " cfm")), + ConfigLine(config_line=' measurement-bin-profile "cfm8"', parents=("oam", " cfm")), + ConfigLine( + config_line=" thresholds 60000,75000,120000,150000", + parents=("oam", " cfm", ' measurement-bin-profile "cfm8"'), + ), + ConfigLine(config_line=" exit", parents=("oam", " cfm")), + ConfigLine(config_line=' measurement-bin-profile "cfm9"', parents=("oam", " cfm")), + ConfigLine( + config_line=" thresholds 32000,40000", + parents=("oam", " cfm", ' measurement-bin-profile "cfm9"'), + ), + ConfigLine(config_line=" exit", parents=("oam", " cfm")), + ConfigLine(config_line=' measurement-bin-profile "cfma"', parents=("oam", " cfm")), + ConfigLine( + config_line=" thresholds 92000,115000,184000,230000", + parents=("oam", " cfm", ' measurement-bin-profile "cfma"'), + ), + ConfigLine(config_line=" exit", parents=("oam", " cfm")), + ConfigLine(config_line=' measurement-bin-profile "cfmb"', parents=("oam", " cfm")), + ConfigLine( + config_line=" thresholds 32000,40000", + parents=("oam", " cfm", ' measurement-bin-profile "cfmb"'), + ), + ConfigLine(config_line=" exit", parents=("oam", " cfm")), + ConfigLine(config_line=' measurement-bin-profile "cfmc"', parents=("oam", " cfm")), + ConfigLine( + config_line=" thresholds 29600,37000,59200,74000", + parents=("oam", " cfm", ' measurement-bin-profile "cfmc"'), + ), + ConfigLine(config_line=" exit", parents=("oam", " cfm")), + ConfigLine(config_line=' measurement-bin-profile "cfmd"', parents=("oam", " cfm")), + ConfigLine( + config_line=" thresholds 100000,110400,125000,138000", + parents=("oam", " cfm", ' measurement-bin-profile "cfmd"'), + ), + ConfigLine(config_line=" exit", parents=("oam", " cfm")), + ConfigLine(config_line=' measurement-bin-profile "cfme"', parents=("oam", " cfm")), + ConfigLine( + config_line=" thresholds 184000,230000,368000,460000", + parents=("oam", " cfm", ' measurement-bin-profile "cfme"'), + ), + ConfigLine(config_line=" exit", parents=("oam", " cfm")), + ConfigLine(config_line=' measurement-bin-profile "cfmf"', parents=("oam", " cfm")), + ConfigLine( + config_line=" thresholds 8000,10000,40000,50000", + parents=("oam", " cfm", ' measurement-bin-profile "cfmf"'), + ), + ConfigLine(config_line=" exit", parents=("oam", " cfm")), + ConfigLine(config_line=' measurement-bin-profile "cfmg"', parents=("oam", " cfm")), + ConfigLine( + config_line=" thresholds 9600,12000", + parents=("oam", " cfm", ' measurement-bin-profile "cfmg"'), + ), + ConfigLine(config_line=" exit", parents=("oam", " cfm")), + ConfigLine(config_line=' measurement-bin-profile "cfmh"', parents=("oam", " cfm")), + ConfigLine( + config_line=" thresholds 40000,50000", + parents=("oam", " cfm", ' measurement-bin-profile "cfmh"'), + ), + ConfigLine(config_line=" exit", parents=("oam", " cfm")), + ConfigLine(config_line=' measurement-bin-profile "cfmi"', parents=("oam", " cfm")), + ConfigLine( + config_line=" thresholds 59200,74000", + parents=("oam", " cfm", ' measurement-bin-profile "cfmi"'), + ), + ConfigLine(config_line=" exit", parents=("oam", " cfm")), + ConfigLine(config_line=' measurement-bin-profile "cfmj"', parents=("oam", " cfm")), + ConfigLine( + config_line=" thresholds 9600,12000", + parents=("oam", " cfm", ' measurement-bin-profile "cfmj"'), + ), + ConfigLine(config_line=" exit", parents=("oam", " cfm")), + ConfigLine(config_line=' measurement-bin-profile "cfmk"', parents=("oam", " cfm")), + ConfigLine( + config_line=" thresholds 200000,250000", + parents=("oam", " cfm", ' measurement-bin-profile "cfmk"'), + ), + ConfigLine(config_line=" exit", parents=("oam", " cfm")), + ConfigLine(config_line=' measurement-bin-profile "cfml"', parents=("oam", " cfm")), + ConfigLine( + config_line=" thresholds 40000,50000", + parents=("oam", " cfm", ' measurement-bin-profile "cfml"'), + ), + ConfigLine(config_line=" exit", parents=("oam", " cfm")), + ConfigLine(config_line=' measurement-bin-profile "cfmm"', parents=("oam", " cfm")), + ConfigLine( + config_line=" thresholds 368000,460000", + parents=("oam", " cfm", ' measurement-bin-profile "cfmm"'), + ), + ConfigLine(config_line=" exit", parents=("oam", " cfm")), + ConfigLine(config_line=' measurement-bin-profile "cfmn"', parents=("oam", " cfm")), + ConfigLine( + config_line=" thresholds 40000,50000", + parents=("oam", " cfm", ' measurement-bin-profile "cfmn"'), + ), + ConfigLine(config_line=" exit", parents=("oam", " cfm")), + ConfigLine(config_line=" maintenance-domain 1", parents=("oam", " cfm")), + ConfigLine(config_line=' name string "MD1"', parents=("oam", " cfm", " maintenance-domain 1")), + ConfigLine( + config_line=" maintenance-association 1", parents=("oam", " cfm", " maintenance-domain 1") + ), + ConfigLine( + config_line=' name string "MA1"', + parents=("oam", " cfm", " maintenance-domain 1", " maintenance-association 1"), + ), + ConfigLine( + config_line=" mep 1", + parents=("oam", " cfm", " maintenance-domain 1", " maintenance-association 1"), + ), + ConfigLine( + config_line=" no bind", + parents=( + "oam", + " cfm", + " maintenance-domain 1", + " maintenance-association 1", + " mep 1", + ), + ), + ConfigLine( + config_line=" client-md-level 4", + parents=( + "oam", + " cfm", + " maintenance-domain 1", + " maintenance-association 1", + " mep 1", + ), + ), + ConfigLine( + config_line=" exit", + parents=("oam", " cfm", " maintenance-domain 1", " maintenance-association 1"), + ), + ConfigLine(config_line=" exit", parents=("oam", " cfm", " maintenance-domain 1")), + ConfigLine(config_line=" exit", parents=("oam", " cfm")), + ConfigLine(config_line=" maintenance-domain 2", parents=("oam", " cfm")), + ConfigLine(config_line=" md-level 2", parents=("oam", " cfm", " maintenance-domain 2")), + ConfigLine( + config_line=' name string "ABC-DEF"', parents=("oam", " cfm", " maintenance-domain 2") + ), + ConfigLine( + config_line=" maintenance-association 2", parents=("oam", " cfm", " maintenance-domain 2") + ), + ConfigLine( + config_line=' name string "MA2"', + parents=("oam", " cfm", " maintenance-domain 2", " maintenance-association 2"), + ), + ConfigLine( + config_line=" mep 1", + parents=("oam", " cfm", " maintenance-domain 2", " maintenance-association 2"), + ), + ConfigLine( + config_line=" bind ethernet 1/8", + parents=( + "oam", + " cfm", + " maintenance-domain 2", + " maintenance-association 2", + " mep 1", + ), + ), + ConfigLine( + config_line=' flow uni-direction rx "MA2-out"', + parents=( + "oam", + " cfm", + " maintenance-domain 2", + " maintenance-association 2", + " mep 1", + ), + ), + ConfigLine( + config_line=' flow uni-direction tx "MA2-in"', + parents=( + "oam", + " cfm", + " maintenance-domain 2", + " maintenance-association 2", + " mep 1", + ), + ), + ConfigLine( + config_line=" remote-mep 2", + parents=( + "oam", + " cfm", + " maintenance-domain 2", + " maintenance-association 2", + " mep 1", + ), + ), + ConfigLine( + config_line=" direction up", + parents=( + "oam", + " cfm", + " maintenance-domain 2", + " maintenance-association 2", + " mep 1", + ), + ), + ConfigLine( + config_line=" customer-tags-excluded", + parents=( + "oam", + " cfm", + " maintenance-domain 2", + " maintenance-association 2", + " mep 1", + ), + ), + ConfigLine( + config_line=" client-md-level 3", + parents=( + "oam", + " cfm", + " maintenance-domain 2", + " maintenance-association 2", + " mep 1", + ), + ), + ConfigLine( + config_line=" no shutdown", + parents=( + "oam", + " cfm", + " maintenance-domain 2", + " maintenance-association 2", + " mep 1", + ), + ), + ConfigLine( + config_line=" service 1", + parents=( + "oam", + " cfm", + " maintenance-domain 2", + " maintenance-association 2", + " mep 1", + ), + ), + ConfigLine( + config_line=" classification priority-bit 3", + parents=( + "oam", + " cfm", + " maintenance-domain 2", + " maintenance-association 2", + " mep 1", + " service 1", + ), + ), + ConfigLine( + config_line=" lmm-interval 100ms", + parents=( + "oam", + " cfm", + " maintenance-domain 2", + " maintenance-association 2", + " mep 1", + " service 1", + ), + ), + ConfigLine( + config_line=" dest-ne 1", + parents=( + "oam", + " cfm", + " maintenance-domain 2", + " maintenance-association 2", + " mep 1", + " service 1", + ), + ), + ConfigLine( + config_line=" no delay", + parents=( + "oam", + " cfm", + " maintenance-domain 2", + " maintenance-association 2", + " mep 1", + " service 1", + " dest-ne 1", + ), + ), + ConfigLine( + config_line=" no loss", + parents=( + "oam", + " cfm", + " maintenance-domain 2", + " maintenance-association 2", + " mep 1", + " service 1", + " dest-ne 1", + ), + ), + ConfigLine( + config_line=" remote mep-id 2", + parents=( + "oam", + " cfm", + " maintenance-domain 2", + " maintenance-association 2", + " mep 1", + " service 1", + " dest-ne 1", + ), + ), + ConfigLine( + config_line=" exit", + parents=( + "oam", + " cfm", + " maintenance-domain 2", + " maintenance-association 2", + " mep 1", + " service 1", + ), + ), + ConfigLine( + config_line=" no shutdown", + parents=( + "oam", + " cfm", + " maintenance-domain 2", + " maintenance-association 2", + " mep 1", + " service 1", + ), + ), + ConfigLine( + config_line=" exit", + parents=( + "oam", + " cfm", + " maintenance-domain 2", + " maintenance-association 2", + " mep 1", + ), + ), + ConfigLine( + config_line=" exit", + parents=("oam", " cfm", " maintenance-domain 2", " maintenance-association 2"), + ), + ConfigLine(config_line=" exit", parents=("oam", " cfm", " maintenance-domain 2")), + ConfigLine(config_line=" exit", parents=("oam", " cfm")), + ConfigLine(config_line=" maintenance-domain 3", parents=("oam", " cfm")), + ConfigLine( + config_line=' name string "ABC-DEF"', parents=("oam", " cfm", " maintenance-domain 3") + ), + ConfigLine( + config_line=" maintenance-association 2", parents=("oam", " cfm", " maintenance-domain 3") + ), + ConfigLine( + config_line=' name string "MD3"', + parents=("oam", " cfm", " maintenance-domain 3", " maintenance-association 2"), + ), + ConfigLine( + config_line=" mep 2", + parents=("oam", " cfm", " maintenance-domain 3", " maintenance-association 2"), + ), + ConfigLine( + config_line=" bind ethernet 1/10", + parents=( + "oam", + " cfm", + " maintenance-domain 3", + " maintenance-association 2", + " mep 2", + ), + ), + ConfigLine( + config_line=' flow uni-direction rx "MD3-out"', + parents=( + "oam", + " cfm", + " maintenance-domain 3", + " maintenance-association 2", + " mep 2", + ), + ), + ConfigLine( + config_line=' flow uni-direction tx "MD3-in"', + parents=( + "oam", + " cfm", + " maintenance-domain 3", + " maintenance-association 2", + " mep 2", + ), + ), + ConfigLine( + config_line=" remote-mep 1", + parents=( + "oam", + " cfm", + " maintenance-domain 3", + " maintenance-association 2", + " mep 2", + ), + ), + ConfigLine( + config_line=" ccm-priority 3", + parents=( + "oam", + " cfm", + " maintenance-domain 3", + " maintenance-association 2", + " mep 2", + ), + ), + ConfigLine( + config_line=" direction up", + parents=( + "oam", + " cfm", + " maintenance-domain 3", + " maintenance-association 2", + " mep 2", + ), + ), + ConfigLine( + config_line=" customer-tags-excluded", + parents=( + "oam", + " cfm", + " maintenance-domain 3", + " maintenance-association 2", + " mep 2", + ), + ), + ConfigLine( + config_line=" client-md-level 4", + parents=( + "oam", + " cfm", + " maintenance-domain 3", + " maintenance-association 2", + " mep 2", + ), + ), + ConfigLine( + config_line=" no shutdown", + parents=( + "oam", + " cfm", + " maintenance-domain 3", + " maintenance-association 2", + " mep 2", + ), + ), + ConfigLine( + config_line=" service 1", + parents=( + "oam", + " cfm", + " maintenance-domain 3", + " maintenance-association 2", + " mep 2", + ), + ), + ConfigLine( + config_line=" delay-threshold 26000", + parents=( + "oam", + " cfm", + " maintenance-domain 3", + " maintenance-association 2", + " mep 2", + " service 1", + ), + ), + ConfigLine( + config_line=" delay-var-threshold 8000", + parents=( + "oam", + " cfm", + " maintenance-domain 3", + " maintenance-association 2", + " mep 2", + " service 1", + ), + ), + ConfigLine( + config_line=" classification priority-bit 3", + parents=( + "oam", + " cfm", + " maintenance-domain 3", + " maintenance-association 2", + " mep 2", + " service 1", + ), + ), + ConfigLine( + config_line=" dest-ne 1", + parents=( + "oam", + " cfm", + " maintenance-domain 3", + " maintenance-association 2", + " mep 2", + " service 1", + ), + ), + ConfigLine( + config_line=" loss single-ended slm", + parents=( + "oam", + " cfm", + " maintenance-domain 3", + " maintenance-association 2", + " mep 2", + " service 1", + " dest-ne 1", + ), + ), + ConfigLine( + config_line=" remote mep-id 1", + parents=( + "oam", + " cfm", + " maintenance-domain 3", + " maintenance-association 2", + " mep 2", + " service 1", + " dest-ne 1", + ), + ), + ConfigLine( + config_line=' delay-measurement-bin profile "cfm1"', + parents=( + "oam", + " cfm", + " maintenance-domain 3", + " maintenance-association 2", + " mep 2", + " service 1", + " dest-ne 1", + ), + ), + ConfigLine( + config_line=' delay-var-measurement-bin profile "cfm2"', + parents=( + "oam", + " cfm", + " maintenance-domain 3", + " maintenance-association 2", + " mep 2", + " service 1", + " dest-ne 1", + ), + ), + ConfigLine( + config_line=" exit", + parents=( + "oam", + " cfm", + " maintenance-domain 3", + " maintenance-association 2", + " mep 2", + " service 1", + ), + ), + ConfigLine( + config_line=" no shutdown", + parents=( + "oam", + " cfm", + " maintenance-domain 3", + " maintenance-association 2", + " mep 2", + " service 1", + ), + ), + ConfigLine( + config_line=" exit", + parents=( + "oam", + " cfm", + " maintenance-domain 3", + " maintenance-association 2", + " mep 2", + ), + ), + ConfigLine( + config_line=" exit", + parents=("oam", " cfm", " maintenance-domain 3", " maintenance-association 2"), + ), + ConfigLine(config_line=" exit", parents=("oam", " cfm", " maintenance-domain 3")), + ConfigLine(config_line=" exit", parents=("oam", " cfm")), + ConfigLine(config_line=" exit", parents=("oam",)), + ConfigLine(config_line="exit", parents=()), + ConfigLine(config_line=" exit", parents=("exit",)), +] diff --git a/tests/unit/mock/config/parser/base/rad_etx/etx_full_sent.txt b/tests/unit/mock/config/parser/base/rad_etx/etx_full_sent.txt new file mode 100644 index 00000000..b0f3495e --- /dev/null +++ b/tests/unit/mock/config/parser/base/rad_etx/etx_full_sent.txt @@ -0,0 +1,732 @@ + configure + echo "Terminal Configuration" + # Terminal Configuration + terminal + timeout forever + exit + echo "System Configuration" + # System Configuration + system + name "ETX001" + echo "LLDP Configuration" + # LLDP Configuration + lldp + no shutdown + exit + exit + echo "Management configuration" + # Management configuration + management + login-user "net-creds-1" + level su + password "abcdefghijklmnopqrstuvwxyz123456789abcde" hash + no shutdown + exit + login-user "net-creds-2" + level oper + password "abcdefghijklmnopqrstuvwxyz123456789zyxwv" hash + no shutdown + exit + echo "SNMP Configuration" + # SNMP Configuration + snmp + user "snmpv2" none-auth + no shutdown + exit + access-group "snmpv2" snmpv2c no-auth-no-priv + read-view "ntc" + write-view "ntc" + notify-view "ntc" + no shutdown + exit + access-group "v2_read" snmpv2c no-auth-no-priv + write-view "ntc" + exit + security-to-group snmpv2c sec-name "snmpv2" + group-name "snmpv2" + no shutdown + exit + community "ntccommunity" + name "ntccommunity" + sec-name "v2_write" + no shutdown + exit + community "public" + name "public" + sec-name "v2_read" + no shutdown + exit + community "read" + name "private" + sec-name "v2_read" + no shutdown + exit + community "trap" + name "private" + sec-name "v2_trap" + no shutdown + exit + community "trapCommunity" + name "trapCommunity" + sec-name "v2_trap" + no shutdown + exit + community "write" + name "private" + sec-name "v2_write" + no shutdown + exit + target-params "example1" + message-processing-model snmpv2c + version snmpv2c + security name "v2_trap" level no-auth-no-priv + no shutdown + exit + target-params "example2" + message-processing-model snmpv2c + version snmpv2c + security name "v2_trap" level no-auth-no-priv + no shutdown + exit + config-change-notification + exit + exit + echo "Port Configuration" + # Port Configuration + port + l2cp-profile "network" + mac "01-80-c2-00-00-02" peer + mac "01-80-c2-00-00-0e" peer + exit + l2cp-profile "EXAMPLE-ONE" + mac "01-80-c2-00-00-01" discard + exit + l2cp-profile "EXAMPLE-TWO" + mac "01-80-c2-00-00-02" peer + mac "01-80-c2-00-00-0e" peer + exit + l2cp-profile "EXAMPLE-THREE" + mac "01-80-c2-00-00-00" discard + mac "01-80-c2-00-00-01" discard + mac "01-80-c2-00-00-02" discard + mac "01-80-c2-00-00-03" discard + mac "01-80-c2-00-00-04" discard + mac "01-80-c2-00-00-05" discard + mac "01-80-c2-00-00-06" discard + mac "01-80-c2-00-00-07" discard + mac "01-80-c2-00-00-08" discard + mac "01-80-c2-00-00-09" discard + mac "01-80-c2-00-00-0a" discard + mac "01-80-c2-00-00-0b" discard + mac "01-80-c2-00-00-0c" discard + mac "01-80-c2-00-00-0d" discard + mac "01-80-c2-00-00-0e" discard + mac "01-80-c2-00-00-0f" discard + mac "01-80-c2-00-00-10" discard + mac "01-80-c2-00-00-20" discard + mac "01-80-c2-00-00-21" discard + mac "01-80-c2-00-00-22" discard + mac "01-80-c2-00-00-23" discard + mac "01-80-c2-00-00-24" discard + mac "01-80-c2-00-00-25" discard + mac "01-80-c2-00-00-26" discard + mac "01-80-c2-00-00-27" discard + mac "01-80-c2-00-00-28" discard + mac "01-80-c2-00-00-29" discard + mac "01-80-c2-00-00-2a" discard + mac "01-80-c2-00-00-2b" discard + mac "01-80-c2-00-00-2c" discard + mac "01-80-c2-00-00-2d" discard + mac "01-80-c2-00-00-2e" discard + mac "01-80-c2-00-00-2f" discard + mac "01-00-0c-cc-cc-cc" discard + mac "01-00-0c-cc-cc-cd" discard + default discard + exit + l2cp-profile "EXAMPLE-FOUR" + exit + ethernet 1/1 + shutdown + no auto-negotiation + speed-duplex 1000-full-duplex + egress-mtu 9200 + l2cp profile "network" + lldp + nearest-bridge-mode tx-rx + nearest-bridge-basic-management port-description sys-name sys-description sys-capabilities management-address + nearest-bridge-802.3 max-frame-size + exit + exit + ethernet 1/2 + shutdown + name "description for eth1/2" + egress-mtu 9000 + exit + ethernet 1/3 + name "description for eth1/3" + speed-duplex 1000-full-duplex + egress-mtu 12000 + l2cp profile "network" + lldp + nearest-bridge-mode tx-rx + nearest-bridge-basic-management port-description sys-name sys-description sys-capabilities management-address + nearest-bridge-802.3 max-frame-size + exit + exit + ethernet 1/4 + name "description for eth1/4" + tag-ethernet-type 0x88a8 + egress-mtu 12000 + l2cp profile "EXAMPLE-THREE" + exit + ethernet 1/5 + name "description for eth1/5" + egress-mtu 12000 + l2cp profile "EXAMPLE-ONE" + exit + ethernet 1/6 + name "description for eth1/6" + egress-mtu 9000 + exit + ethernet 1/7 + name "description for eth1/7" + egress-mtu 12000 + l2cp profile "EXAMPLE-ONE" + exit + ethernet 1/8 + name "description for eth1/8" + egress-mtu 9008 + l2cp profile "EXAMPLE-THREE" + lldp + nearest-bridge-mode tx-rx + nearest-bridge-basic-management port-description sys-name sys-description sys-capabilities management-address + nearest-bridge-802.3 max-frame-size + exit + exit + ethernet 1/10 + name "description for eth1/9" + egress-mtu 12000 + l2cp profile "EXAMPLE-ONE" + exit + ethernet 3/1 + shutdown + exit + ethernet 3/2 + name "description for eth3/2" + egress-mtu 12000 + l2cp profile "EXAMPLE-ONE" + exit + ethernet 4/1 + name "description for eth4/1" + egress-mtu 12000 + l2cp profile "network" + lldp + nearest-bridge-mode tx-rx + nearest-bridge-basic-management port-description sys-name sys-description sys-capabilities management-address + nearest-bridge-802.3 max-frame-size + exit + exit + ethernet 4/2 + name "description for eth4/2" + exit + echo "Service Virtual Interface- Port Configuration" + # Service Virtual Interface- Port Configuration + svi 1 + name "1" + no shutdown + exit + svi 3 + name "3" + exit + echo "LAG - Port Configuration" + # LAG - Port Configuration + lag 1 + shutdown + bind ethernet 1/1 + bind ethernet 1/2 + anchor-port ethernet 1/1 + exit + lag 7 + shutdown + no anchor-port + exit + exit + echo "Bridge Configuration" + # Bridge Configuration + bridge 1 + name "MGMT" + echo "Bridge Port Configuration" + # Bridge Port Configuration + port 1 + name "svi 1" + no shutdown + exit + port 2 + name "example" + no shutdown + exit + port 3 + name "example" + no shutdown + exit + port 4 + name "example" + no shutdown + exit + port 5 + name "example" + no shutdown + exit + echo "VLAN Configuration" + # VLAN Configuration + vlan 99 + exit + exit + echo "Flows Configuration" + # Flows Configuration + flows + rate-sampling-window 1 + echo "Classifier Profile Configuration" + # Classifier Profile Configuration + classifier-profile "mgmt" match-any + match untagged + exit + classifier-profile "CP-ONE" match-any + match vlan 1103 + exit + classifier-profile "CP-TWO" match-any + match vlan 1103 + exit + classifier-profile "CP-THREE" match-any + match vlan 1201 + exit + classifier-profile "CP-FOUR" match-any + match vlan 1201 + exit + classifier-profile "CP-FIVE" match-any + match vlan 1103 + exit + classifier-profile "CP-SIX" match-any + match vlan 1103 + exit + classifier-profile "CP-SEVEN" match-any + match vlan 1155 dst-ip 192.168.192.2 to-dst-ip 192.168.192.2 + exit + classifier-profile "CP-EIGHT" match-any + match all + exit + classifier-profile "CP-NINE" match-any + match all + exit + classifier-profile "CP-TEN" match-any + match vlan 1155 + exit + classifier-profile "CP-ELEVEN" match-any + match vlan 1202 + exit + classifier-profile "CP-TWELVE" match-any + match all + exit + classifier-profile "CP-A" match-any + match vlan 22 + exit + classifier-profile "CP-B" match-any + match all + exit + classifier-profile "CP-C" match-any + match vlan 777 + exit + classifier-profile "CP-D" match-any + match all + exit + classifier-profile "CP-E" match-any + match vlan 1102 + exit + classifier-profile "CP-F" match-any + match vlan 88 + exit + classifier-profile "CP-G" match-any + match vlan 88 + exit + echo "Flow Configuration" + # Flow Configuration + flow "flow1" + classifier "mgmt" + policer profile "mgmt_policer" + vlan-tag push vlan 99 p-bit fixed 7 + ingress-port svi 1 + egress-port bridge-port 1 1 + reverse-direction + no shutdown + exit + flow "flow2" + classifier "CP-THREE" + policer profile "50m" + mark all + vlan 1201 + p-bit 1 + exit + ingress-port ethernet 3/1 + egress-port ethernet 4/1 queue 1 block 0/1 + service-name "R" + no shutdown + exit + flow "flow3" + classifier "mgmt" + policer profile "mgmt_policer" + vlan-tag push vlan 99 p-bit fixed 7 + ingress-port ethernet 4/1 + egress-port bridge-port 1 2 + reverse-direction block 0/1 + no shutdown + exit + flow "flow4" + classifier "mgmt" + policer profile "mgmt_policer" + vlan-tag push vlan 99 p-bit fixed 7 + ingress-port ethernet 1/1 + egress-port bridge-port 1 4 + reverse-direction block 0/1 + no shutdown + exit + flow "flow5" + classifier "CP-ONE" + no policer + ingress-port ethernet 1/3 + egress-port ethernet 4/1 queue-map-profile "MTU" block 0/1 + service-name "Q" + no shutdown + exit + flow "flow6" + classifier "CP-TWO" + no policer + ingress-port ethernet 4/1 + egress-port ethernet 1/3 queue-map-profile "MTU" block 0/1 + service-name "P" + no shutdown + exit + flow "flow7" + classifier "CP-FOUR" + no policer + mark all + vlan 1201 + exit + ingress-port ethernet 4/1 + egress-port ethernet 3/1 queue 1 block 0/1 + service-name "O" + no shutdown + exit + flow "flow8" + classifier "mgmt" + policer profile "mgmt_policer" + vlan-tag push vlan 99 p-bit fixed 7 + ingress-port ethernet 1/8 + egress-port bridge-port 1 5 + reverse-direction block 0/1 + no shutdown + exit + flow "flow9" + shutdown + classifier "mgmt" + policer profile "Policer1" + vlan-tag push vlan 1111 p-bit fixed 4 + ingress-port ethernet 3/1 + egress-port ethernet 4/2 queue 1 block 0/1 + service-name "N" + pm-collection interval 300 + exit + flow "flow10" + classifier "CP-EIGHT" + policer profile "10m" + vlan-tag push vlan 1202 p-bit fixed 3 + ingress-port ethernet 3/2 + egress-port ethernet 4/1 queue 1 block 0/1 + service-name "M" + no shutdown + exit + flow "flow11" + classifier "CP-ELEVEN" + no policer + vlan-tag pop vlan + ingress-port ethernet 4/1 + egress-port ethernet 3/2 queue 1 block 0/1 + service-name "L" + no shutdown + exit + flow "flow12" + shutdown + classifier "CP-FIVE" + no policer + ingress-port ethernet 1/3 + egress-port ethernet 4/1 queue-map-profile "MTU" block 0/1 + service-name "K" + exit + flow "flow13" + classifier "CP-SEVEN" + policer profile "2g" + mark all + mac swap + ip swap + exit + ingress-port ethernet 4/1 + egress-port ethernet 4/1 queue 0 block 0/1 + no shutdown + exit + flow "flow14" + shutdown + classifier "CP-SIX" + no policer + ingress-port ethernet 4/1 + egress-port ethernet 1/3 queue-map-profile "MTU" block 0/1 + service-name "J" + exit + flow "flow15" + classifier "CP-NINE" + policer profile "2g" + vlan-tag push vlan 1155 p-bit fixed 1 + ingress-port ethernet 1/5 + egress-port ethernet 4/1 queue 1 block 0/1 + service-name "I" + no shutdown + exit + flow "flow16" + classifier "CP-TEN" + no policer + vlan-tag pop vlan + ingress-port ethernet 4/1 + egress-port ethernet 1/5 queue 1 block 0/1 + service-name "H" + no shutdown + exit + flow "flow17" + classifier "CP-D" + policer profile "100m" + vlan-tag push vlan 1102 p-bit fixed 1 + ingress-port ethernet 1/7 + egress-port ethernet 4/1 queue 1 block 0/1 + service-name "G" + no shutdown + exit + flow "flow18" + classifier "CP-TWELVE" + policer profile "50m" + vlan-tag push vlan 22 p-bit fixed 3 + ingress-port ethernet 1/8 + egress-port ethernet 4/1 queue 1 block 0/1 + service-name "F" + no shutdown + exit + flow "flow19" + classifier "CP-A" + no policer + vlan-tag pop vlan + ingress-port ethernet 4/1 + egress-port ethernet 1/8 queue 1 block 0/1 + service-name "E" + no shutdown + exit + flow "flow20" + classifier "CP-E" + no policer + vlan-tag pop vlan + ingress-port ethernet 4/1 + egress-port ethernet 1/7 queue 1 block 0/1 + service-name "D" + no shutdown + exit + flow "flow21" + classifier "CP-B" + policer profile "100_Mbps" + vlan-tag push vlan 777 p-bit fixed 3 + ingress-port ethernet 1/10 + egress-port ethernet 4/1 queue 1 block 0/1 + service-name "C" + no shutdown + exit + flow "flow22" + classifier "CP-C" + no policer + vlan-tag pop vlan + ingress-port ethernet 4/1 + egress-port ethernet 1/10 queue 1 block 0/1 + service-name "B" + no shutdown + exit + flow "flow23" + classifier "CP-F" + no policer + ingress-port ethernet 1/3 + egress-port ethernet 4/1 queue 1 block 0/1 + service-name "A" + no shutdown + exit + flow "flow24" + classifier "CP-G" + no policer + ingress-port ethernet 4/1 + egress-port ethernet 1/3 queue 1 block 0/1 + service-name "A" + no shutdown + exit + exit + router 1 + name "Router#1" + interface 1 + name "ROUTER:DESCRIPTION" + bind svi 1 + dhcp + dhcp-client + client-id mac + exit + no shutdown + exit + static-route 0.0.0.0/0 address 1.1.1.1 metric 1 + exit + exit + configure + oam + echo "OAM CFM Configuration" + # OAM CFM Configuration + cfm + md-level-mip 2 + measurement-bin-profile "cfm1" + thresholds 8000,10000,11200,14000 + exit + measurement-bin-profile "cfm2" + thresholds 1600,2000,2400,3000 + exit + measurement-bin-profile "cfm3" + thresholds 20000,25000,28000,35000 + exit + measurement-bin-profile "cfm4" + thresholds 3200,4000,6400,8000 + exit + measurement-bin-profile "cfm5" + thresholds 61600,77000,110400,138000 + exit + measurement-bin-profile "cfm5" + thresholds 8000,10000 + exit + measurement-bin-profile "cfm6" + thresholds 16000,20000,32000,40000 + exit + measurement-bin-profile "cfm7" + thresholds 6400,8000 + exit + measurement-bin-profile "cfm8" + thresholds 60000,75000,120000,150000 + exit + measurement-bin-profile "cfm9" + thresholds 32000,40000 + exit + measurement-bin-profile "cfma" + thresholds 92000,115000,184000,230000 + exit + measurement-bin-profile "cfmb" + thresholds 32000,40000 + exit + measurement-bin-profile "cfmc" + thresholds 29600,37000,59200,74000 + exit + measurement-bin-profile "cfmd" + thresholds 100000,110400,125000,138000 + exit + measurement-bin-profile "cfme" + thresholds 184000,230000,368000,460000 + exit + measurement-bin-profile "cfmf" + thresholds 8000,10000,40000,50000 + exit + measurement-bin-profile "cfmg" + thresholds 9600,12000 + exit + measurement-bin-profile "cfmh" + thresholds 40000,50000 + exit + measurement-bin-profile "cfmi" + thresholds 59200,74000 + exit + measurement-bin-profile "cfmj" + thresholds 9600,12000 + exit + measurement-bin-profile "cfmk" + thresholds 200000,250000 + exit + measurement-bin-profile "cfml" + thresholds 40000,50000 + exit + measurement-bin-profile "cfmm" + thresholds 368000,460000 + exit + measurement-bin-profile "cfmn" + thresholds 40000,50000 + exit + maintenance-domain 1 + name string "MD1" + maintenance-association 1 + name string "MA1" + mep 1 + no bind + client-md-level 4 + exit + exit + exit + maintenance-domain 2 + md-level 2 + name string "ABC-DEF" + maintenance-association 2 + name string "MA2" + mep 1 + bind ethernet 1/8 + flow uni-direction rx "MA2-out" + flow uni-direction tx "MA2-in" + remote-mep 2 + direction up + customer-tags-excluded + client-md-level 3 + no shutdown + service 1 + classification priority-bit 3 + lmm-interval 100ms + dest-ne 1 + no delay + no loss + remote mep-id 2 + exit + no shutdown + exit + exit + exit + exit + maintenance-domain 3 + name string "ABC-DEF" + maintenance-association 2 + name string "MD3" + mep 2 + bind ethernet 1/10 + flow uni-direction rx "MD3-out" + flow uni-direction tx "MD3-in" + remote-mep 1 + ccm-priority 3 + direction up + customer-tags-excluded + client-md-level 4 + no shutdown + service 1 + delay-threshold 26000 + delay-var-threshold 8000 + classification priority-bit 3 + dest-ne 1 + loss single-ended slm + remote mep-id 1 + delay-measurement-bin profile "cfm1" + delay-var-measurement-bin profile "cfm2" + exit + no shutdown + exit + exit + exit + exit + exit + exit + exit diff --git a/tests/unit/test_bandwidth.py b/tests/unit/test_bandwidth.py index 9f928940..d1afd8fd 100644 --- a/tests/unit/test_bandwidth.py +++ b/tests/unit/test_bandwidth.py @@ -1,8 +1,8 @@ """Test for the Bandwidth functions.""" import pytest -from netutils import bandwidth +from netutils import bandwidth name_to_bits = [ {"sent": "10Mbps", "received": 10000000}, diff --git a/tests/unit/test_banner.py b/tests/unit/test_banner.py index 4c03ec52..08948ee9 100644 --- a/tests/unit/test_banner.py +++ b/tests/unit/test_banner.py @@ -1,8 +1,8 @@ """Test for the banner functions.""" import pytest -from netutils import banner +from netutils import banner BANNER_CARET_C = "banner login ^C\n******************\n TEST BANNER\n******************\n^C" diff --git a/tests/unit/test_basics.py b/tests/unit/test_basics.py index 515dfba9..796f0122 100644 --- a/tests/unit/test_basics.py +++ b/tests/unit/test_basics.py @@ -2,6 +2,7 @@ import os import unittest + import toml diff --git a/tests/unit/test_compliance.py b/tests/unit/test_compliance.py index dc5c796a..ed3d547d 100644 --- a/tests/unit/test_compliance.py +++ b/tests/unit/test_compliance.py @@ -4,6 +4,7 @@ import os import pytest + from netutils.config import compliance MOCK_DIR = os.path.join(os.path.dirname(os.path.realpath(__file__)), "mock", "config", "compliance") @@ -39,9 +40,7 @@ def test_section_config(_file, network_os, get_text_data, get_python_data): # p @pytest.mark.parametrize("_file, network_os", compliance_parameters) -def test_compliance( - _file, network_os, get_json_data, get_text_data, get_python_data -): # pylint: disable=redefined-outer-name +def test_compliance(_file, network_os, get_json_data, get_text_data, get_python_data): # pylint: disable=redefined-outer-name truncate_file = os.path.join(MOCK_DIR, _file[: -len(INTEND_FILE)]) intended_cfg = get_text_data(os.path.join(MOCK_DIR, _file)) @@ -72,9 +71,7 @@ def test_find_unordered_cfg_lines(_file, get_text_data, get_python_data): @pytest.mark.parametrize("_file, network_os", config_section_not_parsed_parameters) -def test_config_section_not_parsed( - _file, network_os, get_json_data, get_text_data, get_python_data -): # pylint: disable=redefined-outer-name +def test_config_section_not_parsed(_file, network_os, get_json_data, get_text_data, get_python_data): # pylint: disable=redefined-outer-name truncate_file = os.path.join(MOCK_DIR, _file[: -len(TXT_FILE)]) device_cfg = get_text_data(os.path.join(MOCK_DIR, _file)) diff --git a/tests/unit/test_conversion.py b/tests/unit/test_conversion.py index e084c000..167bac79 100644 --- a/tests/unit/test_conversion.py +++ b/tests/unit/test_conversion.py @@ -4,9 +4,10 @@ import os import pytest + from netutils.config.conversion import ( - paloalto_panos_brace_to_set, conversion_map, + paloalto_panos_brace_to_set, ) MOCK_DIR = os.path.join(os.path.dirname(os.path.realpath(__file__)), "mock", "config", "conversion") diff --git a/tests/unit/test_dns.py b/tests/unit/test_dns.py index 3e0a19af..3be9fde1 100644 --- a/tests/unit/test_dns.py +++ b/tests/unit/test_dns.py @@ -1,11 +1,11 @@ """Test for the DNS based functions.""" import socket + import pytest from netutils import dns, ip - test_is_fqdn = [ {"sent": "google.com", "received": True}, {"sent": "yahoo.com", "received": True}, diff --git a/tests/unit/test_hash.py b/tests/unit/test_hash.py index 36b24f64..db689fe3 100644 --- a/tests/unit/test_hash.py +++ b/tests/unit/test_hash.py @@ -4,7 +4,6 @@ from netutils.hash import hash_data - EXPECTED_HASHES = [ ( "md5", diff --git a/tests/unit/test_ip.py b/tests/unit/test_ip.py index b4743b4e..2553dd73 100644 --- a/tests/unit/test_ip.py +++ b/tests/unit/test_ip.py @@ -1,6 +1,7 @@ """Test for the IP functions.""" import ipaddress + import pytest from netutils import ip diff --git a/tests/unit/test_lib_helpers.py b/tests/unit/test_lib_helpers.py index 472400f6..7de1fb7a 100755 --- a/tests/unit/test_lib_helpers.py +++ b/tests/unit/test_lib_helpers.py @@ -3,6 +3,7 @@ from unittest import mock import pytest + from netutils.lib_helpers import get_napalm_getters diff --git a/tests/unit/test_lib_helpers_optionals.py b/tests/unit/test_lib_helpers_optionals.py index c1cee5bb..f53bc3d2 100755 --- a/tests/unit/test_lib_helpers_optionals.py +++ b/tests/unit/test_lib_helpers_optionals.py @@ -3,6 +3,7 @@ from unittest import mock import pytest + from netutils.lib_helpers import get_napalm_getters diff --git a/tests/unit/test_nist.py b/tests/unit/test_nist.py index 8e63e720..2d1c8302 100644 --- a/tests/unit/test_nist.py +++ b/tests/unit/test_nist.py @@ -2,7 +2,7 @@ import pytest -from netutils.nist import get_nist_urls +from netutils import nist platform_nist_urls = [ { @@ -33,6 +33,18 @@ # Testing the composition of the nist url(s) created for a platform @pytest.mark.parametrize("data", platform_nist_urls) -def test_platform_nist(data): - platform_obj = get_nist_urls(data["sent"]["network_driver"], data["sent"]["version"]) +def test_get_nist_urls(data): + platform_obj = nist.get_nist_urls(data["sent"]["network_driver"], data["sent"]["version"]) assert platform_obj == data["received"] + + +def test_get_nist_urls_failed(): + with pytest.raises( + ValueError, match=r"The network driver `fakeos` has no associated mapping, the supported drivers are*" + ): + nist.get_nist_urls("fakeos", "15.5") + + +def test_get_nist_vendor_platform_urls(): + platform_obj = nist.get_nist_vendor_platform_urls("cisco", "ios", "15.5") + assert platform_obj == ["https://services.nvd.nist.gov/rest/json/cves/2.0?cpeName=cpe:2.3:o:cisco:ios:15.5:*"] diff --git a/tests/unit/test_os_versions.py b/tests/unit/test_os_versions.py index 11d23332..e647fd6e 100755 --- a/tests/unit/test_os_versions.py +++ b/tests/unit/test_os_versions.py @@ -1,10 +1,10 @@ """Test for the lib_helpers definitions.""" import pytest + from netutils import os_version from netutils.constants import UPGRADE_PATHS - LOOSE_VERSION = [ {"sent": {"current_version": "10.1", "comparison": ">=", "target_version": "10.2"}, "received": False}, {"sent": {"current_version": "2.0.1", "comparison": "<", "target_version": "2.0.2"}, "received": True}, diff --git a/tests/unit/test_parser.py b/tests/unit/test_parser.py index 26a50963..84be8ccd 100644 --- a/tests/unit/test_parser.py +++ b/tests/unit/test_parser.py @@ -44,9 +44,7 @@ def test_find_all_children(_file, network_os, get_text_data, get_json_data): # @pytest.mark.parametrize("_file, network_os", find_children_w_parents_parameters) -def test_find_children_w_parents( - _file, network_os, get_text_data, get_json_data -): # pylint: disable=redefined-outer-name +def test_find_children_w_parents(_file, network_os, get_text_data, get_json_data): # pylint: disable=redefined-outer-name truncate_file = os.path.join(MOCK_DIR, "find_children_w_parents", _file[: -len(TXT_FILE)]) device_cfg = get_text_data(os.path.join(MOCK_DIR, "find_children_w_parents", _file)) @@ -80,3 +78,20 @@ def test_duplicate_line(): ) with pytest.raises(IndexError, match=r".*This error is likely from a duplicate line detected.*"): compliance.parser_map["cisco_ios"](logging).config_lines # pylint: disable=expression-not-assigned + + +@pytest.mark.parametrize("network_os", ["cisco_ios", "arista_eos", "cisco_iosxr"]) +def test_leading_spaces_config_start(network_os): # pylint: disable=redefined-outer-name + logging = ( + "! Command: show running-config\n" + " 24.1.4\n" + "!\n" + "no aaa root\n" + "!\n" + "management api http-commands\n" + " no shutdown\n" + "no service interface inactive port-id allocation disabled\n" + "transceiver qsfp default-mode 4x10G\n" + ) + with pytest.raises(IndexError, match=r".*Validate the first line does not begin with a space.*"): + compliance.parser_map[network_os](logging).config_lines # pylint: disable=expression-not-assigned diff --git a/tests/unit/test_private_version.py b/tests/unit/test_private_version.py index ab8e2315..72852430 100644 --- a/tests/unit/test_private_version.py +++ b/tests/unit/test_private_version.py @@ -5,8 +5,8 @@ # Taken from https://github.com/python/cpython/blob/3.11/Lib/distutils/tests/test_version.py import unittest -from netutils._private.version import LooseVersion -from netutils._private.version import StrictVersion + +from netutils._private.version import LooseVersion, StrictVersion class VersionTestCase(unittest.TestCase): @@ -45,7 +45,7 @@ def test_cmp_strict(self): if wanted is ValueError: continue else: - raise AssertionError(("cmp(%s, %s) " "shouldn't raise ValueError") % (v1, v2)) + raise AssertionError(("cmp(%s, %s) shouldn't raise ValueError") % (v1, v2)) self.assertEqual(res, wanted, "cmp(%s, %s) should be %s, got %s" % (v1, v2, wanted, res)) res = StrictVersion(v1)._cmp(v2) self.assertEqual(res, wanted, "cmp(%s, %s) should be %s, got %s" % (v1, v2, wanted, res)) diff --git a/tests/unit/test_protocol_mapper.py b/tests/unit/test_protocol_mapper.py index 8f17a4b8..52c4a5c8 100644 --- a/tests/unit/test_protocol_mapper.py +++ b/tests/unit/test_protocol_mapper.py @@ -3,16 +3,16 @@ import pytest from netutils.protocol_mapper import ( + DCCP_NAME_TO_NUM, + DCCP_NUM_TO_NAME, PROTO_NAME_TO_NUM, PROTO_NUM_TO_NAME, + SCTP_NAME_TO_NUM, + SCTP_NUM_TO_NAME, TCP_NAME_TO_NUM, TCP_NUM_TO_NAME, UDP_NAME_TO_NUM, UDP_NUM_TO_NAME, - SCTP_NAME_TO_NUM, - SCTP_NUM_TO_NAME, - DCCP_NAME_TO_NUM, - DCCP_NUM_TO_NAME, ) diff --git a/tests/unit/test_running_config.py b/tests/unit/test_running_config.py index c06e5fd2..962e9be2 100644 --- a/tests/unit/test_running_config.py +++ b/tests/unit/test_running_config.py @@ -1,6 +1,7 @@ """Tests for the running configuration command mapping.""" import pytest + from netutils import lib_mapper from netutils.running_config import get_running_config_command diff --git a/tests/unit/test_sanitize.py b/tests/unit/test_sanitize.py index b1fee4b8..045d1b89 100644 --- a/tests/unit/test_sanitize.py +++ b/tests/unit/test_sanitize.py @@ -4,6 +4,7 @@ import os import pytest + from netutils.config import compliance from netutils.config.conversion import paloalto_panos_clean_newlines diff --git a/tests/unit/test_time.py b/tests/unit/test_time.py index b8fd0a51..b836d5ff 100644 --- a/tests/unit/test_time.py +++ b/tests/unit/test_time.py @@ -1,7 +1,8 @@ """Test for the time functions.""" import pytest -from netutils.time import uptime_string_to_seconds, uptime_seconds_to_string + +from netutils.time import uptime_seconds_to_string, uptime_string_to_seconds UPTIME_TO_STRING = [ { diff --git a/tests/unit/test_utils.py b/tests/unit/test_utils.py index a1a1d145..e27b1560 100644 --- a/tests/unit/test_utils.py +++ b/tests/unit/test_utils.py @@ -8,6 +8,7 @@ import pytest from jinja2 import Environment, select_autoescape from jinja2.loaders import FileSystemLoader + from netutils.utils import _JINJA2_FUNCTION_MAPPINGS, jinja2_convenience_function _EXCLUDED_FILES = [ diff --git a/tests/unit/test_version.py b/tests/unit/test_version.py index 8c0c18be..770f4cae 100644 --- a/tests/unit/test_version.py +++ b/tests/unit/test_version.py @@ -1,7 +1,8 @@ """Basic test for version check.""" -import unittest import os +import unittest + import toml from netutils import __version__ as project_version diff --git a/tests/unit/test_vlan.py b/tests/unit/test_vlan.py index d5a0e508..3a836837 100644 --- a/tests/unit/test_vlan.py +++ b/tests/unit/test_vlan.py @@ -1,7 +1,7 @@ """Test for the VLAN functions.""" -import os import glob +import os import pytest diff --git a/towncrier_template.j2 b/towncrier_template.j2 new file mode 100644 index 00000000..2c1316f5 --- /dev/null +++ b/towncrier_template.j2 @@ -0,0 +1,42 @@ + +# v{{ versiondata.version.split(".")[:2] | join(".") }} Release Notes + +This document describes all new features and changes in the release. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## Release Overview + +- Major features or milestones +- Changes to compatibility with Nautobot and/or other apps, libraries etc. + +{% if render_title %} +## [v{{ versiondata.version }} ({{ versiondata.date }})](https://github.com/networktocode/netutils/releases/tag/v{{ versiondata.version}}) + +{% endif %} +{% for section, _ in sections.items() %} +{% if sections[section] %} +{% for category, val in definitions.items() if category in sections[section] %} +{% if sections[section][category]|length != 0 %} +### {{ definitions[category]['name'] }} + +{% if definitions[category]['showcontent'] %} +{% for text, values in sections[section][category].items() %} +{% for item in text.split('\n') %} +{% if values %} +- {{ values|join(', ') }} - {{ item.strip() }} +{% else %} +- {{ item.strip() }} +{% endif %} +{% endfor %} +{% endfor %} + +{% else %} +- {{ sections[section][category]['']|join(', ') }} + +{% endif %} +{% endif %} +{% endfor %} +{% else %} +No significant changes. + +{% endif %} +{% endfor %}