Make netbsd virtualization facts more specific (#70467)

Change:
Our handling of NetBSD virtualization facts led to facts that were just
plain incorrect. One example is reporting Xen even when the system is
running on something completely different (like KVM).

As stated by the reporter of #69352, NetBSD has a better sysctl setting
to use for this information, machdep.hypervisor.

This PR does the following:

- Try to use machdep.hypervisor sysctl value if the other sysctl values
  we check don't end up with enough information to be useful
- Only look for /dev/xencons and assume Xen if nothing else works
  (Really this should probably return 'unknown' since the file exists on
  non-Xen systems and is not very useful).
- Add a few more patterns (Xen matches and also Hyper-V) to
  VirtualSysctlDetectionMixin#detect_virt_product.

This change is slightly breaking:
- If the first two attempts at using sysctl worked before,
  (machdep.dmi.system-product and machdep.dmi.system-vendor), they will
  continue to work.
- For cases when those values didn't work, previously the existence of
  /dev/xencons was checked, and if found, we reported 'xen' (even on
  non-Xen systems when the file existed). After this PR, we try the
  machdep.hypervisor sysctl key before still falling back to
  /dev/xencons. This means that in some cases, we might go from
  (wrongly) saying "xen" to giving a more accurate value such as "kvm"
  or "Hyper-V".

Test Plan:
- Tested with local NetBSD VM and got 'kvm' instead of 'xen' back.

Tickets:
- Fixes #69352

Signed-off-by: Rick Elrod <rick@elrod.me>
pull/70607/head
Rick Elrod 4 years ago committed by GitHub
parent fb7740ae3b
commit 707458cc8c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -0,0 +1,2 @@
breaking_changes:
- NetBSD virtualization facts (specifically ``ansible_virtualization_type``) now returns a more accurate value by checking the value of the ``machdep.hypervisor`` ``sysctl`` key. This change is breaking because in some cases previously, we would erroneously report ``xen`` even when the target is not running on Xen. This prevents that behavior in most cases. (https://github.com/ansible/ansible/issues/69352)

@ -57,7 +57,7 @@ No notable changes
Noteworthy module changes
-------------------------
No notable changes
* facts - ``ansible_virtualization_type`` now tries to report a more accurate result than ``xen`` when virtualized and not running on Xen.
Plugins

@ -38,7 +38,15 @@ class NetBSDVirtual(Virtual, VirtualSysctlDetectionMixin):
virtual_vendor_facts = self.detect_virt_vendor('machdep.dmi.system-vendor')
virtual_facts.update(virtual_vendor_facts)
if os.path.exists('/dev/xencons'):
# The above logic is tried first for backwards compatibility. If
# something above matches, use it. Otherwise if the result is still
# empty, try machdep.hypervisor.
if virtual_facts['virtualization_type'] == '':
virtual_vendor_facts = self.detect_virt_vendor('machdep.hypervisor')
virtual_facts.update(virtual_vendor_facts)
if (virtual_facts['virtualization_type'] == '' and
os.path.exists('/dev/xencons')):
virtual_facts['virtualization_type'] = 'xen'
virtual_facts['virtualization_role'] = 'guest'

@ -38,9 +38,12 @@ class VirtualSysctlDetectionMixin(object):
elif out.rstrip() == 'VirtualBox':
virtual_product_facts['virtualization_type'] = 'virtualbox'
virtual_product_facts['virtualization_role'] = 'guest'
elif out.rstrip() == 'HVM domU':
elif re.match('(HVM domU|XenPVH|XenPV|XenPVHVM).*', out):
virtual_product_facts['virtualization_type'] = 'xen'
virtual_product_facts['virtualization_role'] = 'guest'
elif out.rstrip() == 'Hyper-V':
virtual_product_facts['virtualization_type'] = 'Hyper-V'
virtual_product_facts['virtualization_role'] = 'guest'
elif out.rstrip() == 'Parallels':
virtual_product_facts['virtualization_type'] = 'parallels'
virtual_product_facts['virtualization_role'] = 'guest'

Loading…
Cancel
Save