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