diff --git a/.changelogs/2.3.1/fix-tag-separator-parsing.yml b/.changelogs/2.3.1/fix-tag-separator-parsing.yml new file mode 100644 index 0000000..d4efd65 --- /dev/null +++ b/.changelogs/2.3.1/fix-tag-separator-parsing.yml @@ -0,0 +1,2 @@ +fixed: + - Support comma, semicolon, and whitespace tag separators in get_tags_from_guests to align with Proxmox VE API format. diff --git a/proxlb/models/tags.py b/proxlb/models/tags.py index 85597ff..21cbb27 100644 --- a/proxlb/models/tags.py +++ b/proxlb/models/tags.py @@ -10,6 +10,7 @@ __license__ = "GPL-3.0" +import re import time from typing import Dict, List, assert_never from proxlb.utils.logger import SystemdLogger @@ -81,7 +82,10 @@ def get_tags_from_guests(proxmox_api: ProxmoxApi, node: str, guest_id: int, gues else: assert_never(guest_type) - tags = api_tags.split(";") if isinstance(api_tags, str) else [] + if isinstance(api_tags, str) and api_tags.strip(): + tags = [t.strip() for t in re.split(r"[,;\s]+", api_tags.strip()) if t.strip()] + else: + tags = [] logger.debug("Finished: get_tags_from_guests.") return tags diff --git a/tests/test_tags.py b/tests/test_tags.py new file mode 100644 index 0000000..d93c072 --- /dev/null +++ b/tests/test_tags.py @@ -0,0 +1,50 @@ +import unittest +from unittest.mock import MagicMock +from proxlb.models.tags import Tags +from proxlb.utils.config_parser import Config + +GuestType = Config.GuestType + + +class TestTags(unittest.TestCase): + def test_get_tags_from_guests_comma_separated(self): + proxmox_api = MagicMock() + proxmox_api.nodes.return_value.qemu.return_value.config.get.return_value = { + "tags": "infra,k8s,plb_anti_affinity_k8s_masters" + } + tags = Tags.get_tags_from_guests(proxmox_api, "pve01", 111, GuestType.Vm) + self.assertEqual(tags, ["infra", "k8s", "plb_anti_affinity_k8s_masters"]) + + def test_get_tags_from_guests_comma_with_spaces(self): + proxmox_api = MagicMock() + proxmox_api.nodes.return_value.qemu.return_value.config.get.return_value = { + "tags": "infra, k8s, plb_anti_affinity_k8s_masters" + } + tags = Tags.get_tags_from_guests(proxmox_api, "pve01", 111, GuestType.Vm) + self.assertEqual(tags, ["infra", "k8s", "plb_anti_affinity_k8s_masters"]) + + def test_get_tags_from_guests_semicolon_separated(self): + proxmox_api = MagicMock() + proxmox_api.nodes.return_value.qemu.return_value.config.get.return_value = { + "tags": "infra;k8s;plb_anti_affinity_k8s_masters" + } + tags = Tags.get_tags_from_guests(proxmox_api, "pve01", 111, GuestType.Vm) + self.assertEqual(tags, ["infra", "k8s", "plb_anti_affinity_k8s_masters"]) + + def test_get_tags_from_guests_lxc_container(self): + proxmox_api = MagicMock() + proxmox_api.nodes.return_value.lxc.return_value.config.get.return_value = { + "tags": "infra,web" + } + tags = Tags.get_tags_from_guests(proxmox_api, "pve01", 112, GuestType.Ct) + self.assertEqual(tags, ["infra", "web"]) + + def test_get_tags_from_guests_empty(self): + proxmox_api = MagicMock() + proxmox_api.nodes.return_value.qemu.return_value.config.get.return_value = {} + tags = Tags.get_tags_from_guests(proxmox_api, "pve01", 111, GuestType.Vm) + self.assertEqual(tags, []) + + +if __name__ == "__main__": + unittest.main()