Only derive the template name from VM names dynamicweb itself produced

On production 143 of 233 active VMs reference a deleted template, and
many of those were created or renamed outside dynamicweb ("gitea",
"ipv6only-Alpine 3.15-27397-Jonas"). Blindly cutting at the last "-"
mangled such names, so only strip a trailing "-<vm id>" suffix, which is
exactly what OpenNebulaManager.create_vm appends.
This commit is contained in:
PCoder 2026-10-20 17:01:40 +05:30
commit f30e70c20c
2 changed files with 21 additions and 7 deletions

View file

@ -26,13 +26,18 @@ def strip_template_prefix(name):
return name
def template_name_from_vm_name(vm_name):
def template_name_from_vm_name(vm_name, vm_id):
"""
VMs are named '<template name>-<vm id>' at creation time (see
VMs created by dynamicweb are named '<template name>-<vm id>' (see
OpenNebulaManager.create_vm), so the template name can be recovered
from the VM name when the template itself has been deleted.
from the VM name when the template itself has been deleted. VMs that
were created or renamed outside dynamicweb do not follow that pattern
and are returned unchanged.
"""
return vm_name.rsplit('-', 1)[0]
suffix = '-%s' % vm_id
if vm_name.endswith(suffix):
return vm_name[:-len(suffix)]
return vm_name
class VirtualMachineTemplateSerializer(serializers.Serializer):
@ -188,13 +193,13 @@ class VirtualMachineSerializer(serializers.Serializer):
logger.warning(
"VM %s: %s, falling back to VM name" % (obj.id, err)
)
name = template_name_from_vm_name(obj.name)
name = template_name_from_vm_name(obj.name, obj.id)
except ConnectionRefusedError:
logger.error(
"VM %s: could not fetch template pool, falling back to "
"VM name" % obj.id
)
name = template_name_from_vm_name(obj.name)
name = template_name_from_vm_name(obj.name, obj.id)
return strip_template_prefix(name)
def get_ipv4(self, obj):

View file

@ -173,10 +173,19 @@ class TemplateNameHelpersTestCase(TestCase):
def test_template_name_from_vm_name(self):
self.assertEqual(
template_name_from_vm_name('public-Ubuntu 20.10-26623'),
template_name_from_vm_name('public-Ubuntu 20.10-26623', 26623),
'public-Ubuntu 20.10'
)
def test_template_name_from_vm_name_keeps_custom_names(self):
# VMs created or renamed outside dynamicweb
self.assertEqual(template_name_from_vm_name('gitea', 27001), 'gitea')
self.assertEqual(
template_name_from_vm_name('ipv6only-Alpine 3.15-27397-Jonas',
27397),
'ipv6only-Alpine 3.15-27397-Jonas'
)
def _fake_vm(vm_id, name, template_id):
vm = MagicMock()