# HG changeset patch # User john.levon@xxxxxxx # Date 1215470429 25200 # Node ID 4528daf7a40728f906e1843b8368198ce9d438c5 # Parent 6042ba3dce6a57dbe7ee547ae65be93dbef1b0a2 Allow output in libvirt.rng format Add "virt-instance" formatter. Signed-off-by: John Levon <john.levon@xxxxxxx> diff --git a/man/en/virt-convert.1 b/man/en/virt-convert.1 --- a/man/en/virt-convert.1 +++ b/man/en/virt-convert.1 @@ -174,7 +174,8 @@ Input format. Currently, \f(CW\*(C`vmx\* Input format. Currently, \f(CW\*(C`vmx\*(C'\fR is the only supported input format. .IP "\-o format" 4 .IX Item "-o format" -Output format. Currently, \f(CW\*(C`virt\-image\*(C'\fR is the only supported output format. +Output format. Currently, the only supported outputs are \f(CW\*(C`virt\-image\*(C'\fR +and \f(CW\*(C`virt\-instance\*(C'\fR. .IP "\-d, \-\-debug" 4 .IX Item "-d, --debug" Print debugging information diff --git a/man/en/virt-convert.pod b/man/en/virt-convert.pod --- a/man/en/virt-convert.pod +++ b/man/en/virt-convert.pod @@ -56,7 +56,8 @@ Input format. Currently, C<vmx> is the =item -o format -Output format. Currently, C<virt-image> is the only supported output format. +Output format. Currently, the only supported outputs are C<virt-image> +and C<virt-instance>. =item -d, --debug diff --git a/virt-convert b/virt-convert --- a/virt-convert +++ b/virt-convert @@ -1,9 +1,10 @@ #!/usr/bin/python -# -# Convert a VMware(tm) virtual machine into an XML image description # # Copyright 2008 Red Hat, Inc. # Joey Boggs <jboggs@xxxxxxxxxx> +# +# 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 @@ -19,6 +20,21 @@ # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, # MA 02110-1301 USA. + +# +# Convert between VM definition formats. TODO: +# +# support networking +# port virtinstance.py to Solaris +# better disk checking +# support CD-ROM +# add option for host selection +# --uuid, --os-type, --os-variant, and other virt-install options +# disk conversion should be optional +# use qemu-img info to verify the disk type +# add some unit tests +# input/output/detection for all formats +# import sys import os @@ -62,12 +78,18 @@ def parse_args(): if len(args) > 2: opts.error(("Too many arguments provided")) - # hard-code for now - if options.input_format != "vmx": - opts.error(("Unsupported input format \"%s\"" % options.input_format)) - if options.output_format != "virt-image": - opts.error(("Unsupported output format \"%s\"" + if options.input_format not in vmconfig.formats(): + opts.error(("Unknown input format \"%s\"" % options.input_format)) + if options.input_format not in vmconfig.input_formats(): + opts.error(("No input handler for format \"%s\"" + % options.input_format)) + + if options.output_format not in vmconfig.formats(): + opts.error(("Unknown output format \"%s\"" % options.output_format)) + if options.output_format not in vmconfig.output_formats(): + opts.error(("No output handler for format \"%s\"" % options.output_format)) + if os.path.isdir(args[0]): vmx_files = [x for x in os.listdir(args[0]) if x.endswith(".vmx") ] if (len(vmx_files)) == 0: diff --git a/virtconv/parsers/virtimage.py b/virtconv/parsers/virtimage.py --- a/virtconv/parsers/virtimage.py +++ b/virtconv/parsers/virtimage.py @@ -76,6 +76,8 @@ class virtimage_parser(vmconfig.parser): """ name = "virt-image" suffix = ".virt-image.xml" + can_import = False + can_export = True @staticmethod def identify_file(input_file): diff --git a/virtconv/parsers/virtinstance.py b/virtconv/parsers/virtinstance.py new file mode 100644 --- /dev/null +++ b/virtconv/parsers/virtinstance.py @@ -0,0 +1,174 @@ +# +# 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. +# + +from string import ascii_letters +import virtconv.vmconfig as vmconfig + +import re + +bootloaders = { + vmconfig.VM_TYPE_PV: "<bootloader>/usr/lib/xen/bin/pygrub</bootloader>", + vmconfig.VM_TYPE_HVM: "", +} + +bootdevs = { + vmconfig.VM_TYPE_PV: "", + vmconfig.VM_TYPE_HVM: "<boot dev='hd' />", +} + +loaders = { + vmconfig.VM_TYPE_PV: "", + vmconfig.VM_TYPE_HVM: "<loader>/usr/lib/xen/boot/hvmloader</loader>", +} + +emulators = { + vmconfig.VM_TYPE_PV: "", + vmconfig.VM_TYPE_HVM: "<emulator>/usr/lib/xen/bin/qemu-dm</emulator>", +} + +consoles = { + vmconfig.VM_TYPE_PV: "", + vmconfig.VM_TYPE_HVM: "<console type='pty' />", +} + +disk_template = """ +<disk type='block' device='disk'> + <driver name='phy' /> + <source dev='%(path)s' /> + <target dev='%(prefix)s%(dev)s' /> +</disk> +""" + +instance_template = """ +<domain type='xen'> + <name>%(name)s</name> + %(bootloader)s + <os> + <type>%(type)s</type> + %(loader)s + %(bootdev)s + </os> + <memory>%(memory)s</memory> + <vcpu>%(nr_vcpus)s</vcpu> + <on_poweroff>destroy</on_poweroff> + <on_reboot>restart</on_reboot> + <on_crash>restart</on_crash> + <features> + <acpi /> + <pae /> + </features> + <devices> + %(emulator)s + %(disks)s + <input type='mouse' bus='ps2' /> + <input type='tablet' bus='usb' /> + <graphics type='vnc' port='-1' /> + %(console)s + </devices> +</domain> +""" + +class virtinstance_parser(vmconfig.parser): + """ + Support for libvirt's domain instance format as defined (mostly) by + libvirt.rng. Currently, this only produces domains for Xen. + + This is a somewhat challenging format as it encodes significant + amounts of information specific to a particular platform (for + example, the pygrub path. For now, we'll assume it's for the current + platform. In the future we might want to consider adding a + --host-type option. + """ + + name = "virt-instance" + suffix = ".virt-instance.xml" + can_import = False + can_export = True + + @staticmethod + def identify_file(input_file): + """ + Return True if the given file is of this format. + """ + raise NotImplementedError + + @staticmethod + def import_file(input_file): + """ + Import a configuration file. Raises if the file couldn't be + opened, or parsing otherwise failed. + """ + raise NotImplementedError + + @staticmethod + def export_file(vm, output_file): + """ + Export a configuration file. + @vm vm configuration instance + @file Output file + + Raises ValueError if configuration is not suitable, or another + exception on failure to write the output file. + """ + + if not vm.memory: + raise ValueError("VM must have a memory setting") + + # xend wants the name to match r'^[A-Za-z0-9_\-\.\:\/\+]+$' + vmname = re.sub(r'[^A-Za-z0-9_.:/+-]+', '_', vm.name) + + vmtype = "xen" + disk_prefix = "xvd" + if (vm.type == vmconfig.VM_TYPE_HVM): + vmtype = "hvm" + disk_prefix = "hd" + + disks = [] + + for disk in vm.disks: + drive_nr = ascii_letters[disk.number % 26] + + # FIXME: needs updating for later Xen enhancements; need to + # implement capabilities checking for max disks etc. + disks.append(disk_template % { + "path" : disk.path, + "prefix" : disk_prefix, + "dev" : drive_nr + }) + + out = instance_template % { + "name" : vmname.replace(" ", "-"), + "bootloader" : bootloaders[vm.type], + "type" : vmtype, + "loader" : loaders[vm.type], + "bootdev" : bootdevs[vm.type], + # Mb to Kb + "memory" : int(vm.memory) * 1024, + "nr_vcpus" : vm.nr_vcpus, + "emulator" : emulators[vm.type], + "disks" : "".join(disks), + "console" : consoles[vm.type], + } + + outfile = open(output_file, "w") + outfile.writelines(out) + outfile.close() + +vmconfig.register_parser(virtinstance_parser) diff --git a/virtconv/parsers/vmx.py b/virtconv/parsers/vmx.py --- a/virtconv/parsers/vmx.py +++ b/virtconv/parsers/vmx.py @@ -29,6 +29,8 @@ class vmx_parser(vmconfig.parser): name = "vmx" suffix = ".vmx" + can_import = True + can_export = False @staticmethod def identify_file(input_file): diff --git a/virtconv/vmconfig.py b/virtconv/vmconfig.py --- a/virtconv/vmconfig.py +++ b/virtconv/vmconfig.py @@ -193,3 +193,21 @@ def find_parser_by_file(input_file): if p.identify_file(input_file): return p return None + +def formats(): + """ + Return a list of supported formats. + """ + return [p.name for p in _parsers] + +def input_formats(): + """ + Return a list of supported input formats. + """ + return [p.name for p in _parsers if p.can_import] + +def output_formats(): + """ + Return a list of supported output formats. + """ + return [p.name for p in _parsers if p.can_export] _______________________________________________ et-mgmt-tools mailing list et-mgmt-tools@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/et-mgmt-tools