2007-03-21 19:28:36 +03:00
#
# Copyright (C) 2006 Red Hat, Inc.
# Copyright (C) 2006 Daniel P. Berrange <berrange@redhat.com>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
2007-11-20 19:12:20 +03:00
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
# MA 02110-1301 USA.
2007-03-21 19:28:36 +03:00
#
2011-04-11 01:08:23 +04:00
from virtManager import util
2013-03-29 22:38:28 +04:00
import ipaddr
import libxml2
2010-12-09 20:37:48 +03:00
from virtManager . libvirtobject import vmmLibvirtObject
2007-03-21 19:28:36 +03:00
2010-12-09 20:37:48 +03:00
class vmmNetwork ( vmmLibvirtObject ) :
2009-12-01 19:49:08 +03:00
@staticmethod
def pretty_desc ( forward , forwardDev ) :
if forward or forwardDev :
if not forward or forward == " nat " :
if forwardDev :
desc = _ ( " NAT to %s " ) % forwardDev
else :
desc = _ ( " NAT " )
elif forward == " route " :
if forwardDev :
desc = _ ( " Route to %s " ) % forwardDev
else :
desc = _ ( " Routed network " )
2009-12-15 19:14:22 +03:00
else :
if forwardDev :
desc = " %s to %s " % ( forward , forwardDev )
else :
desc = " %s network " % forward . capitalize ( )
2009-12-01 19:49:08 +03:00
else :
2013-03-29 22:38:28 +04:00
desc = _ ( " Isolated network, internal and host routing only " )
2009-12-01 19:49:08 +03:00
return desc
2011-07-23 00:43:26 +04:00
def __init__ ( self , conn , net , uuid , active ) :
vmmLibvirtObject . __init__ ( self , conn )
2007-03-21 19:28:36 +03:00
self . net = net
self . uuid = uuid
2007-04-03 22:01:45 +04:00
self . active = active
2010-12-09 20:37:48 +03:00
# Required class methods
def get_name ( self ) :
return self . net . name ( )
def _XMLDesc ( self , flags ) :
return self . net . XMLDesc ( flags )
def _define ( self , xml ) :
2011-07-23 00:43:26 +04:00
return self . conn . vmm . networkDefineXML ( xml )
2010-12-09 20:37:48 +03:00
2007-04-03 22:01:45 +04:00
def set_active ( self , state ) :
self . active = state
2007-03-21 19:28:36 +03:00
def is_active ( self ) :
2007-04-03 22:01:45 +04:00
return self . active
2007-03-21 19:28:36 +03:00
def get_label ( self ) :
return self . get_name ( )
def get_uuid ( self ) :
return self . uuid
2007-03-28 03:52:00 +04:00
def get_bridge_device ( self ) :
2009-11-16 15:14:49 +03:00
try :
return self . net . bridgeName ( )
except :
return " "
2007-03-28 03:52:00 +04:00
2007-03-30 05:23:17 +04:00
def start ( self ) :
self . net . create ( )
2007-04-03 22:01:45 +04:00
def stop ( self ) :
self . net . destroy ( )
def delete ( self ) :
self . net . undefine ( )
2008-08-15 20:44:45 +04:00
del ( self . net )
2007-04-03 22:01:45 +04:00
self . net = None
2007-03-30 05:23:17 +04:00
def set_autostart ( self , value ) :
self . net . setAutostart ( value )
2007-03-30 23:02:09 +04:00
def get_autostart ( self ) :
return self . net . autostart ( )
2007-04-03 22:01:45 +04:00
def get_ipv4_network ( self ) :
2013-03-29 22:38:28 +04:00
doc = None
ret = None
goodNode = None
dhcpstart = None
dhcpend = None
routeAddr = None
routeVia = None
2008-08-15 20:44:45 +04:00
xml = self . get_xml ( )
2013-03-29 22:38:28 +04:00
doc = libxml2 . parseDoc ( xml )
nodes = doc . xpathEval ( ' //ip ' )
for node in nodes :
family = node . xpathEval ( ' string(./@family) ' )
if not family or family == ' ipv4 ' :
dhcp = node . xpathEval ( ' string(./dhcp) ' )
if dhcp :
dhcpstart = node . xpathEval ( ' string(./dhcp/range[1]/@start) ' )
dhcpend = node . xpathEval ( ' string(./dhcp/range[1]/@end) ' )
goodNode = node
break
for node in nodes :
family = node . xpathEval ( ' string(./@family) ' )
if not family or family == ' ipv4 ' :
routeVia = node . xpathEval ( ' string(./@via) ' )
if routeVia :
routeAddr = node . xpathEval ( ' string(./@address) ' )
2013-04-12 16:26:21 +04:00
break
2013-03-29 22:38:28 +04:00
if goodNode == None :
for node in nodes :
family = node . xpathEval ( ' string(./@family) ' )
if not family or family == ' ipv4 ' :
tmp = node . xpathEval ( ' string(./@via) ' )
if tmp :
continue
2013-04-12 16:26:21 +04:00
goodNode = node
2013-03-29 22:38:28 +04:00
break
if goodNode :
addrStr = goodNode . xpathEval ( ' string(./@address) ' )
netmaskStr = goodNode . xpathEval ( ' string(./@netmask) ' )
prefix = goodNode . xpathEval ( ' string(./@prefix) ' )
if prefix :
prefix = int ( prefix )
ret = str ( ipaddr . IPNetwork ( str ( addrStr ) + " / " + str ( prefix ) ) . masked ( ) )
elif netmaskStr :
netmask = ipaddr . IPAddress ( netmaskStr )
network = ipaddr . IPAddress ( addrStr )
ret = str ( ipaddr . IPNetwork ( str ( network ) + " / " + str ( netmask ) ) . masked ( ) )
else :
ret = str ( ipaddr . IPNetwork ( str ( addrStr ) ) )
if doc :
doc . freeDoc ( )
if dhcpstart and dhcpend :
dhcp = [ str ( ipaddr . IPAddress ( dhcpstart ) ) , str ( ipaddr . IPAddress ( dhcpend ) ) ]
else :
dhcp = None
if routeAddr and routeVia :
route = [ str ( ipaddr . IPAddress ( routeAddr ) ) , str ( ipaddr . IPAddress ( routeVia ) ) ]
else :
route = None
return [ ret , dhcp , route ]
def get_ipv6_network ( self ) :
doc = None
ret = None
goodNode = None
dhcpstart = None
dhcpend = None
routeAddr = None
routeVia = None
xml = self . get_xml ( )
doc = libxml2 . parseDoc ( xml )
nodes = doc . xpathEval ( ' //ip ' )
for node in nodes :
family = node . xpathEval ( ' string(./@family) ' )
if family and family == ' ipv6 ' :
dhcp = node . xpathEval ( ' string(./dhcp) ' )
if dhcp :
dhcpstart = node . xpathEval ( ' string(./dhcp/range[1]/@start) ' )
dhcpend = node . xpathEval ( ' string(./dhcp/range[1]/@end) ' )
goodNode = node
break
for node in nodes :
family = node . xpathEval ( ' string(./@family) ' )
if family and family == ' ipv6 ' :
routeVia = node . xpathEval ( ' string(./@via) ' )
if routeVia :
routeAddr = node . xpathEval ( ' string(./@address) ' )
2013-04-12 16:26:21 +04:00
break
2013-03-29 22:38:28 +04:00
if goodNode == None :
for node in nodes :
family = node . xpathEval ( ' string(./@family) ' )
if family and family == ' ipv6 ' :
tmp = node . xpathEval ( ' string(./@via) ' )
if tmp :
continue
2013-04-12 16:26:21 +04:00
goodNode = node
2013-03-29 22:38:28 +04:00
break
if goodNode :
addrStr = goodNode . xpathEval ( ' string(./@address) ' )
prefix = goodNode . xpathEval ( ' string(./@prefix) ' )
if prefix :
prefix = int ( prefix )
ret = str ( ipaddr . IPNetwork ( str ( addrStr ) + " / " + str ( prefix ) ) . masked ( ) )
else :
ret = str ( ipaddr . IPNetwork ( str ( addrStr ) ) )
if doc :
doc . freeDoc ( )
if dhcpstart and dhcpend :
dhcp = [ str ( ipaddr . IPAddress ( dhcpstart ) ) , str ( ipaddr . IPAddress ( dhcpend ) ) ]
else :
dhcp = None
if routeAddr and routeVia :
route = [ str ( ipaddr . IPAddress ( routeAddr ) ) , str ( ipaddr . IPAddress ( routeVia ) ) ]
2012-12-17 23:48:42 +04:00
else :
2013-03-29 22:38:28 +04:00
route = None
return [ ret , dhcp , route ]
2007-04-03 22:01:45 +04:00
2013-03-29 22:38:28 +04:00
def get_name_domain ( self ) :
xml = self . get_xml ( )
name_domain = util . xpath ( xml , " /network/domain/@name " )
return name_domain
def get_ipv6_route ( self ) :
xml = self . get_xml ( )
ipv6_route = util . xpath ( xml , " /network/@ipv6 " )
return ipv6_route
2007-04-03 22:01:45 +04:00
def get_ipv4_forward ( self ) :
2008-08-15 20:44:45 +04:00
xml = self . get_xml ( )
2011-04-11 01:08:23 +04:00
fw = util . xpath ( xml , " /network/forward/@mode " )
forwardDev = util . xpath ( xml , " /network/forward/@dev " )
2009-11-16 15:14:49 +03:00
return [ fw , forwardDev ]
2007-03-28 03:52:00 +04:00
2009-11-16 15:14:49 +03:00
def pretty_forward_mode ( self ) :
forward , forwardDev = self . get_ipv4_forward ( )
2009-12-01 19:49:08 +03:00
return vmmNetwork . pretty_desc ( forward , forwardDev )
2009-11-16 15:14:49 +03:00
2010-12-04 20:28:44 +03:00
def can_pxe ( self ) :
xml = self . get_xml ( )
2010-12-07 05:38:05 +03:00
forward = self . get_ipv4_forward ( ) [ 0 ]
if forward and forward != " nat " :
return True
2011-04-11 01:08:23 +04:00
return bool ( util . xpath ( xml , " /network/ip/dhcp/bootp/@file " ) )