From 72d0c21f56e984504f71c8fcc8602fcaddfc1e51 Mon Sep 17 00:00:00 2001 From: Amin Vakil Date: Mon, 21 Jun 2021 15:10:28 +0430 Subject: [PATCH] [backport][stable-2] proxmox_kvm: Fix ZFS device string parsing (#2841) (#2849) * proxmox_kvm: Fix ZFS device string parsing (#2841) ZFS-backed block devices may contain just the bare device name and not have extra options like `,size=foo`, `,format=qcow2` etc. This breaks an assumption in existing regex (which expects a comma). Support such device strings and add a couple of testcases to validate. * Fix * Update plugins/modules/cloud/misc/proxmox_kvm.py Co-authored-by: Felix Fontein * Update plugins/modules/cloud/misc/proxmox_kvm.py Co-authored-by: Felix Fontein Co-authored-by: Anup Chenthamarakshan Co-authored-by: Felix Fontein --- .../fragments/2841-proxmox_kvm_zfs_devstr.yml | 4 +++ plugins/modules/cloud/misc/proxmox_kvm.py | 29 ++++++++++--------- .../modules/cloud/misc/test_proxmox_kvm.py | 17 +++++++++++ 3 files changed, 36 insertions(+), 14 deletions(-) create mode 100644 changelogs/fragments/2841-proxmox_kvm_zfs_devstr.yml create mode 100644 tests/unit/plugins/modules/cloud/misc/test_proxmox_kvm.py diff --git a/changelogs/fragments/2841-proxmox_kvm_zfs_devstr.yml b/changelogs/fragments/2841-proxmox_kvm_zfs_devstr.yml new file mode 100644 index 0000000000..7b61f175c6 --- /dev/null +++ b/changelogs/fragments/2841-proxmox_kvm_zfs_devstr.yml @@ -0,0 +1,4 @@ +bugfixes: + - "proxmox_kvm - fix parsing of Proxmox VM information with device info not containing + a comma, like disks backed by ZFS zvols + (https://github.com/ansible-collections/community.general/issues/2840)." diff --git a/plugins/modules/cloud/misc/proxmox_kvm.py b/plugins/modules/cloud/misc/proxmox_kvm.py index 2bd73b9575..f29febbb92 100644 --- a/plugins/modules/cloud/misc/proxmox_kvm.py +++ b/plugins/modules/cloud/misc/proxmox_kvm.py @@ -815,26 +815,27 @@ def get_vminfo(module, proxmox, node, vmid, **kwargs): del kwargs[k] # Split information by type - for k, v in kwargs.items(): - if re.match(r'net[0-9]', k) is not None: - interface = k - k = vm[k] - k = re.search('=(.*?),', k).group(1) - mac[interface] = k - if (re.match(r'virtio[0-9]', k) is not None or - re.match(r'ide[0-9]', k) is not None or - re.match(r'scsi[0-9]', k) is not None or - re.match(r'sata[0-9]', k) is not None): - device = k - k = vm[k] - k = re.search('(.*?),', k).group(1) - devices[device] = k + re_net = re.compile(r'net[0-9]') + re_dev = re.compile(r'(virtio|ide|scsi|sata)[0-9]') + for k in kwargs.keys(): + if re_net.match(k): + mac[k] = parse_mac(vm[k]) + elif re_dev.match(k): + devices[k] = parse_dev(vm[k]) results['mac'] = mac results['devices'] = devices results['vmid'] = int(vmid) +def parse_mac(netstr): + return re.search('=(.*?),', netstr).group(1) + + +def parse_dev(devstr): + return re.search('(.*?)(,|$)', devstr).group(1) + + def settings(module, proxmox, vmid, node, name, **kwargs): proxmox_node = proxmox.nodes(node) diff --git a/tests/unit/plugins/modules/cloud/misc/test_proxmox_kvm.py b/tests/unit/plugins/modules/cloud/misc/test_proxmox_kvm.py new file mode 100644 index 0000000000..d486000ed1 --- /dev/null +++ b/tests/unit/plugins/modules/cloud/misc/test_proxmox_kvm.py @@ -0,0 +1,17 @@ +# Copyright: (c) 2021, Ansible Project +# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) + +from __future__ import (absolute_import, division, print_function) +__metaclass__ = type + +from ansible_collections.community.general.plugins.modules.cloud.misc.proxmox_kvm import parse_dev, parse_mac + + +def test_parse_mac(): + assert parse_mac('virtio=00:11:22:AA:BB:CC,bridge=vmbr0,firewall=1') == '00:11:22:AA:BB:CC' + + +def test_parse_dev(): + assert parse_dev('local-lvm:vm-1000-disk-0,format=qcow2') == 'local-lvm:vm-1000-disk-0' + assert parse_dev('local-lvm:vm-101-disk-1,size=8G') == 'local-lvm:vm-101-disk-1' + assert parse_dev('local-zfs:vm-1001-disk-0') == 'local-zfs:vm-1001-disk-0'