diff --git a/lib/jnpr/junos/facts/vmhost.py b/lib/jnpr/junos/facts/vmhost.py index 89e59b339..2a5988332 100644 --- a/lib/jnpr/junos/facts/vmhost.py +++ b/lib/jnpr/junos/facts/vmhost.py @@ -3,6 +3,34 @@ from lxml import etree +def _get_vmhost_version_information(device): + multi_re = False + try: + rsp = device.rpc.get_route_engine_information(normalize=True) + re_list = rsp.findall(".//route-engine") + if len(re_list) > 1: + multi_re = True + else: + multi_re = False + except RpcError as err: + raise RpcError() + + if multi_re == True: + try: + return device.rpc.cli( + "show vmhost version invoke-on all-routing-engines", + format="xml", + normalize=True, + ) + except RpcError as err: + raise RpcError() + else: + try: + return device.rpc.cli("show vmhost version", format="xml", normalize=True) + except RpcError as err: + raise RpcError() + + def provides_facts(): """ Returns a dictionary keyed on the facts provided by this module. The value @@ -10,6 +38,7 @@ def provides_facts(): """ return { "vmhost": "A boolean indicating if the device is vmhost.", + "vmhost_info": "A dictionary indicating vmhost RE partition JUNOS versions.", } @@ -19,6 +48,12 @@ def get_facts(device): """ SYSCTL_VMHOST_MODE = "sysctl -n hw.re.vmhost_mode" vmhost = None + vmhost_info = {} + vm_ver_rsp = None + vmhost_current_root_set = None + vmhost_set_junos_version_set_p = None + vmhost_set_junos_version_set_b = None + re_name = None if device.facts["_is_linux"]: vmhost = False @@ -35,6 +70,34 @@ def get_facts(device): except RpcError: pass + if vmhost: + rsp = _get_vmhost_version_information(device) + # PR 1510446 fix for show vmhost version rpc supports form 22.2R3 + if device.facts["version"] >= "22.2R3": + if rsp.tag == "vmhost-version-information": + vm_ver_rsp = [rsp] + else: + vm_ver_rsp = rsp.findall(".//vmhost-version-information") + + for re_vm_ver_info in vm_ver_rsp: + re_name = re_vm_ver_info.findtext("../re-name", "re0") + vmhost_current_root_set = re_vm_ver_info.findtext("./current-root-set") + vmhost_set_junos_version_set_p = re_vm_ver_info.findtext( + "./set-disk-info[set-disk-name = 'set p']/set-junos-version" + ) + vmhost_set_junos_version_set_b = re_vm_ver_info.findtext( + "./set-disk-info[set-disk-name = 'set b']/set-junos-version" + ) + + vmhost_info[re_name] = { + "vmhost_current_root_set": vmhost_current_root_set, + "vmhost_version_set_p": vmhost_set_junos_version_set_p, + "vmhost_version_set_b": vmhost_set_junos_version_set_b, + } + else: + pass + return { "vmhost": vmhost, + "vmhost_info": vmhost_info, } diff --git a/tests/unit/facts/rpc-reply/vmhost_true_command.xml b/tests/unit/facts/rpc-reply/vmhost_true_command.xml new file mode 100644 index 000000000..84587d609 --- /dev/null +++ b/tests/unit/facts/rpc-reply/vmhost_true_command.xml @@ -0,0 +1,35 @@ + + + + sda + jrootb_P + sda4 + + Primary + b + CBEP_P_VAL1_00.18.02 + Tue Jan 21 21:05:21 PST 2025 + + + set p + 7.2725 + vmhost-x86_64-22.4R3-S2-20240326_1606_builder + vmhost-core-x86-64-22.4R3-S3.3 + 5.2.60-rt15-LTS19 + junos-install-mx-x86-64-22.4R3-S3.3 + + + + set b + 10.3103 + vmhost-x86_64-24.2R2-20241112_0808_builder + vmhost-core-x86-64-24.2R2.1 + 5.15.136-rt61-LTS22 + junos-install-mx-x86-64-24.2R2.1 + + + + + + + \ No newline at end of file diff --git a/tests/unit/facts/rpc-reply/vmhost_true_get-route-engine-information.xml b/tests/unit/facts/rpc-reply/vmhost_true_get-route-engine-information.xml new file mode 100644 index 000000000..b4e892796 --- /dev/null +++ b/tests/unit/facts/rpc-reply/vmhost_true_get-route-engine-information.xml @@ -0,0 +1,42 @@ + + + + OK + 43 degrees C / 109 degrees F + 43 degrees C / 109 degrees F + 16337 MB + (16384 MB installed) + 5 + 0 + 0 + 0 + 0 + 99 + 1 + 0 + 0 + 0 + 99 + 0 + 0 + 0 + 0 + 99 + 0 + 0 + 0 + 0 + 99 + RE-S-1600x8 + 2025-02-05 08:30:29 IST + 1 day, 4 hours, 17 minutes, 12 seconds + 0x4000:VJUNOS reboot + 0.39 + 0.29 + 0.25 + + + + + + \ No newline at end of file