pan-os-python
pan-os-python copied to clipboard
Bug due to None datatype in _parse_job_results()
Describe the bug
When using the base.syncjob method i'm encountering an issue if there is no details in the job response. This is happening when downloading a vm series plugin.
Expected behavior
Expect the method to complete successfully even when there is no 'details' in response.
Current behavior
download_result = parent.syncjob(download_response)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/home/dpadmin/venv/pan-os/lib/python3.8/site-packages/panos/base.py", line 4983, in syncjob
return self._parse_job_results(job_xml, get_devices=False)
File "/home/dpadmin/venv/pan-os/lib/python3.8/site-packages/panos/base.py", line 5131, in _parse_job_results
messages = job["details"]["line"]
TypeError: 'NoneType' object is not subscriptable
Response from python call and details is None
{
"response":{
"status":"success",
"result":{
"job":{
"tenq":"2022/07/26 07:32:25",
"tdeq":"07:32:25",
"id":"14",
"user":"None",
"type":"Downld",
"status":"FIN",
"queued":"NO",
"stoppable":false,
"result":"OK",
"tfin":"07:32:26",
"description":"None",
"positionInQ":"0",
"progress":"100",
"details":"None",
"warnings":"None"
}
}
}
}
Response form the xml api direct is consistent and there is no details / line.
<job>
<tenq>2022/07/26 07:32:25</tenq>
<tdeq>07:32:25</tdeq>
<id>14</id>
<user/>
<type>Downld</type>
<status>FIN</status>
<queued>NO</queued>
<stoppable>no</stoppable>
<result>OK</result>
<tfin>07:32:26</tfin>
<description/>
<positionInQ>0</positionInQ>
<progress>100</progress>
<details/>
<warnings/>
</job>
Possible solution
The issue appears to be in the _parse_job_results() method in base.py. Adding an exception handler for the type error would resolve the issue.
line 5130 base.py
try:
messages = job["details"]["line"]
except (TypeError, KeyError):
messages = []
Steps to reproduce
download_cmd = "<request><plugins><download><file>vm_series-2.1.2</file></download></plugins></request>"
download_response = parent.op(download_cmd, cmd_xml=False)
download_result = parent.syncjob(download_response)
Context
Basically I'm trying to download / install vm plugins and wait for the task to complete using the base.syncjob method.
Your Environment
- Version used: 1.7.3
- Environment name and version (e.g. Chrome 59, node.js 5.4, python 3.7.3): Python 3.8.10
- Operating System and version (desktop or mobile): Ubuntu 20.04.3 LTS
:tada: Thanks for opening your first issue here! Welcome to the community!