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