Re: [PATCH] virtinst - virt-convert vmware output

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

 



Made those few cleanups


Cole Robinson wrote:
Joey Boggs wrote:
Got it all figured out now, its set to raise an exception rather than fail()

Also changed the bus to ide rather than scsi.



This looks mostly ready, just a few small pieces.

diff -r 58a909b4f71c virt-convert
--- a/virt-convert	Mon Sep 22 11:32:11 2008 -0400
+++ b/virt-convert	Mon Sep 29 17:22:59 2008 -0400
@@ -217,6 +217,8 @@
                 not format and vmcfg.host() == "SunOS"):
                 format = "vdisk"
+ elif options.output_format == "vmx":
+                format = "vmdk"
             if not format:
                 format = "raw"
diff -r 58a909b4f71c virtconv/diskcfg.py
--- a/virtconv/diskcfg.py	Mon Sep 22 11:32:11 2008 -0400
+++ b/virtconv/diskcfg.py	Mon Sep 29 17:22:59 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 58a909b4f71c virtconv/parsers/virtimage.py
--- a/virtconv/parsers/virtimage.py	Mon Sep 22 11:32:11 2008 -0400
+++ b/virtconv/parsers/virtimage.py	Mon Sep 29 17:22:59 2008 -0400
@@ -21,10 +21,12 @@
 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 as ImageParser
 from xml.sax.saxutils import escape
 from string import ascii_letters
+import os
 import re
pv_boot_template = """
@@ -183,16 +185,20 @@
     """
     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.
         """
-        raise NotImplementedError
+        try:
+            image = ImageParser.parse_file(input_file)
+        except ImageParser.ParserException, msg:
+            return False

Please log the failure here.

+        return True
@staticmethod
     def import_file(input_file):
@@ -200,7 +206,52 @@
         Import a configuration file.  Raises if the file couldn't be
         opened, or parsing otherwise failed.
         """
-        raise NotImplementedError
+        vm = vmcfg.vm()
+        try:
+            config  = ImageParser.parse_file(input_file)
+ except Exception, e: + raise Exception("Couldn't import file \"%s\": %s" % (input_file, e))
+

I'd say raise a ValueError here instead of a plain
Exception. Also, just use single quotes instead of
escaping the double quotes, it's simpler.

+        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 = "ide"
+        nr_disks = 0
+        devid = (bus, nr_disks)

This line is redundant.

+
+        for d in boot.drives:
+            disk = d.disk
+            format = None
+            if disk.format == ImageParser.Disk.FORMAT_RAW:
+                format = diskcfg.DISK_FORMAT_RAW
+            elif format == ImageParser.DISK_FORMAT_VMDK:
+                format == diskcfg.DISK_FORMAT_VMDK
+
+            if format is None:
+                raise ValueError("Unable to determine disk format")
+            devid = (bus, nr_disks)

You can do away with nr_disks here if you just use
len(vm.disks)

+            vm.disks[devid] = diskcfg.disk(bus = bus,
+                type = diskcfg.DISK_TYPE_DISK)
+            vm.disks[devid].format = format
+            vm.disks[devid].path = disk.file
+            nr_disks = nr_disks + 1
+ + nics = domain.interface
+        nr_nics = 0
+        while nr_nics < nics:
+            vm.netdevs[nr_nics] = netdevcfg.netdev(type = netdevcfg.NETDEV_TYPE_UNKNOWN)
+            nr_nics = nr_nics + 1

I'd say ditch nr_nics and just use

while nic_idx in range(0, nics):
  vm.netdevs[nic_idx] ...

+            """  Eventually need to add support for mac addresses if given"""
+        vm.validate()
+        return vm
@staticmethod
     def export_file(vm, output_file):
diff -r 58a909b4f71c virtconv/parsers/vmx.py
--- a/virtconv/parsers/vmx.py	Mon Sep 22 11:32:11 2008 -0400
+++ b/virtconv/parsers/vmx.py	Mon Sep 29 17:22:59 2008 -0400
@@ -22,9 +22,62 @@
 import virtconv.vmcfg as vmcfg
 import virtconv.diskcfg as diskcfg
 import virtconv.netdevcfg as netdevcfg
-
+import time
+import sys
 import re
 import os
+
+_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 and can be used with Player
+config.version = "8"
+virtualHW.version = "4"
+guestOS = "other"
+displayName = "%(vm_name)s"
+annotation = "%(vm_description)s"
+guestinfo.vmware.product.long = "%(vm_name)s"
+guestinfo.vmware.product.url = "http://virt-manager.et.redhat.com/";
+guestinfo.vmware.product.class = "virtual machine"
+numvcpus = "%(vm_nr_vcpus)s"
+memsize = "%(vm_memory)d"
+MemAllowAutoScaleDown = "FALSE"
+MemTrimRate = "-1"
+uuid.action = "create"
+tools.remindInstall = "TRUE"
+hints.hideAll = "TRUE"
+tools.syncTime = "TRUE"
+serial0.present = "FALSE"
+serial1.present = "FALSE"
+parallel0.present = "FALSE"
+logging = "TRUE"
+log.fileName = "%(vm_name)s.log"
+log.append = "TRUE"
+log.keepOld = "3"
+isolation.tools.hgfs.disable = "FALSE"
+isolation.tools.dnd.disable = "FALSE"
+isolation.tools.copy.enable = "TRUE"
+isolation.tools.paste.enabled = "TRUE"
+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"
+"""
def parse_netdev_entry(vm, fullkey, value):
     """
@@ -72,7 +125,7 @@
     # like this?
     if bus == "ide":
         inst = int(inst) + int(bus_nr) * 2
-
+

This is just adding trailing space.

     devid = (bus, inst)
     if not vm.disks.get(devid):
         vm.disks[devid] = diskcfg.disk(bus = bus,
@@ -100,7 +153,7 @@
     name = "vmx"
     suffix = ".vmx"
     can_import = True
-    can_export = False
+    can_export = True
     can_identify = True
@staticmethod
@@ -160,7 +213,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 is None
                 or disk.path.lower() == "auto detect" or
@@ -188,7 +241,46 @@
         Raises ValueError if configuration is not suitable, or another
         exception on failure to write the output file.
         """
+        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]),
+            "vm_name": vm.name,
+            "vm_description": vm.description or "None",
+            "vm_nr_vcpus" : vm.nr_vcpus,
+            "vm_memory": long(vm.memory)/1024
+        }
+        vmx_out = _VMX_MAIN_TEMPLATE % vmx_dict
+        vmx_out_template.append(vmx_out)
- raise NotImplementedError
+        disk_out_template = []
+        diskcount = 0
+        for disk in vm.disks:
+            ide_count = 0
+            dev = "%d:%d" % (ide_count / 2, ide_count % 2)

IDE count doesn't seem to be incremented here,

+            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

Diskcount isn't used.

+
+        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)

Thanks,
Cole

diff -r abc2cae7cff5 virt-convert
--- a/virt-convert	Tue Sep 30 12:52:00 2008 -0400
+++ b/virt-convert	Fri Oct 03 13:06:39 2008 -0400
@@ -50,8 +50,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'"))
     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",
@@ -91,6 +90,8 @@
         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 defined"))
     if options.output_format not in formats.formats():
         opts.error(("Unknown output format \"%s\"" % options.output_format))
     if options.output_format not in formats.output_formats():
@@ -217,6 +218,8 @@
                 not format and vmcfg.host() == "SunOS"):
                 format = "vdisk"
 
+            elif options.output_format == "vmx":
+                format = "vmdk"
             if not format:
                 format = "raw"
 
diff -r abc2cae7cff5 virtconv/diskcfg.py
--- a/virtconv/diskcfg.py	Tue Sep 30 12:52:00 2008 -0400
+++ b/virtconv/diskcfg.py	Fri Oct 03 13:06:39 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 abc2cae7cff5 virtconv/parsers/virtimage.py
--- a/virtconv/parsers/virtimage.py	Tue Sep 30 12:52:00 2008 -0400
+++ b/virtconv/parsers/virtimage.py	Fri Oct 03 13:06:39 2008 -0400
@@ -21,10 +21,12 @@
 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 as ImageParser
 from xml.sax.saxutils import escape
 from string import ascii_letters
+import os
 import re
 
 pv_boot_template = """
@@ -183,16 +185,20 @@
     """
     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.
         """
-        raise NotImplementedError
+        try:
+            image = ImageParser.parse_file(input_file)
+        except ImageParser.ParserException, msg:
+            return False
+        return True
 
     @staticmethod
     def import_file(input_file):
@@ -200,7 +206,51 @@
         Import a configuration file.  Raises if the file couldn't be
         opened, or parsing otherwise failed.
         """
-        raise NotImplementedError
+        vm = vmcfg.vm()
+        try:
+            config  = ImageParser.parse_file(input_file)
+        except Exception, e:        
+            raise ValueError("Couldn't import file '%s': %s" % (input_file, e))
+
+        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 = "ide"
+        nr_disk = 0
+
+        for d in boot.drives:
+            disk = d.disk
+            format = None
+            if disk.format == ImageParser.Disk.FORMAT_RAW:
+                format = diskcfg.DISK_FORMAT_RAW
+            elif format == ImageParser.DISK_FORMAT_VMDK:
+                format == diskcfg.DISK_FORMAT_VMDK
+
+            if format is None:
+                raise ValueError("Unable to determine disk format")
+            devid = (bus, nr_disk)
+            vm.disks[devid] = diskcfg.disk(bus = bus,
+                type = diskcfg.DISK_TYPE_DISK)
+            vm.disks[devid].format = format
+            vm.disks[devid].path = disk.file
+            nr_disk = nr_disk + 1
+           
+        nics = domain.interface
+        nic_idx = 0
+        while nic_idx in range(0, nics):
+            vm.netdevs[nic_idx] = netdevcfg.netdev(type = netdevcfg.NETDEV_TYPE_UNKNOWN)
+            nic_idx = nic_idx + 1
+            """  Eventually need to add support for mac addresses if given"""
+        vm.validate()
+        return vm
 
     @staticmethod
     def export_file(vm, output_file):
diff -r abc2cae7cff5 virtconv/parsers/vmx.py
--- a/virtconv/parsers/vmx.py	Tue Sep 30 12:52:00 2008 -0400
+++ b/virtconv/parsers/vmx.py	Fri Oct 03 13:06:39 2008 -0400
@@ -22,9 +22,62 @@
 import virtconv.vmcfg as vmcfg
 import virtconv.diskcfg as diskcfg
 import virtconv.netdevcfg as netdevcfg
-
+import time
+import sys
 import re
 import os
+
+_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 and can be used with Player
+config.version = "8"
+virtualHW.version = "4"
+guestOS = "other"
+displayName = "%(vm_name)s"
+annotation = "%(vm_description)s"
+guestinfo.vmware.product.long = "%(vm_name)s"
+guestinfo.vmware.product.url = "http://virt-manager.et.redhat.com/";
+guestinfo.vmware.product.class = "virtual machine"
+numvcpus = "%(vm_nr_vcpus)s"
+memsize = "%(vm_memory)d"
+MemAllowAutoScaleDown = "FALSE"
+MemTrimRate = "-1"
+uuid.action = "create"
+tools.remindInstall = "TRUE"
+hints.hideAll = "TRUE"
+tools.syncTime = "TRUE"
+serial0.present = "FALSE"
+serial1.present = "FALSE"
+parallel0.present = "FALSE"
+logging = "TRUE"
+log.fileName = "%(vm_name)s.log"
+log.append = "TRUE"
+log.keepOld = "3"
+isolation.tools.hgfs.disable = "FALSE"
+isolation.tools.dnd.disable = "FALSE"
+isolation.tools.copy.enable = "TRUE"
+isolation.tools.paste.enabled = "TRUE"
+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"
+"""
 
 def parse_netdev_entry(vm, fullkey, value):
     """
@@ -100,7 +153,7 @@
     name = "vmx"
     suffix = ".vmx"
     can_import = True
-    can_export = False
+    can_export = True
     can_identify = True
 
     @staticmethod
@@ -160,7 +213,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 is None
                 or disk.path.lower() == "auto detect" or
@@ -188,7 +241,45 @@
         Raises ValueError if configuration is not suitable, or another
         exception on failure to write the output file.
         """
+        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]),
+            "vm_name": vm.name,
+            "vm_description": vm.description or "None",
+            "vm_nr_vcpus" : vm.nr_vcpus,
+            "vm_memory": long(vm.memory)/1024
+        }
+        vmx_out = _VMX_MAIN_TEMPLATE % vmx_dict
+        vmx_out_template.append(vmx_out)
 
-        raise NotImplementedError
+        disk_out_template = []
+        ide_count = 0
+        for disk in vm.disks:
+            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)
+            ide_count = ide_count + 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)
_______________________________________________
et-mgmt-tools mailing list
et-mgmt-tools@xxxxxxxxxx
https://www.redhat.com/mailman/listinfo/et-mgmt-tools

[Index of Archives]     [Fedora Users]     [Fedora Legacy List]     [Fedora Maintainers]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [KDE Users]     [Fedora Tools]

  Powered by Linux