{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# All methods of using tests\n", "\n", "There are some things you can and some things you can't do with tests. This tutorial will show all of them." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "from nornir_tests.plugins.tests import *\n", "from nornir_tests.plugins.tasks import wrap_task\n", "from nornir_napalm.plugins.tasks import napalm_get, napalm_ping\n", "from nornir_tests.plugins.functions import print_result\n", "from nornir import InitNornir\n", "\n", "nr = InitNornir(\n", " inventory={\n", " \"plugin\": \"SimpleInventory\",\n", " \"options\": {\n", " \"host_file\": \"data/hosts.yaml\",\n", " \"group_file\": \"data/groups.yaml\",\n", " \"defaults_file\": \"data/defaults.yaml\",\n", " },\n", " },\n", ")\n", "\n", "vyos = nr.filter(name=\"vyos\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## @ style decorator use\n", "\n", "This will only work as designed if not using task.run inside the function. If there were a bunch of task.run statements in the function the decorators applied using @ syntax would not get applied." ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "tags": [] }, "outputs": [ { "output_type": "stream", "name": "stdout", "text": "\u001b[1m\u001b[36mat_syntax_test******************************************************************\u001b[0m\n\u001b[0m\u001b[1m\u001b[34m* vyos ** changed : False ******************************************************\u001b[0m\n\u001b[0m\u001b[1m\u001b[32mvvvv at_syntax_test ** changed : False vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv INFO\u001b[0m\n\u001b[0m{\u001b[0m\u001b[0m'interfaces'\u001b[0m:\u001b[0m{\u001b[0m\u001b[0m'eth0'\u001b[0m:\u001b[0m{\u001b[0m\u001b[0m'description'\u001b[0m:\u001b[0m''\u001b[0m,\n\u001b[0m'is_enabled'\u001b[0m:\u001b[0mTrue\u001b[0m,\n\u001b[0m'is_up'\u001b[0m:\u001b[0mTrue\u001b[0m,\n\u001b[0m'last_flapped'\u001b[0m:\u001b[0m-1.0\u001b[0m,\n\u001b[0m'mac_address'\u001b[0m:\u001b[0m'08:00:27:e0:28:63'\u001b[0m,\n\u001b[0m'mtu'\u001b[0m:\u001b[0m-1\u001b[0m,\n\u001b[0m'speed'\u001b[0m:\u001b[0m0\u001b[0m}\u001b[0m,\n\u001b[0m'lo'\u001b[0m:\u001b[0m{\u001b[0m\u001b[0m'description'\u001b[0m:\u001b[0m''\u001b[0m,\n\u001b[0m'is_enabled'\u001b[0m:\u001b[0mTrue\u001b[0m,\n\u001b[0m'is_up'\u001b[0m:\u001b[0mTrue\u001b[0m,\n\u001b[0m'last_flapped'\u001b[0m:\u001b[0m-1.0\u001b[0m,\n\u001b[0m'mac_address'\u001b[0m:\u001b[0m'00:00:00:00:00:00'\u001b[0m,\n\u001b[0m'mtu'\u001b[0m:\u001b[0m-1\u001b[0m,\n\u001b[0m'speed'\u001b[0m:\u001b[0m0\u001b[0m}\u001b[0m}\u001b[0m}\u001b[0m\n\u001b[0m\u001b[2m\u001b[32mP JpathRecord - {'assertion': 'is_true',\n 'fail_task': True,\n 'path': 'interfaces.eth0.is_enabled',\n 'result_attr': 'result'}\u001b[0m\n\u001b[0m\u001b[2m\u001b[32m{'matches': ['interfaces.eth0.is_enabled']}\u001b[0m\n\u001b[0m\u001b[2m\u001b[32mP TimingRecord - {'fail_task': True, 'max_run_time': 5}\u001b[0m\n\u001b[0m\u001b[2m\u001b[32m{'run_time': 2.0251331329345703,\n 't0': 1600801296.0013554,\n 't1': 1600801298.0264885}\u001b[0m\n\u001b[0m\u001b[2m\u001b[32mP UntilRecord - {'delay': 5, 'retries': 5}\u001b[0m\n\u001b[0m\u001b[2m\u001b[32m{'run_time': 13.532038927078247,\n 't0': 1600801284.494459,\n 't1': 1600801298.0264978}\u001b[0m\n\u001b[0m\u001b[1m\u001b[32m^^^^ END at_syntax_test ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\u001b[0m\n\u001b[0m" } ], "source": [ "@until(retries=5, delay=5)\n", "@timing(max_run_time=5, fail_task=True)\n", "@jpath(path='interfaces.eth0.is_enabled', assertion='is_true', fail_task=True)\n", "def at_syntax_test(task):\n", " return napalm_get(task, getters=['interfaces'])\n", "\n", "print_result(vyos.run(task=at_syntax_test), vars=['result', 'tests'])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Using nr.run with tasks that return results" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "tags": [] }, "outputs": [ { "output_type": "stream", "name": "stdout", "text": "\u001b[1m\u001b[36mnapalm_get**********************************************************************\u001b[0m\n\u001b[0m\u001b[1m\u001b[34m* vyos ** changed : False ******************************************************\u001b[0m\n\u001b[0m\u001b[1m\u001b[32mvvvv napalm_get ** changed : False vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv INFO\u001b[0m\n\u001b[0m{\u001b[0m\u001b[0m'interfaces'\u001b[0m:\u001b[0m{\u001b[0m\u001b[0m'eth0'\u001b[0m:\u001b[0m{\u001b[0m\u001b[0m'description'\u001b[0m:\u001b[0m''\u001b[0m,\n\u001b[0m'is_enabled'\u001b[0m:\u001b[0mTrue\u001b[0m,\n\u001b[0m'is_up'\u001b[0m:\u001b[0mTrue\u001b[0m,\n\u001b[0m'last_flapped'\u001b[0m:\u001b[0m-1.0\u001b[0m,\n\u001b[0m'mac_address'\u001b[0m:\u001b[0m'08:00:27:e0:28:63'\u001b[0m,\n\u001b[0m'mtu'\u001b[0m:\u001b[0m-1\u001b[0m,\n\u001b[0m'speed'\u001b[0m:\u001b[0m0\u001b[0m}\u001b[0m,\n\u001b[0m'lo'\u001b[0m:\u001b[0m{\u001b[0m\u001b[0m'description'\u001b[0m:\u001b[0m''\u001b[0m,\n\u001b[0m'is_enabled'\u001b[0m:\u001b[0mTrue\u001b[0m,\n\u001b[0m'is_up'\u001b[0m:\u001b[0mTrue\u001b[0m,\n\u001b[0m'last_flapped'\u001b[0m:\u001b[0m-1.0\u001b[0m,\n\u001b[0m'mac_address'\u001b[0m:\u001b[0m'00:00:00:00:00:00'\u001b[0m,\n\u001b[0m'mtu'\u001b[0m:\u001b[0m-1\u001b[0m,\n\u001b[0m'speed'\u001b[0m:\u001b[0m0\u001b[0m}\u001b[0m}\u001b[0m}\u001b[0m\n\u001b[0m\u001b[2m\u001b[32mP TimingRecord - {'max_run_time': 9223372036854775807}\u001b[0m\n\u001b[0m\u001b[2m\u001b[32m{'run_time': 2.011794090270996,\n 't0': 1600801298.441358,\n 't1': 1600801300.4531522}\u001b[0m\n\u001b[0m\u001b[2m\u001b[32mP JpathRecord - {'assertion': 'is_true',\n 'path': 'interfaces.eth0.is_up',\n 'result_attr': 'result'}\u001b[0m\n\u001b[0m\u001b[2m\u001b[32m{'matches': ['interfaces.eth0.is_up']}\u001b[0m\n\u001b[0m\u001b[1m\u001b[32m^^^^ END napalm_get ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\u001b[0m\n\u001b[0m" } ], "source": [ "nr.data.reset_failed_hosts()\n", "print_result(vyos.run(\n", " task=wrap_task(napalm_get),\n", " getters=['interfaces'],\n", " tests=[\n", " timing(),\n", " jpath(path='interfaces.eth0.is_up', assertion='is_true')\n", " ]\n", "), vars=['result', 'tests'])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Using task.run inside grouped task" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "tags": [] }, "outputs": [ { "output_type": "stream", "name": "stdout", "text": "\u001b[1m\u001b[36mgrouped_task********************************************************************\u001b[0m\n\u001b[0m\u001b[1m\u001b[34m* vyos ** changed : False ******************************************************\u001b[0m\n\u001b[0m\u001b[1m\u001b[32mvvvv grouped_task ** changed : False vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv INFO\u001b[0m\n\u001b[0m\u001b[1m\u001b[32m---- napalm_ping ** changed : False -------------------------------------------- INFO\u001b[0m\n\u001b[0m{\u001b[0m\u001b[0m'success'\u001b[0m:\u001b[0m{\u001b[0m\u001b[0m'packet_loss'\u001b[0m:\u001b[0m0\u001b[0m,\n\u001b[0m'probes_sent'\u001b[0m:\u001b[0m5\u001b[0m,\n\u001b[0m'results'\u001b[0m:\u001b[0m[{'ip_address': '192.168.99.1', 'rtt': 3.588}]\u001b[0m,\n\u001b[0m'rtt_avg'\u001b[0m:\u001b[0m3.588\u001b[0m,\n\u001b[0m'rtt_max'\u001b[0m:\u001b[0m4.07\u001b[0m,\n\u001b[0m'rtt_min'\u001b[0m:\u001b[0m3.105\u001b[0m,\n\u001b[0m'rtt_stddev'\u001b[0m:\u001b[0m0.35\u001b[0m}\u001b[0m}\u001b[0m\n\u001b[0m\u001b[2m\u001b[32mP TimingRecord - {'max_run_time': 9223372036854775807}\u001b[0m\n\u001b[0m\u001b[2m\u001b[32m{'run_time': 4.9137420654296875,\n 't0': 1600801300.7780375,\n 't1': 1600801305.6917796}\u001b[0m\n\u001b[0m\u001b[1m\u001b[32m---- napalm_get ** changed : False --------------------------------------------- INFO\u001b[0m\n\u001b[0m{\u001b[0m\u001b[0m'interfaces'\u001b[0m:\u001b[0m{\u001b[0m\u001b[0m'eth0'\u001b[0m:\u001b[0m{\u001b[0m\u001b[0m'description'\u001b[0m:\u001b[0m''\u001b[0m,\n\u001b[0m'is_enabled'\u001b[0m:\u001b[0mTrue\u001b[0m,\n\u001b[0m'is_up'\u001b[0m:\u001b[0mTrue\u001b[0m,\n\u001b[0m'last_flapped'\u001b[0m:\u001b[0m-1.0\u001b[0m,\n\u001b[0m'mac_address'\u001b[0m:\u001b[0m'08:00:27:e0:28:63'\u001b[0m,\n\u001b[0m'mtu'\u001b[0m:\u001b[0m-1\u001b[0m,\n\u001b[0m'speed'\u001b[0m:\u001b[0m0\u001b[0m}\u001b[0m,\n\u001b[0m'lo'\u001b[0m:\u001b[0m{\u001b[0m\u001b[0m'description'\u001b[0m:\u001b[0m''\u001b[0m,\n\u001b[0m'is_enabled'\u001b[0m:\u001b[0mTrue\u001b[0m,\n\u001b[0m'is_up'\u001b[0m:\u001b[0mTrue\u001b[0m,\n\u001b[0m'last_flapped'\u001b[0m:\u001b[0m-1.0\u001b[0m,\n\u001b[0m'mac_address'\u001b[0m:\u001b[0m'00:00:00:00:00:00'\u001b[0m,\n\u001b[0m'mtu'\u001b[0m:\u001b[0m-1\u001b[0m,\n\u001b[0m'speed'\u001b[0m:\u001b[0m0\u001b[0m}\u001b[0m}\u001b[0m}\u001b[0m\n\u001b[0m\u001b[2m\u001b[32mP JpathRecord - {'assertion': 'is_true',\n 'path': 'interfaces.eth0.is_up',\n 'result_attr': 'result'}\u001b[0m\n\u001b[0m\u001b[2m\u001b[32m{'matches': ['interfaces.eth0.is_up']}\u001b[0m\n\u001b[0m\u001b[1m\u001b[32m^^^^ END grouped_task ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\u001b[0m\n\u001b[0m" } ], "source": [ "def grouped_task(task):\n", " task.run(\n", " wrap_task(napalm_ping),\n", " dest='192.168.99.1',\n", " tests=[\n", " timing()\n", " ]\n", " )\n", "\n", " task.run(\n", " wrap_task(napalm_get), \n", " getters=['interfaces'], \n", " tests=[\n", " jpath(path='interfaces.eth0.is_up', assertion='is_true')\n", " ]\n", " )\n", "\n", "print_result(vyos.run(task=grouped_task), vars=['result', 'tests'])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Not supported\n", "\n", "Testing a grouped_task at the level of running nr.run will not work. There is not much you would be able to test without really complex logic anyhow considering this always returns an AggregatedResult." ] } ], "metadata": { "kernelspec": { "display_name": "Python 3.8.2 64-bit ('.venv': venv)", "language": "python", "name": "python38264bitvenvvenv1c35bb63d8ff4e6aa6d1792b190afa1b" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.2-final" } }, "nbformat": 4, "nbformat_minor": 2 }