pvl/hosts/dhcp.py
author Tero Marttila <terom@paivola.fi>
Tue, 10 Mar 2015 00:11:43 +0200
changeset 739 5149c39f3dfc
parent 733 45bedeba92e5
permissions -rw-r--r--
pvl.hosts: improve HostExtension support enough to move boot= into pvl.hosts.dhcp
479
1e68e3a30b51 pvl.hosts.dhcp: split out of script, refactor using pvl.dhcp.config, and test
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
     1
import pvl.dhcp.config
1e68e3a30b51 pvl.hosts.dhcp: split out of script, refactor using pvl.dhcp.config, and test
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
     2
import pvl.hosts.host
1e68e3a30b51 pvl.hosts.dhcp: split out of script, refactor using pvl.dhcp.config, and test
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
     3
739
5149c39f3dfc pvl.hosts: improve HostExtension support enough to move boot= into pvl.hosts.dhcp
Tero Marttila <terom@paivola.fi>
parents: 733
diff changeset
     4
def parse_dhcp_boot(boot):
5149c39f3dfc pvl.hosts: improve HostExtension support enough to move boot= into pvl.hosts.dhcp
Tero Marttila <terom@paivola.fi>
parents: 733
diff changeset
     5
    """
5149c39f3dfc pvl.hosts: improve HostExtension support enough to move boot= into pvl.hosts.dhcp
Tero Marttila <terom@paivola.fi>
parents: 733
diff changeset
     6
        Parse the dhcp boot=... option
5149c39f3dfc pvl.hosts: improve HostExtension support enough to move boot= into pvl.hosts.dhcp
Tero Marttila <terom@paivola.fi>
parents: 733
diff changeset
     7
5149c39f3dfc pvl.hosts: improve HostExtension support enough to move boot= into pvl.hosts.dhcp
Tero Marttila <terom@paivola.fi>
parents: 733
diff changeset
     8
        >>> print parse_dhcp_boot(None)
5149c39f3dfc pvl.hosts: improve HostExtension support enough to move boot= into pvl.hosts.dhcp
Tero Marttila <terom@paivola.fi>
parents: 733
diff changeset
     9
        {}
5149c39f3dfc pvl.hosts: improve HostExtension support enough to move boot= into pvl.hosts.dhcp
Tero Marttila <terom@paivola.fi>
parents: 733
diff changeset
    10
        >>> print parse_dhcp_boot({'filename': '/foo'})
5149c39f3dfc pvl.hosts: improve HostExtension support enough to move boot= into pvl.hosts.dhcp
Tero Marttila <terom@paivola.fi>
parents: 733
diff changeset
    11
        {'filename': '/foo'}
5149c39f3dfc pvl.hosts: improve HostExtension support enough to move boot= into pvl.hosts.dhcp
Tero Marttila <terom@paivola.fi>
parents: 733
diff changeset
    12
        >>> print parse_dhcp_boot({'filename': '/foo', 'next-server': 'bar'})
5149c39f3dfc pvl.hosts: improve HostExtension support enough to move boot= into pvl.hosts.dhcp
Tero Marttila <terom@paivola.fi>
parents: 733
diff changeset
    13
        {'next-server': 'bar', 'filename': '/foo'}
5149c39f3dfc pvl.hosts: improve HostExtension support enough to move boot= into pvl.hosts.dhcp
Tero Marttila <terom@paivola.fi>
parents: 733
diff changeset
    14
        >>> print parse_dhcp_boot('/foo')
5149c39f3dfc pvl.hosts: improve HostExtension support enough to move boot= into pvl.hosts.dhcp
Tero Marttila <terom@paivola.fi>
parents: 733
diff changeset
    15
        {'filename': '/foo'}
5149c39f3dfc pvl.hosts: improve HostExtension support enough to move boot= into pvl.hosts.dhcp
Tero Marttila <terom@paivola.fi>
parents: 733
diff changeset
    16
        >>> print parse_dhcp_boot('bar:/foo')
5149c39f3dfc pvl.hosts: improve HostExtension support enough to move boot= into pvl.hosts.dhcp
Tero Marttila <terom@paivola.fi>
parents: 733
diff changeset
    17
        {'next-server': 'bar', 'filename': '/foo'}
5149c39f3dfc pvl.hosts: improve HostExtension support enough to move boot= into pvl.hosts.dhcp
Tero Marttila <terom@paivola.fi>
parents: 733
diff changeset
    18
        >>> print parse_dhcp_boot('bar:')
5149c39f3dfc pvl.hosts: improve HostExtension support enough to move boot= into pvl.hosts.dhcp
Tero Marttila <terom@paivola.fi>
parents: 733
diff changeset
    19
        {'next-server': 'bar'}
5149c39f3dfc pvl.hosts: improve HostExtension support enough to move boot= into pvl.hosts.dhcp
Tero Marttila <terom@paivola.fi>
parents: 733
diff changeset
    20
        >>> print parse_dhcp_boot('foo')
5149c39f3dfc pvl.hosts: improve HostExtension support enough to move boot= into pvl.hosts.dhcp
Tero Marttila <terom@paivola.fi>
parents: 733
diff changeset
    21
        Traceback (most recent call last):
5149c39f3dfc pvl.hosts: improve HostExtension support enough to move boot= into pvl.hosts.dhcp
Tero Marttila <terom@paivola.fi>
parents: 733
diff changeset
    22
            ...
5149c39f3dfc pvl.hosts: improve HostExtension support enough to move boot= into pvl.hosts.dhcp
Tero Marttila <terom@paivola.fi>
parents: 733
diff changeset
    23
        ValueError: invalid boot=foo
5149c39f3dfc pvl.hosts: improve HostExtension support enough to move boot= into pvl.hosts.dhcp
Tero Marttila <terom@paivola.fi>
parents: 733
diff changeset
    24
    """
5149c39f3dfc pvl.hosts: improve HostExtension support enough to move boot= into pvl.hosts.dhcp
Tero Marttila <terom@paivola.fi>
parents: 733
diff changeset
    25
    
5149c39f3dfc pvl.hosts: improve HostExtension support enough to move boot= into pvl.hosts.dhcp
Tero Marttila <terom@paivola.fi>
parents: 733
diff changeset
    26
    # unpack dict, or str
5149c39f3dfc pvl.hosts: improve HostExtension support enough to move boot= into pvl.hosts.dhcp
Tero Marttila <terom@paivola.fi>
parents: 733
diff changeset
    27
    if not boot:
5149c39f3dfc pvl.hosts: improve HostExtension support enough to move boot= into pvl.hosts.dhcp
Tero Marttila <terom@paivola.fi>
parents: 733
diff changeset
    28
        filename = next_server = None
5149c39f3dfc pvl.hosts: improve HostExtension support enough to move boot= into pvl.hosts.dhcp
Tero Marttila <terom@paivola.fi>
parents: 733
diff changeset
    29
        boot_str = None
5149c39f3dfc pvl.hosts: improve HostExtension support enough to move boot= into pvl.hosts.dhcp
Tero Marttila <terom@paivola.fi>
parents: 733
diff changeset
    30
5149c39f3dfc pvl.hosts: improve HostExtension support enough to move boot= into pvl.hosts.dhcp
Tero Marttila <terom@paivola.fi>
parents: 733
diff changeset
    31
    elif isinstance(boot, dict):
5149c39f3dfc pvl.hosts: improve HostExtension support enough to move boot= into pvl.hosts.dhcp
Tero Marttila <terom@paivola.fi>
parents: 733
diff changeset
    32
        filename = boot.pop('filename', None)
5149c39f3dfc pvl.hosts: improve HostExtension support enough to move boot= into pvl.hosts.dhcp
Tero Marttila <terom@paivola.fi>
parents: 733
diff changeset
    33
        next_server = boot.pop('next-server', None)
5149c39f3dfc pvl.hosts: improve HostExtension support enough to move boot= into pvl.hosts.dhcp
Tero Marttila <terom@paivola.fi>
parents: 733
diff changeset
    34
        boot_str = boot.pop(None, None)
5149c39f3dfc pvl.hosts: improve HostExtension support enough to move boot= into pvl.hosts.dhcp
Tero Marttila <terom@paivola.fi>
parents: 733
diff changeset
    35
5149c39f3dfc pvl.hosts: improve HostExtension support enough to move boot= into pvl.hosts.dhcp
Tero Marttila <terom@paivola.fi>
parents: 733
diff changeset
    36
    else:
5149c39f3dfc pvl.hosts: improve HostExtension support enough to move boot= into pvl.hosts.dhcp
Tero Marttila <terom@paivola.fi>
parents: 733
diff changeset
    37
        filename = next_server = None
5149c39f3dfc pvl.hosts: improve HostExtension support enough to move boot= into pvl.hosts.dhcp
Tero Marttila <terom@paivola.fi>
parents: 733
diff changeset
    38
        boot_str = boot
5149c39f3dfc pvl.hosts: improve HostExtension support enough to move boot= into pvl.hosts.dhcp
Tero Marttila <terom@paivola.fi>
parents: 733
diff changeset
    39
        boot = None
5149c39f3dfc pvl.hosts: improve HostExtension support enough to move boot= into pvl.hosts.dhcp
Tero Marttila <terom@paivola.fi>
parents: 733
diff changeset
    40
        
5149c39f3dfc pvl.hosts: improve HostExtension support enough to move boot= into pvl.hosts.dhcp
Tero Marttila <terom@paivola.fi>
parents: 733
diff changeset
    41
    if boot:
5149c39f3dfc pvl.hosts: improve HostExtension support enough to move boot= into pvl.hosts.dhcp
Tero Marttila <terom@paivola.fi>
parents: 733
diff changeset
    42
        raise ValueError("Invalid boot.*: {instances}".format(instances=' '.join(boot)))
5149c39f3dfc pvl.hosts: improve HostExtension support enough to move boot= into pvl.hosts.dhcp
Tero Marttila <terom@paivola.fi>
parents: 733
diff changeset
    43
    
5149c39f3dfc pvl.hosts: improve HostExtension support enough to move boot= into pvl.hosts.dhcp
Tero Marttila <terom@paivola.fi>
parents: 733
diff changeset
    44
    # any boot= given overrides boot.* fields
5149c39f3dfc pvl.hosts: improve HostExtension support enough to move boot= into pvl.hosts.dhcp
Tero Marttila <terom@paivola.fi>
parents: 733
diff changeset
    45
    if not boot_str:
5149c39f3dfc pvl.hosts: improve HostExtension support enough to move boot= into pvl.hosts.dhcp
Tero Marttila <terom@paivola.fi>
parents: 733
diff changeset
    46
        pass
5149c39f3dfc pvl.hosts: improve HostExtension support enough to move boot= into pvl.hosts.dhcp
Tero Marttila <terom@paivola.fi>
parents: 733
diff changeset
    47
5149c39f3dfc pvl.hosts: improve HostExtension support enough to move boot= into pvl.hosts.dhcp
Tero Marttila <terom@paivola.fi>
parents: 733
diff changeset
    48
    elif boot_str.startswith('/'):
5149c39f3dfc pvl.hosts: improve HostExtension support enough to move boot= into pvl.hosts.dhcp
Tero Marttila <terom@paivola.fi>
parents: 733
diff changeset
    49
        filename = boot_str
5149c39f3dfc pvl.hosts: improve HostExtension support enough to move boot= into pvl.hosts.dhcp
Tero Marttila <terom@paivola.fi>
parents: 733
diff changeset
    50
5149c39f3dfc pvl.hosts: improve HostExtension support enough to move boot= into pvl.hosts.dhcp
Tero Marttila <terom@paivola.fi>
parents: 733
diff changeset
    51
    elif boot_str.endswith(':'):
5149c39f3dfc pvl.hosts: improve HostExtension support enough to move boot= into pvl.hosts.dhcp
Tero Marttila <terom@paivola.fi>
parents: 733
diff changeset
    52
        next_server = boot_str[:-1]
5149c39f3dfc pvl.hosts: improve HostExtension support enough to move boot= into pvl.hosts.dhcp
Tero Marttila <terom@paivola.fi>
parents: 733
diff changeset
    53
5149c39f3dfc pvl.hosts: improve HostExtension support enough to move boot= into pvl.hosts.dhcp
Tero Marttila <terom@paivola.fi>
parents: 733
diff changeset
    54
    elif ':' in boot_str:
5149c39f3dfc pvl.hosts: improve HostExtension support enough to move boot= into pvl.hosts.dhcp
Tero Marttila <terom@paivola.fi>
parents: 733
diff changeset
    55
        next_server, filename = boot_str.split(':', 1)
5149c39f3dfc pvl.hosts: improve HostExtension support enough to move boot= into pvl.hosts.dhcp
Tero Marttila <terom@paivola.fi>
parents: 733
diff changeset
    56
5149c39f3dfc pvl.hosts: improve HostExtension support enough to move boot= into pvl.hosts.dhcp
Tero Marttila <terom@paivola.fi>
parents: 733
diff changeset
    57
    else :
5149c39f3dfc pvl.hosts: improve HostExtension support enough to move boot= into pvl.hosts.dhcp
Tero Marttila <terom@paivola.fi>
parents: 733
diff changeset
    58
        raise ValueError("invalid boot={boot}".format(boot=boot_str))
5149c39f3dfc pvl.hosts: improve HostExtension support enough to move boot= into pvl.hosts.dhcp
Tero Marttila <terom@paivola.fi>
parents: 733
diff changeset
    59
    
5149c39f3dfc pvl.hosts: improve HostExtension support enough to move boot= into pvl.hosts.dhcp
Tero Marttila <terom@paivola.fi>
parents: 733
diff changeset
    60
    return next_server, filename
5149c39f3dfc pvl.hosts: improve HostExtension support enough to move boot= into pvl.hosts.dhcp
Tero Marttila <terom@paivola.fi>
parents: 733
diff changeset
    61
5149c39f3dfc pvl.hosts: improve HostExtension support enough to move boot= into pvl.hosts.dhcp
Tero Marttila <terom@paivola.fi>
parents: 733
diff changeset
    62
@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: 733
diff changeset
    63
class HostDHCP(pvl.hosts.host.HostExtension):
5149c39f3dfc pvl.hosts: improve HostExtension support enough to move boot= into pvl.hosts.dhcp
Tero Marttila <terom@paivola.fi>
parents: 733
diff changeset
    64
    EXTENSION = 'dhcp'
5149c39f3dfc pvl.hosts: improve HostExtension support enough to move boot= into pvl.hosts.dhcp
Tero Marttila <terom@paivola.fi>
parents: 733
diff changeset
    65
    EXTENSION_FIELDS = (
5149c39f3dfc pvl.hosts: improve HostExtension support enough to move boot= into pvl.hosts.dhcp
Tero Marttila <terom@paivola.fi>
parents: 733
diff changeset
    66
            'boot',
5149c39f3dfc pvl.hosts: improve HostExtension support enough to move boot= into pvl.hosts.dhcp
Tero Marttila <terom@paivola.fi>
parents: 733
diff changeset
    67
    )
5149c39f3dfc pvl.hosts: improve HostExtension support enough to move boot= into pvl.hosts.dhcp
Tero Marttila <terom@paivola.fi>
parents: 733
diff changeset
    68
5149c39f3dfc pvl.hosts: improve HostExtension support enough to move boot= into pvl.hosts.dhcp
Tero Marttila <terom@paivola.fi>
parents: 733
diff changeset
    69
    @classmethod
5149c39f3dfc pvl.hosts: improve HostExtension support enough to move boot= into pvl.hosts.dhcp
Tero Marttila <terom@paivola.fi>
parents: 733
diff changeset
    70
    def build (cls,
5149c39f3dfc pvl.hosts: improve HostExtension support enough to move boot= into pvl.hosts.dhcp
Tero Marttila <terom@paivola.fi>
parents: 733
diff changeset
    71
            boot        = None,
5149c39f3dfc pvl.hosts: improve HostExtension support enough to move boot= into pvl.hosts.dhcp
Tero Marttila <terom@paivola.fi>
parents: 733
diff changeset
    72
            subclass    = None,
5149c39f3dfc pvl.hosts: improve HostExtension support enough to move boot= into pvl.hosts.dhcp
Tero Marttila <terom@paivola.fi>
parents: 733
diff changeset
    73
    ):
5149c39f3dfc pvl.hosts: improve HostExtension support enough to move boot= into pvl.hosts.dhcp
Tero Marttila <terom@paivola.fi>
parents: 733
diff changeset
    74
        next_server, filename = parse_dhcp_boot(boot)
5149c39f3dfc pvl.hosts: improve HostExtension support enough to move boot= into pvl.hosts.dhcp
Tero Marttila <terom@paivola.fi>
parents: 733
diff changeset
    75
5149c39f3dfc pvl.hosts: improve HostExtension support enough to move boot= into pvl.hosts.dhcp
Tero Marttila <terom@paivola.fi>
parents: 733
diff changeset
    76
        return cls(
5149c39f3dfc pvl.hosts: improve HostExtension support enough to move boot= into pvl.hosts.dhcp
Tero Marttila <terom@paivola.fi>
parents: 733
diff changeset
    77
                filename    = filename,
5149c39f3dfc pvl.hosts: improve HostExtension support enough to move boot= into pvl.hosts.dhcp
Tero Marttila <terom@paivola.fi>
parents: 733
diff changeset
    78
                subclass    = subclass,
5149c39f3dfc pvl.hosts: improve HostExtension support enough to move boot= into pvl.hosts.dhcp
Tero Marttila <terom@paivola.fi>
parents: 733
diff changeset
    79
                next_server = next_server,
5149c39f3dfc pvl.hosts: improve HostExtension support enough to move boot= into pvl.hosts.dhcp
Tero Marttila <terom@paivola.fi>
parents: 733
diff changeset
    80
        )
5149c39f3dfc pvl.hosts: improve HostExtension support enough to move boot= into pvl.hosts.dhcp
Tero Marttila <terom@paivola.fi>
parents: 733
diff changeset
    81
5149c39f3dfc pvl.hosts: improve HostExtension support enough to move boot= into pvl.hosts.dhcp
Tero Marttila <terom@paivola.fi>
parents: 733
diff changeset
    82
    def __init__(self,
5149c39f3dfc pvl.hosts: improve HostExtension support enough to move boot= into pvl.hosts.dhcp
Tero Marttila <terom@paivola.fi>
parents: 733
diff changeset
    83
            filename    = None,
5149c39f3dfc pvl.hosts: improve HostExtension support enough to move boot= into pvl.hosts.dhcp
Tero Marttila <terom@paivola.fi>
parents: 733
diff changeset
    84
            next_server = None,
5149c39f3dfc pvl.hosts: improve HostExtension support enough to move boot= into pvl.hosts.dhcp
Tero Marttila <terom@paivola.fi>
parents: 733
diff changeset
    85
            subclass    = None,
5149c39f3dfc pvl.hosts: improve HostExtension support enough to move boot= into pvl.hosts.dhcp
Tero Marttila <terom@paivola.fi>
parents: 733
diff changeset
    86
    ):
5149c39f3dfc pvl.hosts: improve HostExtension support enough to move boot= into pvl.hosts.dhcp
Tero Marttila <terom@paivola.fi>
parents: 733
diff changeset
    87
        self.filename = filename
5149c39f3dfc pvl.hosts: improve HostExtension support enough to move boot= into pvl.hosts.dhcp
Tero Marttila <terom@paivola.fi>
parents: 733
diff changeset
    88
        self.next_server = next_server
5149c39f3dfc pvl.hosts: improve HostExtension support enough to move boot= into pvl.hosts.dhcp
Tero Marttila <terom@paivola.fi>
parents: 733
diff changeset
    89
        self.subclass = subclass
5149c39f3dfc pvl.hosts: improve HostExtension support enough to move boot= into pvl.hosts.dhcp
Tero Marttila <terom@paivola.fi>
parents: 733
diff changeset
    90
698
656178fb8607 pvl.hosts.dhcp: implement support for dhcp:subclass=... using hardware ethernet
Tero Marttila <tero.marttila@aalto.fi>
parents: 697
diff changeset
    91
def dhcp_host_subclass (host, subclass, ethernet):
656178fb8607 pvl.hosts.dhcp: implement support for dhcp:subclass=... using hardware ethernet
Tero Marttila <tero.marttila@aalto.fi>
parents: 697
diff changeset
    92
    """
656178fb8607 pvl.hosts.dhcp: implement support for dhcp:subclass=... using hardware ethernet
Tero Marttila <tero.marttila@aalto.fi>
parents: 697
diff changeset
    93
        Build a DHCP Item for declaring a subclass for a host.
656178fb8607 pvl.hosts.dhcp: implement support for dhcp:subclass=... using hardware ethernet
Tero Marttila <tero.marttila@aalto.fi>
parents: 697
diff changeset
    94
    """
656178fb8607 pvl.hosts.dhcp: implement support for dhcp:subclass=... using hardware ethernet
Tero Marttila <tero.marttila@aalto.fi>
parents: 697
diff changeset
    95
    
656178fb8607 pvl.hosts.dhcp: implement support for dhcp:subclass=... using hardware ethernet
Tero Marttila <tero.marttila@aalto.fi>
parents: 697
diff changeset
    96
    # hardware-type prefixed hardware-address
700
88b0d3df1ad7 pvl.hosts.dhcp: subclass class name is a String
Tero Marttila <tero.marttila@aalto.fi>
parents: 698
diff changeset
    97
    hardware = '1:' + ethernet
698
656178fb8607 pvl.hosts.dhcp: implement support for dhcp:subclass=... using hardware ethernet
Tero Marttila <tero.marttila@aalto.fi>
parents: 697
diff changeset
    98
656178fb8607 pvl.hosts.dhcp: implement support for dhcp:subclass=... using hardware ethernet
Tero Marttila <tero.marttila@aalto.fi>
parents: 697
diff changeset
    99
    return pvl.dhcp.config.Block(None, [
700
88b0d3df1ad7 pvl.hosts.dhcp: subclass class name is a String
Tero Marttila <tero.marttila@aalto.fi>
parents: 698
diff changeset
   100
        ('subclass', pvl.dhcp.config.String(subclass), pvl.dhcp.config.Field(hardware)),
698
656178fb8607 pvl.hosts.dhcp: implement support for dhcp:subclass=... using hardware ethernet
Tero Marttila <tero.marttila@aalto.fi>
parents: 697
diff changeset
   101
    ])
656178fb8607 pvl.hosts.dhcp: implement support for dhcp:subclass=... using hardware ethernet
Tero Marttila <tero.marttila@aalto.fi>
parents: 697
diff changeset
   102
479
1e68e3a30b51 pvl.hosts.dhcp: split out of script, refactor using pvl.dhcp.config, and test
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
   103
class HostDHCPError(pvl.hosts.host.HostError):
1e68e3a30b51 pvl.hosts.dhcp: split out of script, refactor using pvl.dhcp.config, and test
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
   104
    pass
1e68e3a30b51 pvl.hosts.dhcp: split out of script, refactor using pvl.dhcp.config, and test
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
   105
739
5149c39f3dfc pvl.hosts: improve HostExtension support enough to move boot= into pvl.hosts.dhcp
Tero Marttila <terom@paivola.fi>
parents: 733
diff changeset
   106
def dhcp_host_options (host, ethernet, dhcp=None):
479
1e68e3a30b51 pvl.hosts.dhcp: split out of script, refactor using pvl.dhcp.config, and test
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
   107
    """
669
83e9bff09a0b pvl.hosts.dhcp: update for pvl.dhcp.config
Tero Marttila <terom@paivola.fi>
parents: 491
diff changeset
   108
        Yield specific dhcp.conf host { ... } items.
479
1e68e3a30b51 pvl.hosts.dhcp: split out of script, refactor using pvl.dhcp.config, and test
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
   109
    """
1e68e3a30b51 pvl.hosts.dhcp: split out of script, refactor using pvl.dhcp.config, and test
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
   110
1e68e3a30b51 pvl.hosts.dhcp: split out of script, refactor using pvl.dhcp.config, and test
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
   111
    yield 'option', 'host-name', host.name
697
3c3ac207ce3f pvl.hosts.dhcp: use pvl.dhcp.config.Field() to format non-string field values
Tero Marttila <tero.marttila@aalto.fi>
parents: 689
diff changeset
   112
    yield 'hardware', 'ethernet', pvl.dhcp.config.Field(ethernet)
479
1e68e3a30b51 pvl.hosts.dhcp: split out of script, refactor using pvl.dhcp.config, and test
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
   113
733
45bedeba92e5 pvl.hosts: rename Host.ip -> Host.ip4; support instanced ip.foo = ... for foo.host A .... sub-labels
Tero Marttila <terom@paivola.fi>
parents: 731
diff changeset
   114
    if host.ip4:
45bedeba92e5 pvl.hosts: rename Host.ip -> Host.ip4; support instanced ip.foo = ... for foo.host A .... sub-labels
Tero Marttila <terom@paivola.fi>
parents: 731
diff changeset
   115
        yield 'fixed-address', pvl.dhcp.config.Field(str(host.ip4))
739
5149c39f3dfc pvl.hosts: improve HostExtension support enough to move boot= into pvl.hosts.dhcp
Tero Marttila <terom@paivola.fi>
parents: 733
diff changeset
   116
    
5149c39f3dfc pvl.hosts: improve HostExtension support enough to move boot= into pvl.hosts.dhcp
Tero Marttila <terom@paivola.fi>
parents: 733
diff changeset
   117
    if dhcp:
5149c39f3dfc pvl.hosts: improve HostExtension support enough to move boot= into pvl.hosts.dhcp
Tero Marttila <terom@paivola.fi>
parents: 733
diff changeset
   118
        if dhcp.next_server:
5149c39f3dfc pvl.hosts: improve HostExtension support enough to move boot= into pvl.hosts.dhcp
Tero Marttila <terom@paivola.fi>
parents: 733
diff changeset
   119
            yield 'next-server', dhcp.next_server
479
1e68e3a30b51 pvl.hosts.dhcp: split out of script, refactor using pvl.dhcp.config, and test
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
   120
739
5149c39f3dfc pvl.hosts: improve HostExtension support enough to move boot= into pvl.hosts.dhcp
Tero Marttila <terom@paivola.fi>
parents: 733
diff changeset
   121
        if dhcp.filename:
5149c39f3dfc pvl.hosts: improve HostExtension support enough to move boot= into pvl.hosts.dhcp
Tero Marttila <terom@paivola.fi>
parents: 733
diff changeset
   122
            yield 'filename', dhcp.filename
5149c39f3dfc pvl.hosts: improve HostExtension support enough to move boot= into pvl.hosts.dhcp
Tero Marttila <terom@paivola.fi>
parents: 733
diff changeset
   123
5149c39f3dfc pvl.hosts: improve HostExtension support enough to move boot= into pvl.hosts.dhcp
Tero Marttila <terom@paivola.fi>
parents: 733
diff changeset
   124
def dhcp_host (host):
479
1e68e3a30b51 pvl.hosts.dhcp: split out of script, refactor using pvl.dhcp.config, and test
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
   125
    """
739
5149c39f3dfc pvl.hosts: improve HostExtension support enough to move boot= into pvl.hosts.dhcp
Tero Marttila <terom@paivola.fi>
parents: 733
diff changeset
   126
        Yield pvl.dhcp.config.Block's for given Host, with possible HostDHCP extensions.
479
1e68e3a30b51 pvl.hosts.dhcp: split out of script, refactor using pvl.dhcp.config, and test
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
   127
    """
1e68e3a30b51 pvl.hosts.dhcp: split out of script, refactor using pvl.dhcp.config, and test
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
   128
731
5e2c1b78047d pvl.hosts.dhcp: fix mixed ethernet instance/None naming to be per-dhcp-host
Tero Marttila <terom@paivola.fi>
parents: 708
diff changeset
   129
    if not host.ethernet:
479
1e68e3a30b51 pvl.hosts.dhcp: split out of script, refactor using pvl.dhcp.config, and test
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
   130
        # nothing to be seen here
1e68e3a30b51 pvl.hosts.dhcp: split out of script, refactor using pvl.dhcp.config, and test
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
   131
        return
1e68e3a30b51 pvl.hosts.dhcp: split out of script, refactor using pvl.dhcp.config, and test
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
   132
 
1e68e3a30b51 pvl.hosts.dhcp: split out of script, refactor using pvl.dhcp.config, and test
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
   133
    if host.owner :
1e68e3a30b51 pvl.hosts.dhcp: split out of script, refactor using pvl.dhcp.config, and test
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
   134
        comment = u"Owner: {host.owner}".format(host=host)
1e68e3a30b51 pvl.hosts.dhcp: split out of script, refactor using pvl.dhcp.config, and test
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
   135
    else:
1e68e3a30b51 pvl.hosts.dhcp: split out of script, refactor using pvl.dhcp.config, and test
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
   136
        comment = None
739
5149c39f3dfc pvl.hosts: improve HostExtension support enough to move boot= into pvl.hosts.dhcp
Tero Marttila <terom@paivola.fi>
parents: 733
diff changeset
   137
    
5149c39f3dfc pvl.hosts: improve HostExtension support enough to move boot= into pvl.hosts.dhcp
Tero Marttila <terom@paivola.fi>
parents: 733
diff changeset
   138
    dhcp = host.extensions.get('dhcp')
479
1e68e3a30b51 pvl.hosts.dhcp: split out of script, refactor using pvl.dhcp.config, and test
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
   139
1e68e3a30b51 pvl.hosts.dhcp: split out of script, refactor using pvl.dhcp.config, and test
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
   140
    for index, ethernet in host.ethernet.iteritems() :
731
5e2c1b78047d pvl.hosts.dhcp: fix mixed ethernet instance/None naming to be per-dhcp-host
Tero Marttila <terom@paivola.fi>
parents: 708
diff changeset
   141
        if index:
5e2c1b78047d pvl.hosts.dhcp: fix mixed ethernet instance/None naming to be per-dhcp-host
Tero Marttila <terom@paivola.fi>
parents: 708
diff changeset
   142
            name = '{host.name}-{index}'.format(host=host, index=index)
5e2c1b78047d pvl.hosts.dhcp: fix mixed ethernet instance/None naming to be per-dhcp-host
Tero Marttila <terom@paivola.fi>
parents: 708
diff changeset
   143
        else:
5e2c1b78047d pvl.hosts.dhcp: fix mixed ethernet instance/None naming to be per-dhcp-host
Tero Marttila <terom@paivola.fi>
parents: 708
diff changeset
   144
            name = '{host.name}'.format(host=host)
5e2c1b78047d pvl.hosts.dhcp: fix mixed ethernet instance/None naming to be per-dhcp-host
Tero Marttila <terom@paivola.fi>
parents: 708
diff changeset
   145
739
5149c39f3dfc pvl.hosts: improve HostExtension support enough to move boot= into pvl.hosts.dhcp
Tero Marttila <terom@paivola.fi>
parents: 733
diff changeset
   146
        items = list(dhcp_host_options(host, ethernet, dhcp=dhcp))
479
1e68e3a30b51 pvl.hosts.dhcp: split out of script, refactor using pvl.dhcp.config, and test
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
   147
698
656178fb8607 pvl.hosts.dhcp: implement support for dhcp:subclass=... using hardware ethernet
Tero Marttila <tero.marttila@aalto.fi>
parents: 697
diff changeset
   148
        yield pvl.dhcp.config.Block(('host', name), items, comment=comment)
656178fb8607 pvl.hosts.dhcp: implement support for dhcp:subclass=... using hardware ethernet
Tero Marttila <tero.marttila@aalto.fi>
parents: 697
diff changeset
   149
739
5149c39f3dfc pvl.hosts: improve HostExtension support enough to move boot= into pvl.hosts.dhcp
Tero Marttila <terom@paivola.fi>
parents: 733
diff changeset
   150
        if dhcp and dhcp.subclass:
5149c39f3dfc pvl.hosts: improve HostExtension support enough to move boot= into pvl.hosts.dhcp
Tero Marttila <terom@paivola.fi>
parents: 733
diff changeset
   151
            yield dhcp_host_subclass(host, dhcp.subclass, ethernet)
479
1e68e3a30b51 pvl.hosts.dhcp: split out of script, refactor using pvl.dhcp.config, and test
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
   152
    
483
19d084bb4afd pvl.hosts.dhcp: test and document hosts on multiple networks
Tero Marttila <tero.marttila@aalto.fi>
parents: 479
diff changeset
   153
def dhcp_hosts (hosts):
479
1e68e3a30b51 pvl.hosts.dhcp: split out of script, refactor using pvl.dhcp.config, and test
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
   154
    """
1e68e3a30b51 pvl.hosts.dhcp: split out of script, refactor using pvl.dhcp.config, and test
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
   155
1e68e3a30b51 pvl.hosts.dhcp: split out of script, refactor using pvl.dhcp.config, and test
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
   156
        Verifies that there are no dupliate hosts.
1e68e3a30b51 pvl.hosts.dhcp: split out of script, refactor using pvl.dhcp.config, and test
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
   157
    """
1e68e3a30b51 pvl.hosts.dhcp: split out of script, refactor using pvl.dhcp.config, and test
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
   158
1e68e3a30b51 pvl.hosts.dhcp: split out of script, refactor using pvl.dhcp.config, and test
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
   159
    blocks = { }
1e68e3a30b51 pvl.hosts.dhcp: split out of script, refactor using pvl.dhcp.config, and test
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
   160
1e68e3a30b51 pvl.hosts.dhcp: split out of script, refactor using pvl.dhcp.config, and test
Tero Marttila <tero.marttila@aalto.fi>
parents:
diff changeset
   161
    for host in hosts:
739
5149c39f3dfc pvl.hosts: improve HostExtension support enough to move boot= into pvl.hosts.dhcp
Tero Marttila <terom@paivola.fi>
parents: 733
diff changeset
   162
        for block in dhcp_host(host):
708
fd6f0f044f42 pvl.hosts.dhcp: only check host blocks for uniqueness; ignore subclasses
Tero Marttila <tero.marttila@aalto.fi>
parents: 700
diff changeset
   163
            if not block.key:
fd6f0f044f42 pvl.hosts.dhcp: only check host blocks for uniqueness; ignore subclasses
Tero Marttila <tero.marttila@aalto.fi>
parents: 700
diff changeset
   164
                # TODO: check for unique Item-Blocks
fd6f0f044f42 pvl.hosts.dhcp: only check host blocks for uniqueness; ignore subclasses
Tero Marttila <tero.marttila@aalto.fi>
parents: 700
diff changeset
   165
                pass
fd6f0f044f42 pvl.hosts.dhcp: only check host blocks for uniqueness; ignore subclasses
Tero Marttila <tero.marttila@aalto.fi>
parents: 700
diff changeset
   166
            elif block.key in blocks:
669
83e9bff09a0b pvl.hosts.dhcp: update for pvl.dhcp.config
Tero Marttila <terom@paivola.fi>
parents: 491
diff changeset
   167
                raise HostDHCPError(host, "dhcp {block} conflict with {other}; hosts on multiple networks must use unique ethernet.XXX=... naming".format(block=block, other=blocks[block.key]))
708
fd6f0f044f42 pvl.hosts.dhcp: only check host blocks for uniqueness; ignore subclasses
Tero Marttila <tero.marttila@aalto.fi>
parents: 700
diff changeset
   168
            else:
fd6f0f044f42 pvl.hosts.dhcp: only check host blocks for uniqueness; ignore subclasses
Tero Marttila <tero.marttila@aalto.fi>
parents: 700
diff changeset
   169
                blocks[block.key] = host
483
19d084bb4afd pvl.hosts.dhcp: test and document hosts on multiple networks
Tero Marttila <tero.marttila@aalto.fi>
parents: 479
diff changeset
   170
669
83e9bff09a0b pvl.hosts.dhcp: update for pvl.dhcp.config
Tero Marttila <terom@paivola.fi>
parents: 491
diff changeset
   171
            yield block