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