pvl/hosts/interface.py
author Tero Marttila <terom@paivola.fi>
Tue, 10 Mar 2015 00:11:43 +0200
changeset 739 5149c39f3dfc
parent 738 3104fdf7ea26
child 740 74352351d6f5
permissions -rw-r--r--
pvl.hosts: improve HostExtension support enough to move boot= into pvl.hosts.dhcp
738
3104fdf7ea26 pvl.hosts.hosts: drop support for instanced ip.* in favor of improved interface:ip.* =
Tero Marttila <terom@paivola.fi>
parents: 736
diff changeset
     1
import collections
735
008cfe47b194 pvl.hosts.interface: sub-interfaces for a host, which are not associated with any separate domain/network
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     2
import ipaddress, ipaddr # XXX: conversion
008cfe47b194 pvl.hosts.interface: sub-interfaces for a host, which are not associated with any separate domain/network
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     3
import pvl.hosts
738
3104fdf7ea26 pvl.hosts.hosts: drop support for instanced ip.* in favor of improved interface:ip.* =
Tero Marttila <terom@paivola.fi>
parents: 736
diff changeset
     4
import pvl.hosts.host
735
008cfe47b194 pvl.hosts.interface: sub-interfaces for a host, which are not associated with any separate domain/network
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     5
738
3104fdf7ea26 pvl.hosts.hosts: drop support for instanced ip.* in favor of improved interface:ip.* =
Tero Marttila <terom@paivola.fi>
parents: 736
diff changeset
     6
class HostInterface(object):
3104fdf7ea26 pvl.hosts.hosts: drop support for instanced ip.* in favor of improved interface:ip.* =
Tero Marttila <terom@paivola.fi>
parents: 736
diff changeset
     7
    """
3104fdf7ea26 pvl.hosts.hosts: drop support for instanced ip.* in favor of improved interface:ip.* =
Tero Marttila <terom@paivola.fi>
parents: 736
diff changeset
     8
        A single host-interface.
3104fdf7ea26 pvl.hosts.hosts: drop support for instanced ip.* in favor of improved interface:ip.* =
Tero Marttila <terom@paivola.fi>
parents: 736
diff changeset
     9
    """
735
008cfe47b194 pvl.hosts.interface: sub-interfaces for a host, which are not associated with any separate domain/network
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    10
738
3104fdf7ea26 pvl.hosts.hosts: drop support for instanced ip.* in favor of improved interface:ip.* =
Tero Marttila <terom@paivola.fi>
parents: 736
diff changeset
    11
    ip4 = None
3104fdf7ea26 pvl.hosts.hosts: drop support for instanced ip.* in favor of improved interface:ip.* =
Tero Marttila <terom@paivola.fi>
parents: 736
diff changeset
    12
3104fdf7ea26 pvl.hosts.hosts: drop support for instanced ip.* in favor of improved interface:ip.* =
Tero Marttila <terom@paivola.fi>
parents: 736
diff changeset
    13
    def __init__(self, name):
3104fdf7ea26 pvl.hosts.hosts: drop support for instanced ip.* in favor of improved interface:ip.* =
Tero Marttila <terom@paivola.fi>
parents: 736
diff changeset
    14
        self.name = name
3104fdf7ea26 pvl.hosts.hosts: drop support for instanced ip.* in favor of improved interface:ip.* =
Tero Marttila <terom@paivola.fi>
parents: 736
diff changeset
    15
3104fdf7ea26 pvl.hosts.hosts: drop support for instanced ip.* in favor of improved interface:ip.* =
Tero Marttila <terom@paivola.fi>
parents: 736
diff changeset
    16
    def __str__(self):
3104fdf7ea26 pvl.hosts.hosts: drop support for instanced ip.* in favor of improved interface:ip.* =
Tero Marttila <terom@paivola.fi>
parents: 736
diff changeset
    17
        return self.name
3104fdf7ea26 pvl.hosts.hosts: drop support for instanced ip.* in favor of improved interface:ip.* =
Tero Marttila <terom@paivola.fi>
parents: 736
diff changeset
    18
    
739
5149c39f3dfc pvl.hosts: improve HostExtension support enough to move boot= into pvl.hosts.dhcp
Tero Marttila <terom@paivola.fi>
parents: 738
diff changeset
    19
@pvl.hosts.host.register_extension
5149c39f3dfc pvl.hosts: improve HostExtension support enough to move boot= into pvl.hosts.dhcp
Tero Marttila <terom@paivola.fi>
parents: 738
diff changeset
    20
class HostInterfaces(pvl.hosts.host.HostExtension):
738
3104fdf7ea26 pvl.hosts.hosts: drop support for instanced ip.* in favor of improved interface:ip.* =
Tero Marttila <terom@paivola.fi>
parents: 736
diff changeset
    21
    """
3104fdf7ea26 pvl.hosts.hosts: drop support for instanced ip.* in favor of improved interface:ip.* =
Tero Marttila <terom@paivola.fi>
parents: 736
diff changeset
    22
        A host with multiple sub-interfaces.
3104fdf7ea26 pvl.hosts.hosts: drop support for instanced ip.* in favor of improved interface:ip.* =
Tero Marttila <terom@paivola.fi>
parents: 736
diff changeset
    23
3104fdf7ea26 pvl.hosts.hosts: drop support for instanced ip.* in favor of improved interface:ip.* =
Tero Marttila <terom@paivola.fi>
parents: 736
diff changeset
    24
        Typically used for point-to-point interfaces between routers. For multi-homed hosts, it might make
3104fdf7ea26 pvl.hosts.hosts: drop support for instanced ip.* in favor of improved interface:ip.* =
Tero Marttila <terom@paivola.fi>
parents: 736
diff changeset
    25
        more sense to use multiple hosts in different domains.
3104fdf7ea26 pvl.hosts.hosts: drop support for instanced ip.* in favor of improved interface:ip.* =
Tero Marttila <terom@paivola.fi>
parents: 736
diff changeset
    26
3104fdf7ea26 pvl.hosts.hosts: drop support for instanced ip.* in favor of improved interface:ip.* =
Tero Marttila <terom@paivola.fi>
parents: 736
diff changeset
    27
            [foo]
3104fdf7ea26 pvl.hosts.hosts: drop support for instanced ip.* in favor of improved interface:ip.* =
Tero Marttila <terom@paivola.fi>
parents: 736
diff changeset
    28
                interface:ip.eth0 = 10.255.1.1/30
3104fdf7ea26 pvl.hosts.hosts: drop support for instanced ip.* in favor of improved interface:ip.* =
Tero Marttila <terom@paivola.fi>
parents: 736
diff changeset
    29
3104fdf7ea26 pvl.hosts.hosts: drop support for instanced ip.* in favor of improved interface:ip.* =
Tero Marttila <terom@paivola.fi>
parents: 736
diff changeset
    30
            [bar]
3104fdf7ea26 pvl.hosts.hosts: drop support for instanced ip.* in favor of improved interface:ip.* =
Tero Marttila <terom@paivola.fi>
parents: 736
diff changeset
    31
                interface:ip.eth1 = 10.255.1.2/30
3104fdf7ea26 pvl.hosts.hosts: drop support for instanced ip.* in favor of improved interface:ip.* =
Tero Marttila <terom@paivola.fi>
parents: 736
diff changeset
    32
    """
3104fdf7ea26 pvl.hosts.hosts: drop support for instanced ip.* in favor of improved interface:ip.* =
Tero Marttila <terom@paivola.fi>
parents: 736
diff changeset
    33
735
008cfe47b194 pvl.hosts.interface: sub-interfaces for a host, which are not associated with any separate domain/network
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    34
    EXTENSION = 'interface'
008cfe47b194 pvl.hosts.interface: sub-interfaces for a host, which are not associated with any separate domain/network
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    35
008cfe47b194 pvl.hosts.interface: sub-interfaces for a host, which are not associated with any separate domain/network
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    36
    @classmethod
738
3104fdf7ea26 pvl.hosts.hosts: drop support for instanced ip.* in favor of improved interface:ip.* =
Tero Marttila <terom@paivola.fi>
parents: 736
diff changeset
    37
    def build (cls, ip={}):
3104fdf7ea26 pvl.hosts.hosts: drop support for instanced ip.* in favor of improved interface:ip.* =
Tero Marttila <terom@paivola.fi>
parents: 736
diff changeset
    38
        interfaces = collections.defaultdict(HostInterface)
3104fdf7ea26 pvl.hosts.hosts: drop support for instanced ip.* in favor of improved interface:ip.* =
Tero Marttila <terom@paivola.fi>
parents: 736
diff changeset
    39
        
3104fdf7ea26 pvl.hosts.hosts: drop support for instanced ip.* in favor of improved interface:ip.* =
Tero Marttila <terom@paivola.fi>
parents: 736
diff changeset
    40
        for iface, ip in pvl.hosts.host.parse_dict(ip, parse=ipaddress.ip_interface).iteritems():
3104fdf7ea26 pvl.hosts.hosts: drop support for instanced ip.* in favor of improved interface:ip.* =
Tero Marttila <terom@paivola.fi>
parents: 736
diff changeset
    41
            if iface in interfaces:
3104fdf7ea26 pvl.hosts.hosts: drop support for instanced ip.* in favor of improved interface:ip.* =
Tero Marttila <terom@paivola.fi>
parents: 736
diff changeset
    42
                iface = interfaces[iface]
3104fdf7ea26 pvl.hosts.hosts: drop support for instanced ip.* in favor of improved interface:ip.* =
Tero Marttila <terom@paivola.fi>
parents: 736
diff changeset
    43
            else:
3104fdf7ea26 pvl.hosts.hosts: drop support for instanced ip.* in favor of improved interface:ip.* =
Tero Marttila <terom@paivola.fi>
parents: 736
diff changeset
    44
                iface = interfaces[iface] = HostInterface(iface)
3104fdf7ea26 pvl.hosts.hosts: drop support for instanced ip.* in favor of improved interface:ip.* =
Tero Marttila <terom@paivola.fi>
parents: 736
diff changeset
    45
3104fdf7ea26 pvl.hosts.hosts: drop support for instanced ip.* in favor of improved interface:ip.* =
Tero Marttila <terom@paivola.fi>
parents: 736
diff changeset
    46
            interfaces[iface].ip4 = ip
3104fdf7ea26 pvl.hosts.hosts: drop support for instanced ip.* in favor of improved interface:ip.* =
Tero Marttila <terom@paivola.fi>
parents: 736
diff changeset
    47
        
3104fdf7ea26 pvl.hosts.hosts: drop support for instanced ip.* in favor of improved interface:ip.* =
Tero Marttila <terom@paivola.fi>
parents: 736
diff changeset
    48
        return cls(interfaces)
735
008cfe47b194 pvl.hosts.interface: sub-interfaces for a host, which are not associated with any separate domain/network
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    49
008cfe47b194 pvl.hosts.interface: sub-interfaces for a host, which are not associated with any separate domain/network
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    50
    def __init__ (self, interfaces):
008cfe47b194 pvl.hosts.interface: sub-interfaces for a host, which are not associated with any separate domain/network
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    51
        self.interfaces = interfaces
008cfe47b194 pvl.hosts.interface: sub-interfaces for a host, which are not associated with any separate domain/network
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    52
008cfe47b194 pvl.hosts.interface: sub-interfaces for a host, which are not associated with any separate domain/network
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    53
    def addresses (self):
738
3104fdf7ea26 pvl.hosts.hosts: drop support for instanced ip.* in favor of improved interface:ip.* =
Tero Marttila <terom@paivola.fi>
parents: 736
diff changeset
    54
        """
3104fdf7ea26 pvl.hosts.hosts: drop support for instanced ip.* in favor of improved interface:ip.* =
Tero Marttila <terom@paivola.fi>
parents: 736
diff changeset
    55
            Yield additional sub-addresses for host interfaces.
3104fdf7ea26 pvl.hosts.hosts: drop support for instanced ip.* in favor of improved interface:ip.* =
Tero Marttila <terom@paivola.fi>
parents: 736
diff changeset
    56
        """
3104fdf7ea26 pvl.hosts.hosts: drop support for instanced ip.* in favor of improved interface:ip.* =
Tero Marttila <terom@paivola.fi>
parents: 736
diff changeset
    57
3104fdf7ea26 pvl.hosts.hosts: drop support for instanced ip.* in favor of improved interface:ip.* =
Tero Marttila <terom@paivola.fi>
parents: 736
diff changeset
    58
        for iface in self:
3104fdf7ea26 pvl.hosts.hosts: drop support for instanced ip.* in favor of improved interface:ip.* =
Tero Marttila <terom@paivola.fi>
parents: 736
diff changeset
    59
            if iface.ip4:
3104fdf7ea26 pvl.hosts.hosts: drop support for instanced ip.* in favor of improved interface:ip.* =
Tero Marttila <terom@paivola.fi>
parents: 736
diff changeset
    60
                # XXX: convert
3104fdf7ea26 pvl.hosts.hosts: drop support for instanced ip.* in favor of improved interface:ip.* =
Tero Marttila <terom@paivola.fi>
parents: 736
diff changeset
    61
                yield iface.name, ipaddr.IPv4Address(str(iface.ip4.ip))
3104fdf7ea26 pvl.hosts.hosts: drop support for instanced ip.* in favor of improved interface:ip.* =
Tero Marttila <terom@paivola.fi>
parents: 736
diff changeset
    62
    
3104fdf7ea26 pvl.hosts.hosts: drop support for instanced ip.* in favor of improved interface:ip.* =
Tero Marttila <terom@paivola.fi>
parents: 736
diff changeset
    63
    def __iter__(self):
3104fdf7ea26 pvl.hosts.hosts: drop support for instanced ip.* in favor of improved interface:ip.* =
Tero Marttila <terom@paivola.fi>
parents: 736
diff changeset
    64
        """
3104fdf7ea26 pvl.hosts.hosts: drop support for instanced ip.* in favor of improved interface:ip.* =
Tero Marttila <terom@paivola.fi>
parents: 736
diff changeset
    65
            HostInterface's with stable ordering.
3104fdf7ea26 pvl.hosts.hosts: drop support for instanced ip.* in favor of improved interface:ip.* =
Tero Marttila <terom@paivola.fi>
parents: 736
diff changeset
    66
        """
3104fdf7ea26 pvl.hosts.hosts: drop support for instanced ip.* in favor of improved interface:ip.* =
Tero Marttila <terom@paivola.fi>
parents: 736
diff changeset
    67
3104fdf7ea26 pvl.hosts.hosts: drop support for instanced ip.* in favor of improved interface:ip.* =
Tero Marttila <terom@paivola.fi>
parents: 736
diff changeset
    68
        return iter(sorted(self.interfaces.itervalues(), key=str))
3104fdf7ea26 pvl.hosts.hosts: drop support for instanced ip.* in favor of improved interface:ip.* =
Tero Marttila <terom@paivola.fi>
parents: 736
diff changeset
    69