[et-mgmt-tools] [PATCH 08 of 11] virt-convert: implement network device handling
john.levon at sun.com
john.levon at sun.com
Thu Jul 10 13:48:38 UTC 2008
# HG changeset patch
# User john.levon at sun.com
# Date 1215697571 25200
# Node ID 72eec78868efe7a872eab6c08502b3b84bf00a46
# Parent 8ffd21ddf5c72ddbe8a30f65f0761e2f39705d57
virt-convert: implement network device handling
Signed-off-by: John Levon <john.levon at sun.com>
diff --git a/virtconv/netdevcfg.py b/virtconv/netdevcfg.py
new file mode 100644
--- /dev/null
+++ b/virtconv/netdevcfg.py
@@ -0,0 +1,39 @@
+#
+# Copyright 2008 Sun Microsystems, Inc. All rights reserved.
+# Use is subject to license terms.
+#
+# 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
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+# MA 02110-1301 USA.
+#
+
+NETDEV_TYPE_UNKNOWN = 0
+NETDEV_TYPE_BRIDGE = 1
+NETDEV_TYPE_DEV = 2
+NETDEV_TYPE_NETWORK = 3
+
+class netdev(object):
+ """Definition of an individual network device."""
+
+ def __init__(self, mac = "auto", type = NETDEV_TYPE_UNKNOWN,
+ source = None, driver = None):
+ """@mac: either a MAC address, or "auto"
+ @type: NETDEV_TYPE_*
+ @source: bridge or net device, or network name
+ @driver: device emulated for VM (e.g. vmxnet)
+ """
+ self.mac = mac
+ self.type = type
+ self.source = source
+ self.driver = driver
diff --git a/virtconv/parsers/virtimage.py b/virtconv/parsers/virtimage.py
--- a/virtconv/parsers/virtimage.py
+++ b/virtconv/parsers/virtimage.py
@@ -65,8 +65,8 @@
<devices>
<vcpu>%(nr_vcpus)s</vcpu>
<memory>%(memory)s</memory>
- <interface/>
- <graphics/>
+ %(interface)s
+ <graphics />
</devices>
</domain>
<storage>
@@ -185,6 +185,11 @@
# xend wants the name to match r'^[A-Za-z0-9_\-\.\:\/\+]+$'
vmname = re.sub(r'[^A-Za-z0-9_.:/+-]+', '_', vm.name)
+ # Hmm. Any interface is a good interface?
+ interface = None
+ if len(vm.netdevs):
+ interface = "<interface />"
+
if vm.type == vmcfg.VM_TYPE_PV:
boot_template = pv_boot_template
else:
@@ -204,6 +209,7 @@
"nr_vcpus" : vm.nr_vcpus,
# Mb to Kb
"memory" : int(vm.memory) * 1024,
+ "interface" : interface,
"storage" : "".join(storage),
}
diff --git a/virtconv/parsers/vmx.py b/virtconv/parsers/vmx.py
--- a/virtconv/parsers/vmx.py
+++ b/virtconv/parsers/vmx.py
@@ -21,9 +21,34 @@
import virtconv.formats as formats
import virtconv.vmcfg as vmcfg
import virtconv.diskcfg as diskcfg
+import virtconv.netdevcfg as netdevcfg
import re
import os
+
+def parse_netdev_entry(vm, fullkey, value):
+ """
+ Parse a particular key/value for a network. Throws ValueError.
+ """
+
+ _, _, inst, key = re.split("^(ethernet)([0-9]+).", fullkey)
+
+ lvalue = value.lower()
+
+ if key == "present" and lvalue == "false":
+ return
+
+ if not vm.netdevs.get(inst):
+ vm.netdevs[inst] = netdevcfg.netdev(type = netdevcfg.NETDEV_TYPE_UNKNOWN)
+
+ # "vlance", "vmxnet", "e1000"
+ if key == "virtualDev":
+ vm.netdevs[inst].driver = lvalue
+ if key == "addressType" and lvalue == "generated":
+ vm.netdevs[inst].mac = "auto"
+ # we ignore .generatedAddress for auto mode
+ if key == "address":
+ vm.netdevs[inst].mac = lvalue
def parse_disk_entry(vm, fullkey, value):
"""
@@ -126,6 +151,8 @@
if key.startswith("scsi") or key.startswith("ide"):
parse_disk_entry(vm, key, value)
+ if key.startswith("ethernet"):
+ parse_netdev_entry(vm, key, value)
except:
raise Exception("Syntax error at line %d: %s" %
(line_nr + 1, line.strip()))
diff --git a/virtconv/vmcfg.py b/virtconv/vmcfg.py
--- a/virtconv/vmcfg.py
+++ b/virtconv/vmcfg.py
@@ -52,6 +52,7 @@
self.memory = None
self.nr_vcpus = None
self.disks = {}
+ self.netdevs = {}
self.type = VM_TYPE_HVM
self.arch = "i686"
More information about the et-mgmt-tools
mailing list