diff --git a/lso/playbook.py b/lso/playbook.py index 4475f7d7e83f5ede5db4ee6dfbf20088779c81ae..3e013ba5bb5fbe462490065b12e0cbfc5bb9ee6c 100644 --- a/lso/playbook.py +++ b/lso/playbook.py @@ -8,6 +8,7 @@ import uuid import ansible_runner import requests import xmltodict +from dictdiffer import diff from pydantic import BaseModel, HttpUrl logger = logging.getLogger(__name__) @@ -115,15 +116,14 @@ def _run_playbook_proc(job_id: str, playbook_path: str, extra_vars: dict, invent # Juniper-specific # Prevent the diff from being displayed twice, and only keep the formatted version. task_result.pop("diff", None) - elif "before" in task_result["diff"] and "after" in task_result["diff"]: + elif "diff" in task_result and "before" in task_result["diff"] and "after" in task_result["diff"]: # Nokia-specific # We have a chunk of Nokia config, and we would like to show the actual diff, not a full before and - # after. This will take some extra steps. + # after. before_parsed = xmltodict.parse(task_result["diff"]["before"]) after_parsed = xmltodict.parse(task_result["diff"]["after"]) # Only leave the diff in the resulting output - task_result["diff"] = {k: v for k, v in after_parsed.items() if - k not in before_parsed or v != before_parsed[k]} + task_result["diff"] = list(diff(before_parsed, after_parsed))[0] if bool(task_result): # Only add the event if there are any relevant keys left. diff --git a/requirements.txt b/requirements.txt index b21387da8cede198d071de0e30a303cebbc2a053..db7bcae4689ff8446a95cfecb8270dceba39cabf 100644 --- a/requirements.txt +++ b/requirements.txt @@ -30,4 +30,6 @@ junos-eznc jxmlease ncclient ruamel.yaml -xmltodict +xmltodict~=0.13.0 +dictdiffer~=0.9.0 +jmespath~=1.0.1