JSON¶
To query JSON outputs users can take advantage of a tool called Dq. You can find the complete tutorial of Dq by following this link.
Actions parse, learn and api are benefiting from this feature the most, as they are
the one that are most likely to have a JSON output. You can query a JSON using Dq
and see whether the result of a query is included or excluded in our output.
Below you can see an example of using include and exclude on the parsed output of the
command show version.
- apply_configuration:
- parse:
command: show version
device: PE2
include:
# we want to se if the result of this query
# is not a empty dictionary
- contains('WebUI[\S\s]+', regex=True)
exclude:
# The output of the query is 'VIRTUAL XE'
# but we hope that the key 'platform' has no value
# or does not exist within the dictionary by using
# the exclude keyword
- get_values('platform')
Below you can see an example of calling the get_interface_mtu_config_range api
within the trigger_datafile and checking if certain query results are included or excluded in the output.
- apply_configuration:
- api: #
function: get_interface_mtu_config_range
arguments:
interface: GigabitEthernet1
include:
# Check if the output of this query is not an empty dictionary
- contains('max')
# Check if the key 'range' has the value of <1200, 1800>
- contains_key_value('range', <1200, 1800>)
exclude:
# Check if the output of these queries are actually an empty dictionary
- contains('min-max')
Note
There is no need to use Dq to validate if a dictionary output is equal to an expected dictionary. See below example.
# Description: This would check whether the output of the parser is equal to the specified dictionary.
# No Dq query is needed to perform such validation.
- parse:
device: 'N93_3'
command: 'show module'
save:
- variable_name: banana
filter: contains('lc')
include:
- {'slot': {'lc': {'2': {'40G Ethernet Expansion Module': {'ports': '12',
'model': 'N9K-M12PQ',
'status': 'ok',
'software': 'NA',
'hardware': '1.2',
'slot/world_wide_name': 'GEM',
'mac_address': '88-1d-fc-71-de-38 to 88-1d-fc-71-de-43',
'serial_number': 'SAL1928K4EG',
'online_diag_status': 'Pass'}}},
'rp': {'1': {'1/10G SFP+ Ethernet Module': {'ports': '48',
'model': 'N9K-C9396PX',
'status': 'active',
'software': '9.3(3)IDI9(0.509)',
'hardware': '2.2',
'slot/world_wide_name': 'NA',
'mac_address': '84-b8-02-f0-83-90 to 84-b8-02-f0-83-c7',
'serial_number': 'SAL1914CNL6',
'online_diag_status': 'Pass'}}}}}
- contains('lc')
- get_values('rp')
List¶
It is also possible to check and see if certain items exist within a output that is a list.
- api:
device: PE1
function: get_list_items
arguments:
name: [1,2,3,4,5,6,7] # the output is [1,2,3,4,5,6,7]
include:
- 5 # checks if 5 is in the list
exclude:
- 99 # checks if 99 is NOT in the list
Additionally, you can set a regex and see if that regex matches any item within the list output.
- api:
device: PE1
function: get_platform_logging
include:
- \*Dec 10 03:2.* # Check if any item within a list matches this regex
- "23:31:16.651"
exclude:
- name # Check if any item within a list not matches this regex
- \*Dec 10 03:2.*
Numerical¶
At this moment, it is only action api that supports this feature, as it is the only
action that have integer and float outputs.
In below example , we want to verify that the numerical output of get_interface_mtu_size is
smaller or equal 2000
# code_block_5
- api: # ACTION
function: get_interface_mtu_size
arguments:
interface: GigabitEthernet1
include:
- <= 2000
...
For numerical outputs we support all the common mathematical operations {=, >=, <=, >, <, !=}.
You also can check whether a value is within a certain range. Below
is an example of this feature. We want to see if the action output is
greater than 1200 and smaller or equal 1500.
- api: # ACTION
function: get_interface_mtu_size
arguments:
interface: GigabitEthernet1
include:
- ">1200 && <=1500"
If you use the keyword include without specifying any operation the default operation would be
set to == and by using keyword exclude the operation would be set to !=.
Below you can see an example of this.
- api: # ACTION
function: get_interface_mtu_size
arguments:
interface: GigabitEthernet1
include:
- 1500
exclude:
- 9999
Boolean¶
For the actions that have boolean output, it is possible to verify if the output of the action is equal True/False.
In below example, we want to verify if the apis’ output is True.
# code_block_5
- api: # ACTION
function: verify_device_is_active
arguments:
device: PE1
include:
- True
...