[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]

[et-mgmt-tools] [PATCH] virtinst - virt-convert vmware output



This will replace the virt-pack command and supplemental Unware.py file and integrate them into virt-convert directly as a module.

I'll create a patch to remove the deprecated files once tested by others.

Other notes, only supports raw disks, adding in qcow support should be fairly easy, just wanted to get this out the door first.



diff -r f87154697807 virt-convert
--- a/virt-convert	Thu Sep 18 16:44:30 2008 -0400
+++ b/virt-convert	Mon Sep 22 12:17:55 2008 -0400
@@ -49,8 +49,7 @@
     opts.add_option("-i", "--input-format", action="store",
                     dest="input_format", help=("Input format, e.g. 'vmx'"))
     opts.add_option("-o", "--output-format", action="store",
-                    dest="output_format", default="virt-image",
-                    help=("Output format, e.g. 'virt-image'"))
+                    dest="output_format", help=("Output format, e.g. 'virt-image / vmware'"))
     opts.add_option("-D", "--disk-format", action="store",
                     dest="disk_format", help=("Output disk format"))
     opts.add_option("-v", "--hvm", action="store_true", dest="fullvirt",
@@ -89,6 +88,10 @@
     else:
         options.output_file = args[1]
         options.output_dir = os.path.dirname(os.path.realpath(args[1]))
+
+    if not options.output_format:
+        opts.error("Output format must be specified")
+        sys.exit(1)
 
     if options.output_format not in formats.formats():
         opts.error(("Unknown output format \"%s\"" % options.output_format))
@@ -170,7 +173,6 @@
         logging.error("Couldn't import file \"%s\": %s" %
             (options.input_file, e))
         sys.exit(1)
-
     if options.paravirt:
         vmdef.type = vmcfg.VM_TYPE_PV
     else:
@@ -214,11 +216,13 @@
     try:
         for d in vmdef.disks.values():
             format = options.disk_format
-
             # VMDK disks on Solaris converted to vdisk by default
             if (d.format == diskcfg.DISK_FORMAT_VMDK and
                 not format and vmcfg.host() == "SunOS"):
                 format = "vdisk"
+
+            if options.output_format == "vmware":
+                format = "vmdk"
 
             if not format:
                 format = "raw"
diff -r f87154697807 virtconv/diskcfg.py
--- a/virtconv/diskcfg.py	Thu Sep 18 16:44:30 2008 -0400
+++ b/virtconv/diskcfg.py	Mon Sep 22 12:17:55 2008 -0400
@@ -181,7 +181,7 @@
         absout = os.path.join(outdir, relout)
 
         if not (out_format == DISK_FORMAT_VDISK or
-            out_format == DISK_FORMAT_RAW):
+            out_format == DISK_FORMAT_RAW or out_format == DISK_FORMAT_VMDK):
             raise NotImplementedError("Cannot convert to disk format %s" %
                 output_format)
 
diff -r f87154697807 virtconv/parsers/virtimage.py
--- a/virtconv/parsers/virtimage.py	Thu Sep 18 16:44:30 2008 -0400
+++ b/virtconv/parsers/virtimage.py	Mon Sep 22 12:17:55 2008 -0400
@@ -21,10 +21,13 @@
 import virtconv.formats as formats
 import virtconv.vmcfg as vmcfg
 import virtconv.diskcfg as diskcfg
+import virtconv.netdevcfg as netdevcfg
 import virtinst.FullVirtGuest as fv
-
+import virtinst.ImageParser
+from optparse import OptionParser, OptionValueError
 from xml.sax.saxutils import escape
 from string import ascii_letters
+import os
 import re
 
 pv_boot_template = """
@@ -183,16 +186,23 @@
     """
     name = "virt-image"
     suffix = ".virt-image.xml"
-    can_import = False
+    can_import = True
     can_export = True
-    can_identify = False
+    can_identify = True
 
     @staticmethod
     def identify_file(input_file):
         """
         Return True if the given file is of this format.
+        Not able to guarantee <image> is on the top line rather than a blankline
         """
-        raise NotImplementedError
+        infile = open(input_file, "r")
+        line = infile
+        for line in line.readlines():
+            if re.match(r'^<image>', line):
+                return True
+        infile.close()
+
 
     @staticmethod
     def import_file(input_file):
@@ -200,7 +210,44 @@
         Import a configuration file.  Raises if the file couldn't be
         opened, or parsing otherwise failed.
         """
-        raise NotImplementedError
+        vm = vmcfg.vm()
+        config  = virtinst.ImageParser.parse_file(input_file)
+        domain = config.domain
+        boot = domain.boots[0]
+
+        if not config.name:
+            raise ValueError("No Name defined in \"%s\"" % input_file)
+        vm.name = config.name
+        vm.memory = config.domain.memory
+        if config.descr:
+            vm.description = config.descr
+        vm.nr_vcpus = config.domain.vcpu
+
+        bus="scsi"
+        diskinst = 0
+        devid = (bus, diskinst)
+
+        for d in boot.drives:
+            disk = d.disk
+            if disk.format == "raw":
+                disk.format = diskcfg.DISK_FORMAT_RAW
+            else:
+                raise ValueError("%s is not a supported disk format" % disk.format)
+            
+            vm.disks[devid] = diskcfg.disk(bus = bus,
+                type = diskcfg.DISK_TYPE_DISK)
+            vm.disks[devid].format = disk.format
+            vm.disks[devid].path = disk.file
+            diskinst = diskinst + 1
+           
+        nics = domain.interface
+        nicinst = 0
+        while nicinst < nics:
+            vm.netdevs[nicinst] = netdevcfg.netdev(type = netdevcfg.NETDEV_TYPE_UNKNOWN)
+            nicinst = nicinst + 1
+            """  Eventually need to add support for mac addresses if given"""
+        vm.validate()
+        return vm
 
     @staticmethod
     def export_file(vm, output_file):
diff -r f87154697807 virtconv/parsers/vmx.py
--- a/virtconv/parsers/vmx.py	Thu Sep 18 16:44:30 2008 -0400
+++ b/virtconv/parsers/vmx.py	Mon Sep 22 12:17:55 2008 -0400
@@ -22,7 +22,8 @@
 import virtconv.vmcfg as vmcfg
 import virtconv.diskcfg as diskcfg
 import virtconv.netdevcfg as netdevcfg
-
+import time
+import sys
 import re
 import os
 
@@ -97,10 +98,10 @@
     resource being http://sanbarrow.com/vmx.html
     """
 
-    name = "vmx"
+    name = "vmware"
     suffix = ".vmx"
     can_import = True
-    can_export = False
+    can_export = True
     can_identify = True
 
     @staticmethod
@@ -160,7 +161,7 @@
         for devid, disk in vm.disks.iteritems():
             if disk.type == diskcfg.DISK_TYPE_DISK:
                 continue
-                
+
             # vmx files often have dross left in path for CD entries
             if (disk.path.lower() == "auto detect" or
                 not os.path.exists(disk.path)):
@@ -188,6 +189,142 @@
         exception on failure to write the output file.
         """
 
-        raise NotImplementedError
+        _VMX_MAIN_TEMPLATE = """#!/usr/bin/vmplayer
+
+# Generated %(now)s by %(progname)s
+# http://virt-manager.et.redhat.com/
+
+# This is a Workstation 5 or 5.5 config file
+# It can be used with Player
+config.version = "8"
+virtualHW.version = "4"
+
+# Selected operating system for your virtual machine
+guestOS = "other"
+
+# displayName is your own name for the virtual machine
+displayName = "%(/image/name)s"
+
+# These fields are free text description fields
+annotation = "%(/image/description)s"
+guestinfo.vmware.product.long = "%(/image/label)s"
+guestinfo.vmware.product.url = "http://virt-manager.et.redhat.com/";
+guestinfo.vmware.product.class = "virtual machine"
+
+# Number of virtual CPUs. Your virtual machine will not
+# work if this number is higher than the number of your physical CPUs
+numvcpus = "%(/image/devices/vcpu)s"
+
+# Memory size and other memory settings
+memsize = "%(/image/devices/memory)d"
+MemAllowAutoScaleDown = "FALSE"
+MemTrimRate = "-1"
+
+# Unique ID for the virtual machine will be created
+uuid.action = "create"
+
+## For appliances where tools are installed already, this should really
+## be false, but we don't have that ionfo in the metadata
+# Remind to install VMware Tools
+# This setting has no effect in VMware Player
+tools.remindInstall = "TRUE"
+
+# Startup hints interfers with automatic startup of a virtual machine
+# This setting has no effect in VMware Player
+hints.hideAll = "TRUE"
+
+# Enable time synchronization between computer
+# and virtual machine
+tools.syncTime = "TRUE"
+
+# First serial port, physical COM1 is not available
+serial0.present = "FALSE"
+
+# Optional second serial port, physical COM2 is not available
+serial1.present = "FALSE"
+
+# First parallell port, physical LPT1 is not available
+parallel0.present = "FALSE"
+
+# Logging
+# This config activates logging, and keeps last log
+logging = "TRUE"
+log.fileName = "%(/image/name)s.log"
+log.append = "TRUE"
+log.keepOld = "3"
+
+# These settings decides interaction between your
+# computer and the virtual machine
+isolation.tools.hgfs.disable = "FALSE"
+isolation.tools.dnd.disable = "FALSE"
+isolation.tools.copy.enable = "TRUE"
+isolation.tools.paste.enabled = "TRUE"
+
+# Settings for physical floppy drive
+floppy0.present = "FALSE"
+"""
+
+
+
+        _VMX_ETHERNET_TEMPLATE = """
+ethernet%(dev)s.present = "TRUE"
+ethernet%(dev)s.connectionType = "nat"
+ethernet%(dev)s.addressType = "generated"
+ethernet%(dev)s.generatedAddressOffset = "0"
+ethernet%(dev)s.autoDetect = "TRUE"
+"""
+
+        _VMX_IDE_TEMPLATE = """
+# IDE disk
+ide%(dev)s.present = "TRUE"
+ide%(dev)s.fileName = "%(disk_filename)s"
+ide%(dev)s.mode = "persistent"
+ide%(dev)s.startConnected = "TRUE"
+ide%(dev)s.writeThrough = "TRUE"
+"""
+        """ Cleanup spaces and multiple lines"""
+        vm.description = vm.description.strip()
+        vm.description = vm.description.replace("\n","|")
+        vmx_out_template = []
+        vmx_dict = {
+            "now": time.strftime("%Y-%m-%dT%H:%M:%S %Z", time.localtime()),
+            "progname": os.path.basename(sys.argv[0]),
+            "/image/name": vm.name,
+            "/image/description": vm.description or "None",
+            "/image/label": vm.name,
+            "/image/devices/vcpu" : vm.nr_vcpus,
+            "/image/devices/memory": long(vm.memory)/1024
+        }
+        vmx_out = _VMX_MAIN_TEMPLATE % vmx_dict
+        vmx_out_template.append(vmx_out)
+
+        disk_out_template = []
+        diskcount = 0
+        for disk in vm.disks:
+            ide_count = 0
+            dev = "%d:%d" % (ide_count / 2, ide_count % 2)
+            disk_dict = {
+                 "dev": dev,
+                 "disk_filename" : vm.disks[disk].path
+                  }
+            disk_out = _VMX_IDE_TEMPLATE % disk_dict
+            disk_out_template.append(disk_out)
+            diskcount = diskcount + 1
+
+        eth_out_template = []
+        if len(vm.netdevs):
+            for devnum in vm.netdevs:
+                eth_dict = {
+                    "dev" : devnum
+                     }
+                eth_out = _VMX_ETHERNET_TEMPLATE % eth_dict
+                eth_out_template.append(eth_out)
+
+        outfile = open(output_file, "w")
+        outfile.writelines(vmx_out_template)
+        outfile.writelines(disk_out_template)
+        outfile.writelines(eth_out_template)
+        outfile.close()
+
 
 formats.register_parser(vmx_parser)

[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]