Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .changelogs/2.3.1/fix-tag-separator-parsing.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
fixed:
- Support comma, semicolon, and whitespace tag separators in get_tags_from_guests to align with Proxmox VE API format.
6 changes: 5 additions & 1 deletion proxlb/models/tags.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down
50 changes: 50 additions & 0 deletions tests/test_tags.py
Original file line number Diff line number Diff line change
@@ -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()