Reports and Structured Data¶
Table of Contents:
The important functionality of the toolkit is the ability to produce reports about data collection process in YAML, JSON, and JUnit formats.
This functionality enables the plugin’s integration with Jenkins, CircleCI, Travis, or any other. Additionally, it provides the ability to Artificial Intelligence (AI) frameworks to understand what the data is, without doing any heavy-lifting. In a sense, the structured data available in the reports becomes an anchor.
JUnit Reporting¶
The plugin produces reports in JUnit XML format on per host basis.
Each of the JUnit files has the following testsuites:
ndmtk.connect
ndmtk.execute
ndmtk.disconnect
For example, the ndmtk.connect
testsuite of ny-sw01
has the following information.
The information is self explanatory. Importanly, the plugin captures terminal output
during connection establishment, authentication, and authorization.
<?xml version="1.0" encoding="UTF-8"?>
<testsuites>
<testsuite hostname="ny-sw01" name="ndmtk.connect" errors="0" skipped="0" tests="1" failures="0" time="0.41" timestamp="2017-01-15T14:00:20">
<properties>
<property name="host" value="ny-sw01"/>
<property name="os" value="arista_eos"/>
<property name="output_dir" value="/tmp/test-20170115140020"/>
<property name="on_error" value="continue"/>
<property name="on_prompt" value="abort"/>
<property name="temp_dir" value="/home/greenpau/.ansible/tmp/ndmtk/f3814002-db2a-11e6-87ef-f45c89b1bb39/f3934fe8-db2a-11e6-bffd-f45c89b1bb39/ny-sw01"/>
<property name="args" value="ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -p 8224 -tt admin@localhost"/>
<property name="play_uuid" value="f3814002-db2a-11e6-87ef-f45c89b1bb39"/>
<property name="task_uuid" value="f3934fe8-db2a-11e6-bffd-f45c89b1bb39"/>
<property name="return_code" value="0"/>
<property name="return_status" value="ok"/>
<property name="return_msg" value="ok"/>
<property name="paging_mode" value="configured"/>
<property name="scripting_mode" value="disabled"/>
<property name="prompt_mode" value="disabled"/>
<property name="clisets" value="/lib/python/site-packages/ndmtk/plugins/action/files/cli/os/arista_eos.yml"/>
</properties>
<testcase name="connect" status="ok" time="0.41">
<system_out><![CDATA[
################################################################################
# connection establishment log :
# /home/greenpau/.ansible/tmp/ndmtk/f3814002-db2a-11e6-87ef-f45c89b1bb39/f3934fe8-db2a-11e6-bffd-f45c89b1bb39/ny-sw01/ny-sw01.log_connect
################################################################################
Warning: Permanently added '[localhost]:8224' (ECDSA) to the list of known hosts.
Password:
Last login: Sat Jan 14 15:43:57 2017 from 10.0.2.2
ny-sw01>
ny-sw01#
terminal length 0
Pagination disabled.
]]>
</system_out>
<skipped/>
</testcase>
</testsuite>
The ndmtk.execute
contains information about the commands executed by the plugin.
Here, the pluging executed show routing-contex vrf
command. Then, based on the
output, the plugin collected additional information about default VRF with
show ip route vrf default detail
.
<testcase name="Collects default routing context (VRF)" classname="routing, test" status="ok" time="0.371">
<system_out><![CDATA[
$ show routing-contex vrf
|--> $ show ip route vrf default
|--> $ show ip route vrf default detail
]]>
</system_out>
<skipped/>
</testcase>
Structure Data¶
The below are snippets from the output of ny-sw01.meta.yml
file:
Here, after the show vrf
was successfully executed, the plugin
stored the data in a temporary directory. The output contained six (6) lines.
Based on the output, the plugin captured two follow up commands:
show ip route vrf management
show ip route vrf management detail
Next, the command is associated with two tags: routing
, vrf
.
Based on the source
field, the source of the commands is pre-packaged
operating system based rules, i.e. os_default
.
- _seq: 3
allow_empty_response: false
child_cli_id:
- show ip route vrf management
- show ip route vrf management detail
cli: show vrf
description: Collects VRF information
format: txt
lines: '6'
mode: analytics
path: /tmp/test-20170115140020/ny-sw01/ny-sw01.show.vrf.txt
path_tmp: /home/greenpau/.ansible/tmp/ndmtk/f3814002-db2a-11e6-87ef-f45c89b1bb39/f3934fe8-db2a-11e6-bffd-f45c89b1bb39/ny-sw01/ny-sw01.show.vrf.txt
sha1: 949faac85f41f62566b8609455ad2e67c87e57cb
source: os_default
status: ok
tags:
- routing
- vrf
Then, there is the status
field. It provides various information about the data
collection task. Importantly, it has facts
field. It is similar to the data produced
by facter
tool from Puppet labs.
status:
authenticated: 'yes'
authorized: 'yes'
clisets:
- /usr/lib/python/site-packages/ndmtk/plugins/action/files/cli/os/arista_eos.yml
connect_end: 1484488820999
connect_end_utc: 2017-01-15T14:00:20 UTC
connect_start: 1484488820589
connect_start_utc: 2017-01-15T14:00:20 UTC
connected: 'yes'
disconnect_end: 1484488824087
disconnect_end_utc: 2017-01-15T14:00:24 UTC
disconnect_start: 1484488824021
disconnect_start_utc: 2017-01-15T14:00:24 UTC
disconnected: 'yes'
facts:
hardware_macaddr: 0800.2756.4f61
memory_free: 2891812 kB
memory_total: 3887680 kB
os_arch: i386
os_class: arista_eos
os_internal_build_id: c6362f13-ae6d-4c88-b5fd-4678d66018ab
os_internal_build_version: 4.17.2F-3696283.4172F
os_name: vEOS
os_vendor: Arista
os_version_major: '4'
os_version_minor: '17'
os_version_patch: 2F
uptime: 21 hours and 18 minutes
paging_mode: configured
prompt_mode: disabled
return_code: 0
return_msg: ok
return_status: ok
scripting_mode: disabled
spawned: 'yes'
task_uuid: f3934fe8-db2a-11e6-bffd-f45c89b1bb39
temp_dir: /home/greenpau/.ansible/tmp/ndmtk/f3814002-db2a-11e6-87ef-f45c89b1bb39/f3934fe8-db2a-11e6-bffd-f45c89b1bb39/ny-sw01
The plugin uses the facts
field when processing output through its Rules Engine.
- description: 'Collects routing table'
cli: 'show ip route vrf all'
tags: ['routing']
conditions_precedent_all:
- 'os_class eq arista_eos'
- 'os_version_major ge 5'
Here, the show ip route vrf all
will not run on the device, because facts
‘s os_version_major
is less than the os_version_major
in the conditions_precedent_all
for the rule.
If a user wants to run the show ip route vrf all
, the user should change conditions_precedent_all
to:
conditions_precedent_all:
- 'os_class eq arista_eos'
- 'os_version_major ge 4'
Status Codes¶
Upon the completion of a particular command, the plugin updates the status
field of the command.
The list of possible values follows:
ok
: worked as expectedfailed
skipped
conditional
: assigned when entered into the database and hasconditions_match
orconditions_precedent_all
field associated with a command.retry
unknown
: assigned when entered into the database