diff --git a/changelogs/fragments/freebsd_disk_regex.yml b/changelogs/fragments/freebsd_disk_regex.yml new file mode 100644 index 00000000000..74930f212c9 --- /dev/null +++ b/changelogs/fragments/freebsd_disk_regex.yml @@ -0,0 +1,3 @@ +--- +bugfixes: + - freebsd - update disk and slices regex for fact gathering (https://github.com/ansible/ansible/pull/82081). diff --git a/lib/ansible/module_utils/facts/hardware/freebsd.py b/lib/ansible/module_utils/facts/hardware/freebsd.py index e44da3aaacc..a0d493f10c8 100644 --- a/lib/ansible/module_utils/facts/hardware/freebsd.py +++ b/lib/ansible/module_utils/facts/hardware/freebsd.py @@ -173,13 +173,50 @@ class FreeBSDHardware(Hardware): sysdir = '/dev' device_facts['devices'] = {} - drives = re.compile(r'(ada?\d+|da\d+|a?cd\d+)') # TODO: rc, disks, err = self.module.run_command("/sbin/sysctl kern.disks") - slices = re.compile(r'(ada?\d+s\d+\w*|da\d+s\d+\w*)') + # TODO: rc, disks, err = self.module.run_command("/sbin/sysctl kern.disks") + drives = re.compile( + r"""(?x)( + (?: + ada? # ATA/SATA disk device + |da # SCSI disk device + |a?cd # SCSI CDROM drive + |amrd # AMI MegaRAID drive + |idad # Compaq RAID array + |ipsd # IBM ServeRAID RAID array + |md # md(4) disk device + |mfid # LSI MegaRAID SAS array + |mlxd # Mylex RAID disk + |twed # 3ware ATA RAID array + |vtbd # VirtIO Block Device + )\d+ + ) + """ + ) + + slices = re.compile( + r"""(?x)( + (?: + ada? # ATA/SATA disk device + |a?cd # SCSI CDROM drive + |amrd # AMI MegaRAID drive + |da # SCSI disk device + |idad # Compaq RAID array + |ipsd # IBM ServeRAID RAID array + |md # md(4) disk device + |mfid # LSI MegaRAID SAS array + |mlxd # Mylex RAID disk + |twed # 3ware ATA RAID array + |vtbd # VirtIO Block Device + )\d+[ps]\d+\w* + ) + """ + ) + if os.path.isdir(sysdir): dirlist = sorted(os.listdir(sysdir)) for device in dirlist: d = drives.match(device) - if d: + if d and d.group(1) not in device_facts['devices']: device_facts['devices'][d.group(1)] = [] s = slices.match(device) if s: diff --git a/test/units/module_utils/facts/hardware/freebsd/fixtures/devices b/test/units/module_utils/facts/hardware/freebsd/fixtures/devices new file mode 100644 index 00000000000..22bb739f872 --- /dev/null +++ b/test/units/module_utils/facts/hardware/freebsd/fixtures/devices @@ -0,0 +1,541 @@ +ad0 +ad1 +ad2 +ad3 +ad4 +ad5 +ad6 +ad7 +ad8 +ad9 +ada0 +ada1 +ada2 +ada3 +ada4 +ada5 +ada6 +ada7 +ada8 +ada9 +da0 +da1 +da2 +da3 +da4 +da5 +da6 +da7 +da8 +da9 +cd0 +cd1 +cd2 +cd3 +cd4 +cd5 +cd6 +cd7 +cd8 +cd9 +acd0 +acd1 +acd2 +acd3 +acd4 +acd5 +acd6 +acd7 +acd8 +acd9 +amrd0 +amrd1 +amrd2 +amrd3 +amrd4 +amrd5 +amrd6 +amrd7 +amrd8 +amrd9 +idad0 +idad1 +idad2 +idad3 +idad4 +idad5 +idad6 +idad7 +idad8 +idad9 +ips0 +ips1 +ips2 +ips3 +ips4 +ips5 +ips6 +ips7 +ips8 +ips9 +md0 +md1 +md2 +md3 +md4 +md5 +md6 +md7 +md8 +md9 +ipsd0 +ipsd1 +ipsd2 +ipsd3 +ipsd4 +ipsd5 +ipsd6 +ipsd7 +ipsd8 +ipsd9 +md0 +md1 +md2 +md3 +md4 +md5 +md6 +md7 +md8 +md9 +mfid0 +mfid1 +mfid2 +mfid3 +mfid4 +mfid5 +mfid6 +mfid7 +mfid8 +mfid9 +mlxd0 +mlxd1 +mlxd2 +mlxd3 +mlxd4 +mlxd5 +mlxd6 +mlxd7 +mlxd8 +mlxd9 +twed0 +twed1 +twed2 +twed3 +twed4 +twed5 +twed6 +twed7 +twed8 +twed9 +vtbd0 +vtbd1 +vtbd2 +vtbd3 +vtbd4 +vtbd5 +vtbd6 +vtbd7 +vtbd8 +vtbd9 +ad0p0A +ad0p0B +ad0p0C +ad0p0D +ad0p0E +ad0p0F +ad0p0G +ad0p0H +ad0p0I +ad0p0J +ad0p0K +ad0p0L +ad0p0M +ad0p0N +ad0p0O +ad0p0P +ad0p0Q +ad0p0R +ad0p0S +ad0p0T +ad0p0U +ad0p0V +ad0p0W +ad0p0X +ad0p0Y +ad0p0Z +ad0p0a +ad0p0b +ad0p0c +ad0p0d +cd0p0A +cd0p0B +cd0p0C +cd0p0D +cd0p0E +cd0p0F +cd0p0G +cd0p0H +cd0p0I +cd0p0J +cd0p0K +cd0p0L +cd0p0M +cd0p0N +cd0p0O +cd0p0P +cd0p0Q +cd0p0R +cd0p0S +cd0p0T +cd0p0U +cd0p0V +cd0p0W +cd0p0X +cd0p0Y +cd0p0Z +cd0p0a +cd0p0b +cd0p0c +cd0p0d +amrd0p0A +amrd0p0B +amrd0p0C +amrd0p0D +amrd0p0E +amrd0p0F +amrd0p0G +amrd0p0H +amrd0p0I +amrd0p0J +amrd0p0K +amrd0p0L +amrd0p0M +amrd0p0N +amrd0p0O +amrd0p0P +amrd0p0Q +amrd0p0R +amrd0p0S +amrd0p0T +amrd0p0U +amrd0p0V +amrd0p0W +amrd0p0X +amrd0p0Y +amrd0p0Z +amrd0p0a +amrd0p0b +amrd0p0c +amrd0p0d +da0p0A +da0p0B +da0p0C +da0p0D +da0p0E +da0p0F +da0p0G +da0p0H +da0p0I +da0p0J +da0p0K +da0p0L +da0p0M +da0p0N +da0p0O +da0p0P +da0p0Q +da0p0R +da0p0S +da0p0T +da0p0U +da0p0V +da0p0W +da0p0X +da0p0Y +da0p0Z +da0p0a +da0p0b +da0p0c +da0p0d +idad0p0A +idad0p0B +idad0p0C +idad0p0D +idad0p0E +idad0p0F +idad0p0G +idad0p0H +idad0p0I +idad0p0J +idad0p0K +idad0p0L +idad0p0M +idad0p0N +idad0p0O +idad0p0P +idad0p0Q +idad0p0R +idad0p0S +idad0p0T +idad0p0U +idad0p0V +idad0p0W +idad0p0X +idad0p0Y +idad0p0Z +idad0p0a +idad0p0b +idad0p0c +idad0p0d +ipsd0p0A +ipsd0p0B +ipsd0p0C +ipsd0p0D +ipsd0p0E +ipsd0p0F +ipsd0p0G +ipsd0p0H +ipsd0p0I +ipsd0p0J +ipsd0p0K +ipsd0p0L +ipsd0p0M +ipsd0p0N +ipsd0p0O +ipsd0p0P +ipsd0p0Q +ipsd0p0R +ipsd0p0S +ipsd0p0T +ipsd0p0U +ipsd0p0V +ipsd0p0W +ipsd0p0X +ipsd0p0Y +ipsd0p0Z +ipsd0p0a +ipsd0p0b +ipsd0p0c +ipsd0p0d +md0p0A +md0p0B +md0p0C +md0p0D +md0p0E +md0p0F +md0p0G +md0p0H +md0p0I +md0p0J +md0p0K +md0p0L +md0p0M +md0p0N +md0p0O +md0p0P +md0p0Q +md0p0R +md0p0S +md0p0T +md0p0U +md0p0V +md0p0W +md0p0X +md0p0Y +md0p0Z +md0p0a +md0p0b +md0p0c +md0p0d +mfid0p0A +mfid0p0B +mfid0p0C +mfid0p0D +mfid0p0E +mfid0p0F +mfid0p0G +mfid0p0H +mfid0p0I +mfid0p0J +mfid0p0K +mfid0p0L +mfid0p0M +mfid0p0N +mfid0p0O +mfid0p0P +mfid0p0Q +mfid0p0R +mfid0p0S +mfid0p0T +mfid0p0U +mfid0p0V +mfid0p0W +mfid0p0X +mfid0p0Y +mfid0p0Z +mfid0p0a +mfid0p0b +mfid0p0c +mfid0p0d +mlxd0p0A +mlxd0p0B +mlxd0p0C +mlxd0p0D +mlxd0p0E +mlxd0p0F +mlxd0p0G +mlxd0p0H +mlxd0p0I +mlxd0p0J +mlxd0p0K +mlxd0p0L +mlxd0p0M +mlxd0p0N +mlxd0p0O +mlxd0p0P +mlxd0p0Q +mlxd0p0R +mlxd0p0S +mlxd0p0T +mlxd0p0U +mlxd0p0V +mlxd0p0W +mlxd0p0X +mlxd0p0Y +mlxd0p0Z +mlxd0p0a +mlxd0p0b +mlxd0p0c +mlxd0p0d +twed0p0A +twed0p0B +twed0p0C +twed0p0D +twed0p0E +twed0p0F +twed0p0G +twed0p0H +twed0p0I +twed0p0J +twed0p0K +twed0p0L +twed0p0M +twed0p0N +twed0p0O +twed0p0P +twed0p0Q +twed0p0R +twed0p0S +twed0p0T +twed0p0U +twed0p0V +twed0p0W +twed0p0X +twed0p0Y +twed0p0Z +twed0p0a +twed0p0b +twed0p0c +twed0p0d +vtbd0p0A +vtbd0p0B +vtbd0p0C +vtbd0p0D +vtbd0p0E +vtbd0p0F +vtbd0p0G +vtbd0p0H +vtbd0p0I +vtbd0p0J +vtbd0p0K +vtbd0p0L +vtbd0p0M +vtbd0p0N +vtbd0p0O +vtbd0p0P +vtbd0p0Q +vtbd0p0R +vtbd0p0S +vtbd0p0T +vtbd0p0U +vtbd0p0V +vtbd0p0W +vtbd0p0X +vtbd0p0Y +vtbd0p0Z +vtbd0p0a +vtbd0p0b +vtbd0p0c +vtbd0p0d +log +reroot +sndstat +random +urandom +devctl +devctl2 +console +geom.ctl +midistat +sequencer0 +music0 +ctty +fd +stdin +stdout +stderr +tcp_log +auditpipe +audit +consolectl +sysmouse +input +fido +kbdmux0 +kbd0 +bpf +bpf0 +mem +kmem +full +null +zero +uinput +openfirm +pci +klog +vcio +efi +acpi +ttyu0 +ttyu0.init +ttyu0.lock +cuau0 +cuau0.init +cuau0.lock +ufssuspend +netdump +pfil +usbctl +xpt0 +mdctl +devstat +usb +ugen0.1 +gpt +ugen0.2 +ukbd0 +kbd1 +ugen0.3 +uhid0 diff --git a/test/units/module_utils/facts/hardware/freebsd/fixtures/expected_devices b/test/units/module_utils/facts/hardware/freebsd/fixtures/expected_devices new file mode 100644 index 00000000000..cd05db4574d --- /dev/null +++ b/test/units/module_utils/facts/hardware/freebsd/fixtures/expected_devices @@ -0,0 +1 @@ +{"devices": {"acd0": [], "acd1": [], "acd2": [], "acd3": [], "acd4": [], "acd5": [], "acd6": [], "acd7": [], "acd8": [], "acd9": [], "ad0": ["ad0p0A", "ad0p0B", "ad0p0C", "ad0p0D", "ad0p0E", "ad0p0F", "ad0p0G", "ad0p0H", "ad0p0I", "ad0p0J", "ad0p0K", "ad0p0L", "ad0p0M", "ad0p0N", "ad0p0O", "ad0p0P", "ad0p0Q", "ad0p0R", "ad0p0S", "ad0p0T", "ad0p0U", "ad0p0V", "ad0p0W", "ad0p0X", "ad0p0Y", "ad0p0Z", "ad0p0a", "ad0p0b", "ad0p0c", "ad0p0d"], "ad1": [], "ad2": [], "ad3": [], "ad4": [], "ad5": [], "ad6": [], "ad7": [], "ad8": [], "ad9": [], "ada0": [], "ada1": [], "ada2": [], "ada3": [], "ada4": [], "ada5": [], "ada6": [], "ada7": [], "ada8": [], "ada9": [], "amrd0": ["amrd0p0A", "amrd0p0B", "amrd0p0C", "amrd0p0D", "amrd0p0E", "amrd0p0F", "amrd0p0G", "amrd0p0H", "amrd0p0I", "amrd0p0J", "amrd0p0K", "amrd0p0L", "amrd0p0M", "amrd0p0N", "amrd0p0O", "amrd0p0P", "amrd0p0Q", "amrd0p0R", "amrd0p0S", "amrd0p0T", "amrd0p0U", "amrd0p0V", "amrd0p0W", "amrd0p0X", "amrd0p0Y", "amrd0p0Z", "amrd0p0a", "amrd0p0b", "amrd0p0c", "amrd0p0d"], "amrd1": [], "amrd2": [], "amrd3": [], "amrd4": [], "amrd5": [], "amrd6": [], "amrd7": [], "amrd8": [], "amrd9": [], "cd0": ["cd0p0A", "cd0p0B", "cd0p0C", "cd0p0D", "cd0p0E", "cd0p0F", "cd0p0G", "cd0p0H", "cd0p0I", "cd0p0J", "cd0p0K", "cd0p0L", "cd0p0M", "cd0p0N", "cd0p0O", "cd0p0P", "cd0p0Q", "cd0p0R", "cd0p0S", "cd0p0T", "cd0p0U", "cd0p0V", "cd0p0W", "cd0p0X", "cd0p0Y", "cd0p0Z", "cd0p0a", "cd0p0b", "cd0p0c", "cd0p0d"], "cd1": [], "cd2": [], "cd3": [], "cd4": [], "cd5": [], "cd6": [], "cd7": [], "cd8": [], "cd9": [], "da0": ["da0p0A", "da0p0B", "da0p0C", "da0p0D", "da0p0E", "da0p0F", "da0p0G", "da0p0H", "da0p0I", "da0p0J", "da0p0K", "da0p0L", "da0p0M", "da0p0N", "da0p0O", "da0p0P", "da0p0Q", "da0p0R", "da0p0S", "da0p0T", "da0p0U", "da0p0V", "da0p0W", "da0p0X", "da0p0Y", "da0p0Z", "da0p0a", "da0p0b", "da0p0c", "da0p0d"], "da1": [], "da2": [], "da3": [], "da4": [], "da5": [], "da6": [], "da7": [], "da8": [], "da9": [], "idad0": ["idad0p0A", "idad0p0B", "idad0p0C", "idad0p0D", "idad0p0E", "idad0p0F", "idad0p0G", "idad0p0H", "idad0p0I", "idad0p0J", "idad0p0K", "idad0p0L", "idad0p0M", "idad0p0N", "idad0p0O", "idad0p0P", "idad0p0Q", "idad0p0R", "idad0p0S", "idad0p0T", "idad0p0U", "idad0p0V", "idad0p0W", "idad0p0X", "idad0p0Y", "idad0p0Z", "idad0p0a", "idad0p0b", "idad0p0c", "idad0p0d"], "idad1": [], "idad2": [], "idad3": [], "idad4": [], "idad5": [], "idad6": [], "idad7": [], "idad8": [], "idad9": [], "ipsd0": ["ipsd0p0A", "ipsd0p0B", "ipsd0p0C", "ipsd0p0D", "ipsd0p0E", "ipsd0p0F", "ipsd0p0G", "ipsd0p0H", "ipsd0p0I", "ipsd0p0J", "ipsd0p0K", "ipsd0p0L", "ipsd0p0M", "ipsd0p0N", "ipsd0p0O", "ipsd0p0P", "ipsd0p0Q", "ipsd0p0R", "ipsd0p0S", "ipsd0p0T", "ipsd0p0U", "ipsd0p0V", "ipsd0p0W", "ipsd0p0X", "ipsd0p0Y", "ipsd0p0Z", "ipsd0p0a", "ipsd0p0b", "ipsd0p0c", "ipsd0p0d"], "ipsd1": [], "ipsd2": [], "ipsd3": [], "ipsd4": [], "ipsd5": [], "ipsd6": [], "ipsd7": [], "ipsd8": [], "ipsd9": [], "md0": ["md0p0A", "md0p0B", "md0p0C", "md0p0D", "md0p0E", "md0p0F", "md0p0G", "md0p0H", "md0p0I", "md0p0J", "md0p0K", "md0p0L", "md0p0M", "md0p0N", "md0p0O", "md0p0P", "md0p0Q", "md0p0R", "md0p0S", "md0p0T", "md0p0U", "md0p0V", "md0p0W", "md0p0X", "md0p0Y", "md0p0Z", "md0p0a", "md0p0b", "md0p0c", "md0p0d"], "md1": [], "md2": [], "md3": [], "md4": [], "md5": [], "md6": [], "md7": [], "md8": [], "md9": [], "mfid0": ["mfid0p0A", "mfid0p0B", "mfid0p0C", "mfid0p0D", "mfid0p0E", "mfid0p0F", "mfid0p0G", "mfid0p0H", "mfid0p0I", "mfid0p0J", "mfid0p0K", "mfid0p0L", "mfid0p0M", "mfid0p0N", "mfid0p0O", "mfid0p0P", "mfid0p0Q", "mfid0p0R", "mfid0p0S", "mfid0p0T", "mfid0p0U", "mfid0p0V", "mfid0p0W", "mfid0p0X", "mfid0p0Y", "mfid0p0Z", "mfid0p0a", "mfid0p0b", "mfid0p0c", "mfid0p0d"], "mfid1": [], "mfid2": [], "mfid3": [], "mfid4": [], "mfid5": [], "mfid6": [], "mfid7": [], "mfid8": [], "mfid9": [], "mlxd0": ["mlxd0p0A", "mlxd0p0B", "mlxd0p0C", "mlxd0p0D", "mlxd0p0E", "mlxd0p0F", "mlxd0p0G", "mlxd0p0H", "mlxd0p0I", "mlxd0p0J", "mlxd0p0K", "mlxd0p0L", "mlxd0p0M", "mlxd0p0N", "mlxd0p0O", "mlxd0p0P", "mlxd0p0Q", "mlxd0p0R", "mlxd0p0S", "mlxd0p0T", "mlxd0p0U", "mlxd0p0V", "mlxd0p0W", "mlxd0p0X", "mlxd0p0Y", "mlxd0p0Z", "mlxd0p0a", "mlxd0p0b", "mlxd0p0c", "mlxd0p0d"], "mlxd1": [], "mlxd2": [], "mlxd3": [], "mlxd4": [], "mlxd5": [], "mlxd6": [], "mlxd7": [], "mlxd8": [], "mlxd9": [], "twed0": ["twed0p0A", "twed0p0B", "twed0p0C", "twed0p0D", "twed0p0E", "twed0p0F", "twed0p0G", "twed0p0H", "twed0p0I", "twed0p0J", "twed0p0K", "twed0p0L", "twed0p0M", "twed0p0N", "twed0p0O", "twed0p0P", "twed0p0Q", "twed0p0R", "twed0p0S", "twed0p0T", "twed0p0U", "twed0p0V", "twed0p0W", "twed0p0X", "twed0p0Y", "twed0p0Z", "twed0p0a", "twed0p0b", "twed0p0c", "twed0p0d"], "twed1": [], "twed2": [], "twed3": [], "twed4": [], "twed5": [], "twed6": [], "twed7": [], "twed8": [], "twed9": [], "vtbd0": ["vtbd0p0A", "vtbd0p0B", "vtbd0p0C", "vtbd0p0D", "vtbd0p0E", "vtbd0p0F", "vtbd0p0G", "vtbd0p0H", "vtbd0p0I", "vtbd0p0J", "vtbd0p0K", "vtbd0p0L", "vtbd0p0M", "vtbd0p0N", "vtbd0p0O", "vtbd0p0P", "vtbd0p0Q", "vtbd0p0R", "vtbd0p0S", "vtbd0p0T", "vtbd0p0U", "vtbd0p0V", "vtbd0p0W", "vtbd0p0X", "vtbd0p0Y", "vtbd0p0Z", "vtbd0p0a", "vtbd0p0b", "vtbd0p0c", "vtbd0p0d"], "vtbd1": [], "vtbd2": [], "vtbd3": [], "vtbd4": [], "vtbd5": [], "vtbd6": [], "vtbd7": [], "vtbd8": [], "vtbd9": []}} \ No newline at end of file diff --git a/test/units/module_utils/facts/hardware/freebsd/test_get_device_facts.py b/test/units/module_utils/facts/hardware/freebsd/test_get_device_facts.py new file mode 100644 index 00000000000..08f64c1dffd --- /dev/null +++ b/test/units/module_utils/facts/hardware/freebsd/test_get_device_facts.py @@ -0,0 +1,23 @@ +# Copyright: Contributors to the Ansible project +# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) + +from __future__ import annotations + +import json +import os +import pathlib + +from ansible.module_utils.facts.hardware import freebsd + + +def test_get_device_facts(monkeypatch): + fixtures = pathlib.Path(__file__).parent / 'fixtures' + dev_dir = (fixtures / 'devices').read_text().split() + expected_dev_dir = json.load(open(fixtures / 'expected_devices', 'r')) + + monkeypatch.setattr(os.path, 'isdir', lambda x: True) + monkeypatch.setattr(os, 'listdir', lambda x: dev_dir) + + freebsd_hardware = freebsd.FreeBSDHardware(None) + facts = freebsd_hardware.get_device_facts() + assert facts == expected_dev_dir