Beispiel #1
0
    def import_file(input_file):
        """
        Import a configuration file.  Raises if the file couldn't be
        opened, or parsing otherwise failed.
        """

        vm = vmcfg.vm()

        infile = open(input_file, "r")
        contents = infile.readlines()
        infile.close()

        lines = []

        # strip out comment and blank lines for easy splitting of values
        for line in contents:
            if not line.strip() or line.startswith("#"):
                continue
            else:
                lines.append(line)
    
        config = {}

        # split out all remaining entries of key = value form
        for (line_nr, line) in enumerate(lines):
            try:
                before_eq, after_eq = line.split("=", 1)
                key = before_eq.strip().lower()
                value = after_eq.strip().strip('"')
                config[key] = value

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

        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
                not os.path.exists(disk.path)):
                vm.disks[devid].path = None

        if not config.get("displayname"):
            raise ValueError(_("No displayName defined in \"%s\"") %
                             input_file)
        vm.name = config.get("displayname")

        vm.memory = config.get("memsize")
        vm.description = config.get("annotation")
        vm.nr_vcpus = config.get("numvcpus")
     
        vm.validate()
        return vm
Beispiel #2
0
    def import_file(input_file):
        """
        Import a configuration file.  Raises if the file couldn't be
        opened, or parsing otherwise failed.
        """

        vm = vmcfg.vm()

        infile = open(input_file, "r")
        contents = infile.readlines()
        infile.close()

        lines = []

        # strip out comment and blank lines for easy splitting of values
        for line in contents:
            if not line.strip() or line.startswith("#"):
                continue
            else:
                lines.append(line)

        config = {}

        # split out all remaining entries of key = value form
        for (line_nr, line) in enumerate(lines):
            try:
                before_eq, after_eq = line.split("=", 1)
                key = before_eq.strip().lower()
                value = after_eq.strip().strip('"')
                config[key] = value

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

        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 not os.path.exists(disk.path)):
                vm.disks[devid].path = None

        if not config.get("displayname"):
            raise ValueError(
                _("No displayName defined in \"%s\"") % input_file)
        vm.name = config.get("displayname")

        vm.memory = config.get("memsize")
        vm.description = config.get("annotation")
        vm.nr_vcpus = config.get("numvcpus")

        vm.validate()
        return vm
 def import_file(input_file):
     """
     Import a configuration file.  Raises if the file couldn't be
     opened, or parsing otherwise failed.
     """
     vm = vmcfg.vm()
     try:
         config  = ImageParser.parse_file(input_file)
     except Exception, e:
         raise ValueError(_("Couldn't import file '%s': %s") %
                          (input_file, e))
Beispiel #4
0
    def import_file(input_file):
        """
        Import a configuration file.  Raises if the file couldn't be
        opened, or parsing otherwise failed.
        """
        vm = vmcfg.vm()
        try:
            f = file(input_file, "r")
            output = f.read()
            f.close()

            logging.debug("Importing virt-image XML:\n%s", output)
            config = virtimage.parse(output, input_file)
        except Exception, e:
            raise ValueError(_("Couldn't import file '%s': %s") % (input_file, e))
    def import_file(input_file):
        """
        Import a configuration file.  Raises if the file couldn't be
        opened, or parsing otherwise failed.
        """
        vm = vmcfg.vm()
        try:
            f = file(input_file, "r")
            output = f.read()
            f.close()

            logging.debug("Importing virt-image XML:\n%s", output)
            config = ImageParser.parse(output, input_file)
        except Exception, e:
            raise ValueError(
                _("Couldn't import file '%s': %s") % (input_file, e))
Beispiel #6
0
    def import_file(input_file):
        """
        Import a configuration file.  Raises if the file couldn't be
        opened, or parsing otherwise failed.
        """

        vm = vmcfg.vm()

        infile = open(input_file, "r")
        contents = infile.readlines()
        infile.close()
        logging.debug("Importing VMX file:\n%s", "".join(contents))

        vmxfile = _VMXFile(contents)
        config = vmxfile.pairs()

        if not config.get("displayname"):
            raise ValueError(_("No displayName defined in '%s'") %
                             input_file)

        vm.name = config.get("displayname")
        vm.memory = config.get("memsize")
        vm.description = config.get("annotation")
        vm.nr_vcpus = config.get("numvcpus")

        for key, value in config.items():
            if key.startswith("scsi") or key.startswith("ide"):
                parse_disk_entry(vm, key, value)
            if key.startswith("ethernet"):
                parse_netdev_entry(vm, key, value)

        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
                not os.path.exists(disk.path)):
                vm.disks[devid].path = None

        vm.validate()
        return vm
Beispiel #7
0
    def _import_file(ctx):
        def xpath_str(path):
            ret = ctx.xpathEval(path)
            result = None
            if ret is not None:
                if type(ret) == list:
                    if len(ret) >= 1:
                        result = ret[0].content
                else:
                    result = ret
            return result

        def bool_val(val):
            if str(val).lower() == "false":
                return False
            elif str(val).lower() == "true":
                return True

            return False

        def xpath_nodes(path):
            return ctx.xpathEval(path)

        vm = vmcfg.vm()

        file_refs = {}
        disk_section = {}
        net_section = {}
        name = None
        desc = None

        os_id_ignore = None
        os_ver_ignore = None
        os_type_ignore = None

        # XXX: Can have multiple machines nested as VirtualSystemCollection
        # XXX: Need to check all Envelope

        # General info
        name = xpath_str("/ovf:Envelope/ovf:VirtualSystem/ovf:Name")

        # Map files in <References> to actual filename
        ens = xpath_nodes("/ovf:Envelope[1]")[0]
        envelope_node = ens.children
        for envelope_node in node_list(ens):

            if envelope_node.name == "References":
                for reference_node in envelope_node.children:
                    if reference_node.name != "File":
                        continue

                    file_id = reference_node.prop("id")
                    path = reference_node.prop("href")

                    # XXX: Should we validate the path exists? This can
                    #      be http.
                    if file_id and path:
                        file_refs[file_id] = path

            elif envelope_node.name == "DiskSection":
                for disk_node in envelope_node.children:
                    if disk_node.name != "Disk":
                        continue

                    fmt = disk_node.prop("format")
                    if not fmt:
                        fmt = diskcfg.DISK_FORMAT_VMDK
                    elif fmt.lower().count("vmdk"):
                        fmt = diskcfg.DISK_FORMAT_VMDK
                    else:
                        fmt = diskcfg.DISK_FORMAT_VMDK

                    disk_id = disk_node.prop("diskId")
                    file_ref = disk_node.prop("fileRef")
                    capacity = disk_node.prop("capacity")
                    alloc_str = disk_node.prop("AllocationUnits")
                    capacity = convert_alloc_val(alloc_str, capacity)

                    # XXX: Empty fileref means 'create this disk'
                    disk_section[disk_id] = (file_ref, fmt)

            elif envelope_node.name == "NetworkSection":
                for net_node in envelope_node.children:
                    if net_node.name != "Network":
                        continue

                    net_name_ignore = net_node.prop("name")
                    net_section[name] = None

            elif not envelope_node.isText():
                logging.debug("Unhandled XML section '%s'",
                              envelope_node.name)

                req = bool_val(envelope_node.prop("required"))
                if req:
                    raise StandardError(_("OVF section '%s' is listed as "
                                          "required, but parser doesn't know "
                                          "how to handle it.") %
                                          envelope_node.name)

        # Now parse VirtualSystem, since we should have set up all the
        # necessary file/disk/whatever refs
        for envelope_node in node_list(ens):
            if envelope_node.name != "VirtualSystem":
                continue

            for vs_node in node_list(envelope_node):

                if vs_node.name == "Info":
                    pass

                elif vs_node.name == "Name":
                    name = vs_node.content

                elif vs_node.name == "OperatingSystemSection":
                    os_id_ignore = vs_node.prop("id")
                    os_ver_ignore = vs_node.prop("version")
                    # This is the VMWare OS name
                    os_type_ignore = vs_node.prop("osType")

                elif vs_node.name == "VirtualHardwareSection":
                    _parse_hw_section(vm, node_list(vs_node), file_refs,
                                      disk_section)

                elif vs_node.name == "AnnotationSection":
                    for an_node in node_list(vs_node):
                        if an_node.name == "Annotation":
                            desc = an_node.content


        vm.name = name
        vm.description = desc
        vm.validate()

        return vm
Beispiel #8
0
    def _import_file(ctx):
        def xpath_str(path):
            ret = ctx.xpathEval(path)
            result = None
            if ret != None:
                if type(ret) == list:
                    if len(ret) >= 1:
                        result = ret[0].content
                else:
                    result = ret
            return result

        def bool_val(val):
            if str(val).lower() == "false":
                return False
            elif str(val).lower() == "true":
                return True

            return False

        def xpath_nodes(path):
            return ctx.xpathEval(path)

        vm = vmcfg.vm()

        file_refs = {}
        disk_section = {}
        net_section = {}
        name = None
        desc = None

        os_id_ignore = None
        os_ver_ignore = None
        os_type_ignore = None

        # XXX: Can have multiple machines nested as VirtualSystemCollection
        # XXX: Need to check all Envelope

        # General info
        name = xpath_str("/ovf:Envelope/ovf:VirtualSystem/ovf:Name")

        # Map files in <References> to actual filename
        ens = xpath_nodes("/ovf:Envelope[1]")[0]
        envelope_node = ens.children
        for envelope_node in node_list(ens):

            if envelope_node.name == "References":
                for reference_node in envelope_node.children:
                    if reference_node.name != "File":
                        continue

                    file_id = reference_node.prop("id")
                    path = reference_node.prop("href")

                    # XXX: Should we validate the path exists? This can
                    #      be http.
                    if file_id and path:
                        file_refs[file_id] = path

            elif envelope_node.name == "DiskSection":
                for disk_node in envelope_node.children:
                    if disk_node.name != "Disk":
                        continue

                    fmt = disk_node.prop("format")
                    if not fmt:
                        fmt = diskcfg.DISK_FORMAT_VMDK
                    elif fmt.lower().count("vmdk"):
                        fmt = diskcfg.DISK_FORMAT_VMDK
                    else:
                        fmt = diskcfg.DISK_FORMAT_VMDK

                    disk_id = disk_node.prop("diskId")
                    file_ref = disk_node.prop("fileRef")
                    capacity = disk_node.prop("capacity")
                    alloc_str = disk_node.prop("AllocationUnits")
                    capacity = convert_alloc_val(alloc_str, capacity)

                    # XXX: Empty fileref means 'create this disk'
                    disk_section[disk_id] = (file_ref, fmt)

            elif envelope_node.name == "NetworkSection":
                for net_node in envelope_node.children:
                    if net_node.name != "Network":
                        continue

                    net_name_ignore = net_node.prop("name")
                    net_section[name] = None

            elif not envelope_node.isText():
                logging.debug("Unhandled XML section '%s'", envelope_node.name)

                req = bool_val(envelope_node.prop("required"))
                if req:
                    raise StandardError(
                        _("OVF section '%s' is listed as "
                          "required, but parser doesn't know "
                          "how to handle it.") % envelope_node.name)

        # Now parse VirtualSystem, since we should have set up all the
        # necessary file/disk/whatever refs
        for envelope_node in node_list(ens):
            if envelope_node.name != "VirtualSystem":
                continue

            for vs_node in node_list(envelope_node):

                if vs_node.name == "Info":
                    pass

                elif vs_node.name == "Name":
                    name = vs_node.content

                elif vs_node.name == "OperatingSystemSection":
                    os_id_ignore = vs_node.prop("id")
                    os_ver_ignore = vs_node.prop("version")
                    # This is the VMWare OS name
                    os_type_ignore = vs_node.prop("osType")

                elif vs_node.name == "VirtualHardwareSection":
                    _parse_hw_section(vm, node_list(vs_node), file_refs,
                                      disk_section)

                elif vs_node.name == "AnnotationSection":
                    for an_node in node_list(vs_node):
                        if an_node.name == "Annotation":
                            desc = an_node.content

        vm.name = name
        vm.description = desc
        vm.validate()

        return vm