[et-mgmt-tools] [PATCH] virtinst - virt-convert vmware output
Joey Boggs
jboggs at redhat.com
Fri Oct 3 17:08:35 UTC 2008
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
>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: virt-convert-vmware-conversion-module-10-3-1306.patch
Type: text/x-patch
Size: 9167 bytes
Desc: not available
URL: <http://listman.redhat.com/archives/et-mgmt-tools/attachments/20081003/10f42109/attachment.bin>
More information about the et-mgmt-tools
mailing list