pvl/hosts/host.py
changeset 734 5770ed34c1f0
parent 733 45bedeba92e5
child 738 3104fdf7ea26
--- a/pvl/hosts/host.py	Mon Mar 09 18:00:18 2015 +0200
+++ b/pvl/hosts/host.py	Mon Mar 09 19:47:10 2015 +0200
@@ -154,10 +154,18 @@
         A host is a network node that can have multiple ethernet interfaces, and multiple IP addresses in different domains.
     """
 
-    # the label used for alias4/6 hosts
-    ALIAS4_FMT = '{host}-ipv4'
-    ALIAS6_FMT = '{host}-ipv6'
-   
+    EXTENSIONS = { }
+
+    @classmethod
+    def build_extensions(cls, extensions):
+        for extension, value in extensions.iteritems():
+            extension_cls = cls.EXTENSIONS.get(extension)
+
+            if extension_cls:
+                yield extension, extension_cls.build(**value)
+            else:
+                log.warning("skip unknown extension: %s", extension)
+
     @classmethod
     def build (cls, name, domain,
             ip=None, ip6=None,
@@ -181,6 +189,7 @@
 
         ip = {label: (ip4.get(label), ip6.get(label)) for label in set(ip4) | set(ip6)}
 
+
         return cls(name,
                 domain      = domain,
                 ip4         = ip4.get(None),
@@ -196,7 +205,7 @@
                 reverse     = parse_str(reverse),
                 down        = parse_bool(down),
                 boot        = parse_dhcp_boot(boot),
-                extensions  = extensions,
+                extensions  = dict(cls.build_extensions(extensions)),
         )
 
     def __init__ (self, name, domain,
@@ -260,6 +269,23 @@
             # sorts first
             return ipaddr.IPAddress(0)
 
+    def addresses (self):
+        """
+            Yield (sublabel, ipaddr) records.
+        """
+
+        for sublabel, (ip4, ip6) in self.ip.iteritems():
+
+            if ip4:
+                yield sublabel, ip4
+
+            if ip6:
+                yield sublabel, ip6
+
+        for extension in self.extensions.itervalues():
+            for sublabel, ip in extension.addresses():
+                yield sublabel, ip
+
     def fqdn (self):
         if self.domain:
             return pvl.dns.fqdn(self.name, self.domain)
@@ -270,3 +296,19 @@
         return "{self.name}@{domain}".format(self=self,
                 domain      = self.domain or '',
         )
+
+class HostExtension (object):
+    """
+        Extension hooks
+    """
+
+    def addresses (self):
+        return ()
+
+def extension (cls):
+    """
+        Register an extension class
+    """
+
+    Host.EXTENSIONS[cls.EXTENSION] = cls
+