[et-mgmt-tools] [PATCH] Resend of multiple nic patch
bkearney at redhat.com
bkearney at redhat.com
Tue Aug 5 12:15:42 UTC 2008
# HG changeset patch
# User bkearney at localhost.localdomain
# Date 1217876425 14400
# Node ID 3507f83147d566fb690dc9b87c0dbb35cd9e6f4c
# Parent 6a207373b908ab521d33cd675c7c8d3854bdc1f1
multiple nic support for virt-image. Added support to allow multiple
interface elements in the virt-image.xml. The command line can specify
any number of -w or -b elements and the tool will add default networks
up to the number of nics specified. It is assumbed that eth0 is the first
item specified.
diff -r 6a207373b908 -r 3507f83147d5 doc/image.rng
--- a/doc/image.rng Tue Jul 29 11:21:07 2008 -0400
+++ b/doc/image.rng Mon Aug 04 15:00:25 2008 -0400
@@ -47,8 +47,10 @@
<element name="vcpu"><ref name="countCPU"/></element>
<!-- Size of memory (in kB) -->
<element name="memory"><ref name="memoryKB"/></element>
- <!-- Whether the VM should have a network interface -->
- <element name="interface"><empty/></element>
+ <!--The number of network interfaces which should exist -->
+ <zeroOrMore>
+ <element name="interface"><empty/></element>
+ </zeroOrMore>
<!-- Whether the VM has a graphical interface -->
<element name="graphics"><empty/></element>
</element>
diff -r 6a207373b908 -r 3507f83147d5 tests/image.py
--- a/tests/image.py Tue Jul 29 11:21:07 2008 -0400
+++ b/tests/image.py Mon Aug 04 15:00:25 2008 -0400
@@ -31,7 +31,16 @@
self.assertTrue(img.domain)
self.assertEqual(5, len(img.storage))
self.assertEqual(2, len(img.domain.boots))
+ self.assertEqual(1, img.domain.interface)
boot = img.domain.boots[0]
self.assertEqual("xvdb", boot.drives[1].target)
+
+ def testMultipleNics(self):
+ file = open(os.path.join("tests", "image2nics.xml"), "r")
+ xml = file.read()
+ file.close()
+
+ img = virtinst.ImageParser.parse(xml, ".")
+ self.assertEqual(2, img.domain.interface)
if __name__ == "__main__":
unittest.main()
diff -r 6a207373b908 -r 3507f83147d5 tests/image.xml
--- a/tests/image.xml Tue Jul 29 11:21:07 2008 -0400
+++ b/tests/image.xml Mon Aug 04 15:00:25 2008 -0400
@@ -28,10 +28,12 @@
<drive disk="data.raw" target="hdb"/>
<drive disk="scratch.raw" target="hdd"/>
</boot>
- <vcpu>7</vcpu>
- <memory>262144</memory>
- <interface/>
- <graphics/>
+ <devices>
+ <vcpu>7</vcpu>
+ <memory>262144</memory>
+ <interface/>
+ <graphics/>
+ </devices>
</domain>
<storage>
<disk file="disk.img"/>
diff -r 6a207373b908 -r 3507f83147d5 tests/image2nics.xml
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/image2nics.xml Mon Aug 04 15:00:25 2008 -0400
@@ -0,0 +1,49 @@
+<image>
+ <name>test-image</name>
+ <label>A simple test image</label>
+ <domain>
+ <boot type='xen'>
+ <guest>
+ <os_type>xen</os_type>
+ <arch>i386</arch>
+ <features><pae/></features>
+ </guest>
+ <os>
+ <loader>pygrub</loader>
+ </os>
+ <drive disk="root.raw" target="xvda"/>
+ <drive disk="data.raw" target="xvdb"/>
+ <drive disk="scratch.raw" target="xvdc"/>
+ </boot>
+ <boot type="hvm">
+ <guest>
+ <arch>i686</arch>
+ <features><pae/></features>
+ </guest>
+ <os>
+ <type>hvm</type>
+ <loader dev="hd"/>
+ </os>
+ <drive disk="root.raw" target="hda"/>
+ <drive disk="data.raw" target="hdb"/>
+ <drive disk="scratch.raw" target="hdd"/>
+ </boot>
+ <devices>
+ <vcpu>7</vcpu>
+ <memory>262144</memory>
+ <interface/>
+ <interface/>
+ <graphics/>
+ </devices>
+ </domain>
+ <storage>
+ <disk file="disk.img"/>
+ <disk size="4096" use="system">
+ <partition file="boot.img"/>
+ <partition file="root.img"/>
+ </disk>
+ <disk file="root.raw" format="raw" size="4096" use="system"/>
+ <disk file="data.raw" format="raw" size='2048' use="data"/>
+ <disk file="scratch.raw" format="raw" size='100' use='scratch'/>
+ </storage>
+</image>
diff -r 6a207373b908 -r 3507f83147d5 virt-image
--- a/virt-image Tue Jul 29 11:21:07 2008 -0400
+++ b/virt-image Mon Aug 04 15:00:25 2008 -0400
@@ -59,17 +59,14 @@
cli.get_vcpus(vcpus, check_cpu, guest, conn)
def get_networks(domain, macs, bridges, networks, guest):
- (macs, networks) = cli.digest_networks(macs, bridges, networks)
-
- nnics = 0
- if domain.interface:
- nnics = 1
+ nnics = domain.interface
+ (macs, networks) = cli.digest_networks(macs, bridges, networks, nnics)
if nnics == 0 and len(networks) > 0:
print >> sys.stderr, _("Warning: image does not support networking, ignoring network related options")
return
- elif nnics == 1 and len(networks) == 0:
- fail(_("The image needs one network interface"))
+ elif nnics > len(networks) :
+ fail(_("The image requires %i network interface") % nnics)
map(lambda m, n: cli.get_network(m, n, guest), macs, networks)
diff -r 6a207373b908 -r 3507f83147d5 virtinst/ImageParser.py
--- a/virtinst/ImageParser.py Tue Jul 29 11:21:07 2008 -0400
+++ b/virtinst/ImageParser.py Mon Aug 04 15:00:25 2008 -0400
@@ -90,7 +90,7 @@
self.boots = []
self.vcpu = None
self.memory = None
- self.interface = None
+ self.interface = 0
self.graphics = None
if not node is None:
self.parseXML(node)
@@ -99,7 +99,7 @@
self.boots = [ Boot(b) for b in node.xpathEval("boot") ]
self.vcpu = xpathString(node, "devices/vcpu", 1)
self.memory = xpathString(node, "devices/memory")
- self.interface = node.xpathEval("count(devices/interface)") > 0
+ self.interface = int(node.xpathEval("count(devices/interface)"))
self.graphics = node.xpathEval("count(devices/graphics)") > 0
# FIXME: There must be a better way to check this
diff -r 6a207373b908 -r 3507f83147d5 virtinst/UnWare.py
--- a/virtinst/UnWare.py Tue Jul 29 11:21:07 2008 -0400
+++ b/virtinst/UnWare.py Mon Aug 04 15:00:25 2008 -0400
@@ -143,7 +143,9 @@
self.label = image.label
self.vcpu = domain.vcpu
self.memory = domain.memory
- self.interface = domain.interface
+ # Make this a boolean based on the existence of one or more
+ # interfaces in the domain
+ self.interface = domain.interface > 0
self.disks = []
for d in boot.drives:
diff -r 6a207373b908 -r 3507f83147d5 virtinst/cli.py
--- a/virtinst/cli.py Tue Jul 29 11:21:07 2008 -0400
+++ b/virtinst/cli.py Mon Aug 04 15:00:25 2008 -0400
@@ -262,41 +262,41 @@
fail(_("Unknown network type ") + network)
guest.nics.append(n)
-def digest_networks(macs, bridges, networks):
+def digest_networks(macs, bridges, networks, nics = 1):
if type(bridges) != list and bridges != None:
bridges = [ bridges ]
if type(macs) != list and macs != None:
macs = [ macs ]
+ elif macs is None:
+ macs = []
if type(networks) != list and networks != None:
networks = [ networks ]
+ elif networks is None:
+ networks = []
if bridges is not None and networks != None:
fail(_("Cannot mix both --bridge and --network arguments"))
- # ensure we have equal length lists
+
if bridges != None:
networks = map(lambda b: "bridge:" + b, bridges)
-
- if networks != None:
- if macs != None:
- if len(macs) != len(networks):
- fail(_("Need to pass equal numbers of networks & mac addresses"))
- else:
- macs = [ None ] * len(networks)
- else:
- if os.getuid() == 0:
- net = util.default_network()
- networks = [net[0] + ":" + net[1]]
- else:
- networks = ["user"]
- if macs != None:
- if len(macs) > 1:
- fail(_("Need to pass equal numbers of networks & mac addresses"))
- else:
- macs = [ None ]
-
+
+ # ensure we have equal length lists
+ if len(macs) != len(networks):
+ fail(_("Need to pass equal numbers of networks & mac addresses"))
+
+ # Create extra networks up to the number of nics requested
+ if len(macs) < nics:
+ for cnt in range(len(macs),nics):
+ if os.getuid() == 0:
+ net = util.default_network()
+ networks.append(net[0] + ":" + net[1])
+ else:
+ networks.append("user")
+ macs.append(None)
+
return (macs, networks)
def get_graphics(vnc, vncport, nographics, sdl, keymap, guest):
More information about the et-mgmt-tools
mailing list