1#
2# Copyright 2013 Red Hat, Inc.
3#
4# This work is licensed under the GNU GPLv2 or later.
5# See the COPYING file in the top-level directory.
6"""
7Classes for building and installing libvirt <network> XML
8"""
9
10from .xmlbuilder import XMLBuilder, XMLChildProperty, XMLProperty
11
12
13class _NetworkDHCPRange(XMLBuilder):
14    XML_NAME = "range"
15    start = XMLProperty("./@start")
16    end = XMLProperty("./@end")
17
18
19class _NetworkDHCPHost(XMLBuilder):
20    XML_NAME = "host"
21    macaddr = XMLProperty("./@mac")
22    name = XMLProperty("./@name")
23    ip = XMLProperty("./@ip")
24
25
26class _NetworkIP(XMLBuilder):
27    XML_NAME = "ip"
28
29    family = XMLProperty("./@family")
30    address = XMLProperty("./@address")
31    prefix = XMLProperty("./@prefix", is_int=True)
32    netmask = XMLProperty("./@netmask")
33
34    tftp = XMLProperty("./tftp/@root")
35    bootp_file = XMLProperty("./dhcp/bootp/@file")
36    bootp_server = XMLProperty("./dhcp/bootp/@server")
37
38    ranges = XMLChildProperty(_NetworkDHCPRange, relative_xpath="./dhcp")
39    hosts = XMLChildProperty(_NetworkDHCPHost, relative_xpath="./dhcp")
40
41
42class _NetworkRoute(XMLBuilder):
43    XML_NAME = "route"
44
45    family = XMLProperty("./@family")
46    address = XMLProperty("./@address")
47    prefix = XMLProperty("./@prefix", is_int=True)
48    gateway = XMLProperty("./@gateway")
49    netmask = XMLProperty("./@netmask")
50
51
52class _NetworkForwardPf(XMLBuilder):
53    XML_NAME = "pf"
54    dev = XMLProperty("./@dev")
55
56
57class _NetworkForward(XMLBuilder):
58    XML_NAME = "forward"
59
60    mode = XMLProperty("./@mode")
61    dev = XMLProperty("./@dev")
62    managed = XMLProperty("./@managed")
63    pf = XMLChildProperty(_NetworkForwardPf)
64
65
66class _NetworkPortgroup(XMLBuilder):
67    XML_NAME = "portgroup"
68
69    name = XMLProperty("./@name")
70    default = XMLProperty("./@default", is_yesno=True)
71
72
73class Network(XMLBuilder):
74    """
75    Top level class for <network> object XML
76    """
77    XML_NAME = "network"
78    _XML_PROP_ORDER = ["ipv6", "name", "uuid", "forward", "virtualport_type",
79                       "bridge", "stp", "delay", "domain_name",
80                       "macaddr", "ips", "routes"]
81
82    ipv6 = XMLProperty("./@ipv6", is_yesno=True)
83    name = XMLProperty("./name")
84    uuid = XMLProperty("./uuid")
85
86    virtualport_type = XMLProperty("./virtualport/@type")
87
88    # Not entirely correct, there can be multiple routes
89    forward = XMLChildProperty(_NetworkForward, is_single=True)
90
91    domain_name = XMLProperty("./domain/@name")
92
93    bridge = XMLProperty("./bridge/@name")
94    stp = XMLProperty("./bridge/@stp", is_onoff=True)
95    delay = XMLProperty("./bridge/@delay", is_int=True)
96    macaddr = XMLProperty("./mac/@address")
97
98    portgroups = XMLChildProperty(_NetworkPortgroup)
99    ips = XMLChildProperty(_NetworkIP)
100    routes = XMLChildProperty(_NetworkRoute)
101
102
103    ###################
104    # Helper routines #
105    ###################
106
107    def can_pxe(self):
108        forward = self.forward.mode
109        if forward and forward != "nat":
110            return True
111        for ip in self.ips:
112            if ip.bootp_file:
113                return True
114        return False
115