createnet: Use virtinst.Network for XML generation

This commit is contained in:
Cole Robinson 2013-09-23 13:21:35 -04:00
parent b889659d93
commit 85813203dc
3 changed files with 91 additions and 80 deletions

View File

@ -1040,8 +1040,12 @@ class XMLParseTest(unittest.TestCase):
check("family", "ipv6", "ipv6")
check("prefix", 64, 63)
net.add_route("192.168.8.0", "24", "192.168.8.10")
check = self._make_checker(net.routes[0])
r = net.add_route()
r.family = "ipv4"
r.address = "192.168.8.0"
r.prefix = "24"
r.gateway = "192.168.8.10"
check = self._make_checker(r)
check("netmask", None, "foo", None)
utils.diff_compare(net.get_xml_config(), outfile)

View File

@ -28,7 +28,10 @@ from gi.repository import Gtk
from gi.repository import Gdk
# pylint: enable=E0611
from virtinst import Network
from virtManager import uihelpers
from virtManager.asyncjob import vmmAsyncJob
from virtManager.baseclass import vmmGObjectUI
(PAGE_NAME,
@ -505,7 +508,7 @@ class vmmCreateNetwork(vmmGObjectUI):
uihelpers.set_grid_row_visible(ntwk, enabled)
uihelpers.set_grid_row_visible(gway, enabled)
def change_routev6_enable(self, ignore):
enabled = self.get_config_routev4_enable()
enabled = self.get_config_routev6_enable()
ntwk = self.widget("net-routev6-network")
gway = self.widget("net-routev6-gateway")
uihelpers.set_grid_row_visible(ntwk, enabled)
@ -518,7 +521,7 @@ class vmmCreateNetwork(vmmGObjectUI):
uihelpers.set_grid_row_visible(start, enabled)
uihelpers.set_grid_row_visible(end, enabled)
def change_dhcpv6_enable(self, ignore):
enabled = self.get_config_dhcpv4_enable()
enabled = self.get_config_dhcpv6_enable()
start = self.widget("net-dhcpv6-start")
end = self.widget("net-dhcpv6-end")
uihelpers.set_grid_row_visible(start, enabled)
@ -674,99 +677,97 @@ class vmmCreateNetwork(vmmGObjectUI):
# XML build and install #
#########################
def _build_xml(self):
name = self.widget("net-name").get_text()
dev, mode = self.get_config_forwarding()
def _build_xmlobj(self):
net = Network(self.conn.get_backend())
net.name = self.widget("net-name").get_text()
net.domain_name = self.widget("net-domain-name").get_text() or None
if self.widget("net-enable-ipv6-networking").get_active():
xml = "<network ipv6='yes'>\n"
else:
xml = "<network>\n"
xml += " <name>%s</name>\n" % name
domain_name = self.widget("net-domain-name").get_text()
if domain_name:
xml += " <domain name='%s' />\n" % domain_name
net.ipv6 = True
dev, mode = self.get_config_forwarding()
if mode:
if dev is not None:
xml += " <forward mode='%s' dev='%s'/>\n" % (mode, dev)
else:
xml += " <forward mode='%s'/>\n" % mode
net.forward.mode = mode
net.forward.dev = dev or None
if self.get_config_ipv4_enable():
ip = self.get_config_ip4()
xml += " <ip address='%s' netmask='%s'>\n" % (str(ip.network + 1),
str(ip.netmask))
ipobj = net.add_ip()
ipobj.address = str(ip.network + 1)
ipobj.netmask = str(ip.netmask)
if self.get_config_dhcpv4_enable():
start = self.get_config_dhcpv4_start()
end = self.get_config_dhcpv4_end()
xml += " <dhcp>\n"
xml += " <range start='%s' end='%s'/>\n" % (str(start.network),
str(end.network))
xml += " </dhcp>\n"
xml += " </ip>\n"
dhcpobj = ipobj.add_range()
dhcpobj.start = str(self.get_config_dhcpv4_start().network)
dhcpobj.end = str(self.get_config_dhcpv4_end().network)
if self.get_config_ipv6_enable():
ip = self.get_config_ip6()
xml += " <ip family='ipv6' address='%s' prefix='%s'>\n" % (str(ip.network + 1),
str(ip.prefixlen))
ipobj = net.add_ip()
ipobj.family = "ipv6"
ipobj.address = str(ip.network + 1)
ipobj.prefix = str(ip.prefixlen)
if self.get_config_dhcpv6_enable():
start = self.get_config_dhcpv6_start()
end = self.get_config_dhcpv6_end()
xml += " <dhcp>\n"
xml += " <range start='%s' end='%s'/>\n" % (str(start.network),
str(end.network))
xml += " </dhcp>\n"
xml += " </ip>\n"
dhcpobj = ipobj.add_range()
dhcpobj.start = str(self.get_config_dhcpv6_start().network)
dhcpobj.end = str(self.get_config_dhcpv6_end().network)
ntwk = self.get_config_routev4_network()
try:
netaddr = ipaddr.IPNetwork(ntwk)
except:
netaddr = None
gway = self.get_config_routev4_gateway()
try:
gwaddr = ipaddr.IPNetwork(gway)
except:
gwaddr = None
netaddr = _make_ipaddr(self.get_config_routev4_network())
gwaddr = _make_ipaddr(self.get_config_routev4_gateway())
if netaddr and gwaddr:
xml += "<route family='ipv4'"
xml += " address='%s'" % netaddr.network
xml += " prefix='%s'" % netaddr.prefixlen
xml += " gateway='%s' />" % gwaddr.network
route = net.add_route()
route.family = "ipv4"
route.address = netaddr.network
route.prefix = netaddr.prefixlen
route.gateway = gwaddr.network
ntwk = self.get_config_routev6_network()
try:
netaddr = ipaddr.IPNetwork(ntwk)
except:
netaddr = None
gway = self.get_config_routev6_gateway()
try:
gwaddr = ipaddr.IPNetwork(gway)
except:
gwaddr = None
netaddr = _make_ipaddr(self.get_config_routev6_network())
gwaddr = _make_ipaddr(self.get_config_routev6_gateway())
if netaddr and gwaddr:
xml += "<route family='ipv6'"
xml += " address='%s'" % netaddr.network
xml += " prefix='%s'" % netaddr.prefixlen
xml += " gateway='%s' />" % gwaddr.network
route = net.add_route()
route.family = "ipv6"
route.address = netaddr.network
route.prefix = netaddr.prefixlen
route.gateway = gwaddr.network
xml += "</network>\n"
return xml
return net
def _finish_cb(self, error, details):
self.topwin.set_sensitive(True)
self.topwin.get_window().set_cursor(
Gdk.Cursor.new(Gdk.CursorType.TOP_LEFT_ARROW))
if error:
error = _("Error creating virtual network: %s") % str(error)
self.err.show_err(error, details=details)
else:
self.conn.schedule_priority_tick(pollnet=True)
self.close()
def _async_net_create(self, asyncjob, xml):
ignore = asyncjob
self.conn.create_network(xml)
def finish(self, ignore):
xml = self._build_xml()
logging.debug("Generated network XML:\n" + xml)
try:
self.conn.create_network(xml)
net = self._build_xmlobj()
xml = net.get_xml_config()
except Exception, e:
self.err.show_err(_("Error creating virtual network: %s" % str(e)))
self.err.show_erro(_("Error generating network xml: %s" % str(e)))
return
self.conn.schedule_priority_tick(pollnet=True)
self.close()
logging.debug("Generated network XML:\n" + xml)
self.topwin.set_sensitive(False)
self.topwin.get_window().set_cursor(
Gdk.Cursor.new(Gdk.CursorType.WATCH))
progWin = vmmAsyncJob(self._async_net_create, [xml],
self._finish_cb, [],
_("Creating virtual network..."),
_("Creating the virtual network may take a "
"while..."),
self.topwin)
progWin.run()

View File

@ -54,6 +54,11 @@ class _NetworkIP(XMLBuilder):
ranges = XMLChildProperty(_NetworkDHCPRange, relative_xpath="./dhcp")
hosts = XMLChildProperty(_NetworkDHCPHost, relative_xpath="./dhcp")
def add_range(self):
r = _NetworkDHCPRange(self.conn)
self._add_child(r)
return r
class _NetworkRoute(XMLBuilder):
_XML_ROOT_NAME = "route"
@ -166,10 +171,11 @@ class Network(XMLBuilder):
ips = XMLChildProperty(_NetworkIP)
routes = XMLChildProperty(_NetworkRoute)
def add_route(self, address, prefix, gateway):
def add_ip(self):
ip = _NetworkIP(self.conn)
self._add_child(ip)
return ip
def add_route(self):
route = _NetworkRoute(self.conn)
route.family = "ipv4"
route.address = address
route.prefix = prefix
route.gateway = gateway
self._add_child(route)
return route