[et-mgmt-tools] [PATCH] multiple nic support for virt-image. Added support to allow multiple

bkearney at redhat.com bkearney at redhat.com
Mon Aug 4 19:06:47 UTC 2008


# HG changeset patch
# User bkearney at localhost.localdomain
# Date 1217876425 14400
# Node ID b75270d46d5c71e582ca4e850716dace951badb5
# 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 b75270d46d5c 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 b75270d46d5c 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,13 @@
     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
+    (macs, networks) = cli.digest_networks(macs, bridges, networks, domain.interface)
 
     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 b75270d46d5c 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 = 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 b75270d46d5c 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 b75270d46d5c 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