1
0
Fork 0
mirror of https://github.com/retspen/webvirtcloud synced 2026-11-10 12:16:49 +00:00

feat(computes): a compute names the address migrations reach it on

Migration is client-driven: libvirt sends the VM's memory to the
destination's own host name unless a migration URI is given, and the
app never gave one. Where the hosts cannot resolve each other's names
(or the names point at a management network) every migration failed
with "Unable to resolve address '<host name>' service '49152'".

A compute now has an optional migration address (an IP address or a
host name, no scheme or port), editable in the compute form and the
API. A VM migrating to that compute is sent to tcp://<address>
(bracketed for IPv6). Empty, the default for existing computes, keeps
the previous behavior. The compute's host name is not reused, because
for SSH computes it can be an ssh_config alias.

The migration log entry names the address when one is set.
This commit is contained in:
catborise 2026-10-06 12:08:04 +03:00
parent 25b3671c33
commit 5a523befbd
10 changed files with 158 additions and 3 deletions

View file

@ -1,4 +1,5 @@
import re
from ipaddress import ip_address
from django.core.exceptions import ValidationError
from django.utils.translation import gettext_lazy as _
@ -24,3 +25,17 @@ def validate_name(value):
have_symbol = wrong_name.match("[^a-zA-Z0-9._-]+")
if have_symbol:
raise ValidationError(_("The hostname must not contain any special characters"))
_hostname = re.compile(r"[A-Za-z0-9]([A-Za-z0-9-]{0,61}[A-Za-z0-9])?(\.[A-Za-z0-9]([A-Za-z0-9-]{0,61}[A-Za-z0-9])?)*\.?")
def validate_migration_address(value):
"""An IP address (no IPv6 scope) or a host name: no scheme, port or brackets."""
try:
if not getattr(ip_address(value), "scope_id", None):
return
except ValueError:
if _hostname.fullmatch(value):
return
raise ValidationError(_("Enter an IP address or a host name, without a scheme or port"))