pvl/hosts/zone.py
changeset 487 920394061b6f
parent 475 a76571e27c6f
child 489 7f1bd12e0d54
--- a/pvl/hosts/zone.py	Thu Feb 26 15:23:00 2015 +0200
+++ b/pvl/hosts/zone.py	Thu Feb 26 15:25:09 2015 +0200
@@ -5,37 +5,10 @@
 import ipaddr
 import logging; log = logging.getLogger('pvl.hosts.zone')
 import pvl.dns
-
-class HostZoneError(Exception):
-    pass
-
-def resolve (origin, domain, name) :
-    """
-        Resolve relative CNAME for label@origin -> alias@domain
-    """
+import pvl.hosts.host
 
-    if origin:
-        origin = pvl.dns.fqdn(origin)
-    
-    if domain:
-        fqdn = pvl.dns.fqdn(name, domain)
-    else:
-        fqdn = pvl.dns.fqdn(name)
-
-    if not origin:
-        return fqdn
-
-    elif domain == origin:
-         return name
-
-    elif fqdn.endswith('.' + origin):
-        return pvl.dns.relative(origin, fqdn)
-
-    elif domain:
-        raise HostZoneError("{name}: domain {domain} out of zone {origin}".format(name=name, domain=domain, origin=origin))
-
-    else:
-        raise HostZoneError("{name}: fqdn {fqdn} out of zone {origin}".format(name=name, fqdn=fqdn, origin=origin))
+class HostZoneError(pvl.hosts.host.HostError):
+    pass
 
 # TODO: generate location alias CNAMEs even if host itself is outside origin?
 def host_forward (host, origin) :
@@ -44,8 +17,8 @@
     """
 
     try:
-        label = resolve(origin, host.domain, host.name)
-    except HostZoneError as error:
+        label = pvl.dns.relative(origin, host.domain, host.name)
+    except ValueError as error:
         log.info("%s: skip: %s", host, error)
         return
 
@@ -75,22 +48,34 @@
     if host.location:
         location_alias, location_domain = host.location
         
-        yield pvl.dns.ZoneRecord.CNAME(resolve(origin, location_domain, location_alias), label)
+        try:
+            yield pvl.dns.ZoneRecord.CNAME(pvl.dns.relative(origin, location_domain, location_alias), label)
+        except ValueError as error:
+            raise HostZoneError(host, error)
 
     for alias in host.alias:
-        yield pvl.dns.ZoneRecord.CNAME(resolve(origin, host.domain, alias), label)
+        try:
+            yield pvl.dns.ZoneRecord.CNAME(pvl.dns.relative(origin, host.domain, alias), label)
+        except ValueError as error:
+            raise HostZoneError(host, error)
 
     for alias in host.alias4:
         if not host.ip:
             raise HostZoneError(host, "alias4={host.alias4} without ip=".format(host=host))
 
-        yield pvl.dns.ZoneRecord.A(resolve(origin, host.domain, alias), host.ip)
+        try:
+            yield pvl.dns.ZoneRecord.A(pvl.dns.relative(origin, host.domain, alias), host.ip)
+        except ValueError as error:
+            raise HostZoneError(host, error)
 
     for alias in host.alias6:
         if not host.ip6:
             raise HostZoneError(host, "alias6={host.alias6} without ip6=".format(host=host))
 
-        yield pvl.dns.ZoneRecord.AAAA(resolve(origin, host.domain, alias), host.ip6)
+        try:
+            yield pvl.dns.ZoneRecord.AAAA(pvl.dns.relative(origin, host.domain, alias), host.ip6)
+        except ValueError as error:
+            raise HostZoneError(host, error)
 
 def host_reverse (host, prefix) :
     """
@@ -161,11 +146,11 @@
 
         for rr in host_forward(host, origin) :
             if (rr.name, 'CNAME') in by_name_type:
-                raise HostZoneError(host, "{host}: CNAME {cname} conflict: {rr}".format(host=host, cname=by_name_type[rr.name, 'CNAME'].name, rr=rr))
+                raise HostZoneError(host, "CNAME {cname} conflict: {rr}".format(cname=by_name_type[rr.name, 'CNAME'].name, rr=rr))
             elif rr.type == 'CNAME' and rr.name in by_name:
-                raise HostZoneError(host, "{host}: CNAME {cname} conflict: {rr}".format(host=host, cname=rr.name, rr=by_name[rr.name]))
+                raise HostZoneError(host, "CNAME {cname} conflict: {rr}".format(cname=rr.name, rr=by_name[rr.name]))
             elif (rr.name, rr.type) in by_name_type:
-                raise HostZoneError(host, "{host}: {type} {name} conflict: {rr}".format(host=host, type=rr.type, name=rr.name, rr=by_name_type[rr.name, rr.type]))
+                raise HostZoneError(host, "{type} {name} conflict: {rr}".format(type=rr.type, name=rr.name, rr=by_name_type[rr.name, rr.type]))
             
             by_name[rr.name] = rr
             by_name_type[rr.name, rr.type] = rr