From 0f59bb7a99258be7f885f8f77e5fcf1de8a0b0e5 Mon Sep 17 00:00:00 2001 From: Scott Langendyk Date: Mon, 12 Aug 2024 01:35:43 -0400 Subject: [PATCH] Get interfaces for Proxmox LXC containers (#8713) * Get interfaces for Proxmox LXC containers * Add changelog * Don't use bare except * Update changelog from suggestion Co-authored-by: Felix Fontein * Only lookup interfaces for running containers * Ignore not implemented status * Check that key exists in properties dict * define ignore errors in mock * Use not in --------- Co-authored-by: Felix Fontein --- .../fragments/8713-proxmox_lxc_interfaces.yml | 2 ++ plugins/inventory/proxmox.py | 31 +++++++++++++++++++ tests/unit/plugins/inventory/test_proxmox.py | 2 +- 3 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 changelogs/fragments/8713-proxmox_lxc_interfaces.yml diff --git a/changelogs/fragments/8713-proxmox_lxc_interfaces.yml b/changelogs/fragments/8713-proxmox_lxc_interfaces.yml new file mode 100644 index 0000000000..32c475157e --- /dev/null +++ b/changelogs/fragments/8713-proxmox_lxc_interfaces.yml @@ -0,0 +1,2 @@ +minor_changes: + - proxmox inventory plugin - add new fact for LXC interface details (https://github.com/ansible-collections/community.general/pull/8713). \ No newline at end of file diff --git a/plugins/inventory/proxmox.py b/plugins/inventory/proxmox.py index 774833c488..a4b05b57ed 100644 --- a/plugins/inventory/proxmox.py +++ b/plugins/inventory/proxmox.py @@ -362,6 +362,34 @@ class InventoryModule(BaseInventoryPlugin, Constructable, Cacheable): except Exception: return None + def _get_lxc_interfaces(self, properties, node, vmid): + status_key = self._fact('status') + + if status_key not in properties or not properties[status_key] == 'running': + return + + ret = self._get_json("%s/api2/json/nodes/%s/lxc/%s/interfaces" % (self.proxmox_url, node, vmid), ignore_errors=[501]) + if not ret: + return + + result = [] + + for iface in ret: + result_iface = { + 'name': iface['name'], + 'hwaddr': iface['hwaddr'] + } + + if 'inet' in iface: + result_iface['inet'] = iface['inet'] + + if 'inet6' in iface: + result_iface['inet6'] = iface['inet6'] + + result.append(result_iface) + + properties[self._fact('lxc_interfaces')] = result + def _get_agent_network_interfaces(self, node, vmid, vmtype): result = [] @@ -526,6 +554,9 @@ class InventoryModule(BaseInventoryPlugin, Constructable, Cacheable): self._get_vm_config(properties, node, vmid, ittype, name) self._get_vm_snapshots(properties, node, vmid, ittype, name) + if ittype == 'lxc': + self._get_lxc_interfaces(properties, node, vmid) + # ensure the host satisfies filters if not self._can_add_host(name, properties): return None diff --git a/tests/unit/plugins/inventory/test_proxmox.py b/tests/unit/plugins/inventory/test_proxmox.py index ea6c84bcda..b8358df226 100644 --- a/tests/unit/plugins/inventory/test_proxmox.py +++ b/tests/unit/plugins/inventory/test_proxmox.py @@ -37,7 +37,7 @@ def get_auth(): # NOTE: when updating/adding replies to this function, # be sure to only add only the _contents_ of the 'data' dict in the API reply -def get_json(url): +def get_json(url, ignore_errors=None): if url == "https://localhost:8006/api2/json/nodes": # _get_nodes return [{"type": "node",