network-engine icon indicating copy to clipboard operation
network-engine copied to clipboard

Failing to construct json_object due to missing / null values should fail explicitly

Open LukeDRussell opened this issue 6 years ago • 2 comments

ISSUE TYPE

  • Bug Report

ANSIBLE VERSION

ansible --version
ansible 2.7.6
  config file = /home/4032956/repos/network-automation/ansible.cfg
  configured module search path = ['/home/4032956/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /home/4032956/.pyenv/versions/3.7.1/envs/network-automation/lib/python3.7/site-packages/ansible
  executable location = /home/4032956/.pyenv/versions/network-automation/bin/ansible
  python version = 3.7.1 (default, Dec  4 2018, 14:17:28) [GCC 4.8.5 20150623 (Red Hat 4.8.5-28)]

$ ansible-galaxy list -p roles/ | grep ansible-network
- ansible-network.cisco_ios, v2.7.0
- ansible-network.juniper_junos, v2.7.2
- ansible-network.network-engine, v2.7.2
- ansible-network.cisco_nxos, v2.7.1
- ansible-network.config_manager, v2.6.2
- ansible-network.network-engine, v2.7.1

Network OS

Not relevant

SUMMARY

When you construct a json_template that references a non-existing (or perhaps null) parsed variable, ansible hangs. It should fail explicitly with a useful message.

STEPS TO REPRODUCE

From inside ansible-network.cisco_ios

  1. Remove this line
  2. ansible-playbook tests/test_parser_templates.yaml -i tests/inventory

EXPECTED RESULTS

When network engine tries to construct the key restart_time (link) which is null / doesn't exist because the previous regex didn't match anything, it should produce a meaningful error.

ACTUAL RESULTS

TASK [lukedrussell.cisco_ios : run command and parse output] ****************************************************************
task path: /home/4032956/repos/network-automation/roles/lukedrussell.cisco_ios/includes/run_cli.yaml:6
<snip> attempting to start connection
<snip> using connection plugin network_cli
<snip> found existing local domain socket, using it!
<snip> updating play_context for connection
<snip>
<snip> local domain socket path is /home/4032956/.ansible/pc/c96ac4390e
Traceback (most recent call last):
  File "/home/4032956/.pyenv/versions/3.7.1/lib/python3.7/multiprocessing/queues.py", line 236, in _feed
    obj = _ForkingPickler.dumps(obj)
  File "/home/4032956/.pyenv/versions/3.7.1/lib/python3.7/multiprocessing/reduction.py", line 51, in dumps
    cls(buf, protocol).dump(obj)
TypeError: can't pickle StrictUndefined objects

The playbook hangs at this point for all hosts, and must Ctrl+C to break it.

LukeDRussell avatar Feb 06 '19 05:02 LukeDRussell

@LukeDRussell I am unable to reproduce the issue. network-engine sets the key to null if there is no match which caused the following test failure which is expected, it didn't hang for me. I think this might be related to connection plugin, copying @Qalthos here.

TASK [15.5.1.txt - test `show version` parser] ***************************************************************************************************
fatal: [localhost]: FAILED! => {
    "assertion": "system.restart_time == '09:58:28'", 
    "changed": false, 
    "evaluated_to": false, 
    "msg": "Assertion failed"
}
	to retry, use: --limit @/home/tguha/workspace/cisco_ios/tests/test_parser_templates.retry

PLAY RECAP ***************************************************************************************************************************************
localhost                  : ok=22   changed=0    unreachable=0    failed=1 

trishnaguha avatar Feb 13 '19 12:02 trishnaguha

Ack, I'll have to find another way to reproduce this.

LukeDRussell avatar Feb 14 '19 02:02 LukeDRussell