def start_install(name=None, ram=None, disks=None, mac=None, uuid=None, extra=None, vcpus=None, profile_data=None, arch=None, no_gfx=False, fullvirt=True, bridge=None, virt_type=None, virt_auto_boot=False, qemu_driver_type=None): if "file" in profile_data: raise app.InfoException("vmware does not work with --image yet") mac = None if "interfaces" not in profile_data: print("- vmware installation requires a system, not a profile") return 1 for iname in profile_data["interfaces"]: intf = profile_data["interfaces"][iname] mac = intf["mac_address"] if mac is None: print("- no MAC information available in this record, cannot install") return 1 print("DEBUG: name=%s" % name) print("DEBUG: ram=%s" % ram) print("DEBUG: mac=%s" % mac) print("DEBUG: disks=%s" % disks) # starts vmware using PXE. disk/mem info come from Cobbler # rest of the data comes from PXE which is also intended # to be managed by Cobbler. if not os.path.exists(IMAGE_DIR): os.makedirs(IMAGE_DIR) if not os.path.exists(VMX_DIR): os.makedirs(VMX_DIR) if len(disks) != 1: raise VirtCreateException( "vmware support is limited to 1 virtual disk") diskname = disks[0][0] disksize = disks[0][1] image = "%s/%s" % (IMAGE_DIR, name) print("- saving virt disk image as %s" % image) make_disk(disksize, image) vmx = "%s/%s" % (VMX_DIR, name) print("- saving vmx file as %s" % vmx) make_vmx(vmx, image, name, mac, ram) register_vmx(vmx) start_vm(vmx)
def _sanitize_disks(disks): ret = [] for d in disks: driver_type = None if len(d) > 2: driver_type = d[2] if d[1] != 0 or d[0].startswith("/dev"): ret.append((d[0], d[1], driver_type)) else: raise app.InfoException( "this virtualization type does not work without a disk image, set virt-size in Cobbler to non-zero" ) return ret
def _sanitize_nics(nics, bridge, profile_bridge, network_count): ret = [] if network_count is not None and not nics: # Fill in some stub nics so we can take advantage of the loop logic nics = {} for i in range(int(network_count)): nics["foo%s" % i] = { "interface_type": "na", "mac_address": None, "virt_bridge": None, } if not nics: return ret interfaces = sorted(nics) counter = -1 vlanpattern = re.compile("[a-zA-Z0-9]+\.[0-9]+") for iname in interfaces: counter = counter + 1 intf = nics[iname] if (intf["bonding"] == "master" or vlanpattern.match(iname) or iname.find(":") != -1): continue mac = intf["mac_address"] if not bridge: intf_bridge = intf["virt_bridge"] if intf_bridge == "": if profile_bridge == "": raise app.InfoException( "virt-bridge setting is not defined in cobbler") intf_bridge = profile_bridge else: if bridge.find(",") == -1: intf_bridge = bridge else: bridges = bridge.split(",") intf_bridge = bridges[counter] ret.append((intf_bridge, mac)) return ret
def start_install(*args, **kwargs): if 'arch' in kwargs.keys(): kwargs['arch'] = None # use host arch for kvm acceleration # Use kvm acceleration if available try: import libvirt except: raise app.InfoException( "package libvirt is required for installing virtual guests") conn = libvirt.openReadOnly(None) # See http://libvirt.org/formatcaps.html capabilities = parseString(conn.getCapabilities()) for domain in capabilities.getElementsByTagName("domain"): attributes = dict(domain.attributes.items()) if 'type' in attributes.keys() and attributes['type'] == 'kvm': kwargs['virt_type'] = 'kvm' break virtinstall.create_image_file(*args, **kwargs) cmd = virtinstall.build_commandline("qemu:///system", *args, **kwargs) subprocess_call(cmd)
def build_commandline(uri, name=None, ram=None, disks=None, uuid=None, extra=None, vcpus=None, profile_data=None, arch=None, no_gfx=False, fullvirt=False, bridge=None, virt_type=None, virt_auto_boot=False, virt_pxe_boot=False, qemu_driver_type=None, qemu_net_type=None, qemu_machine_type=None, cpu=None, wait=0, noreboot=False, osimport=False): # Set flags for CLI arguments based on the virtinst_version # tuple above. Older versions of python-virtinst don't have # a version easily accessible, so it will be None and we can # easily disable features based on that (RHEL5 and older usually) disable_autostart = False disable_virt_type = False disable_boot_opt = False disable_driver_type = False disable_net_model = False disable_machine_type = False oldstyle_macs = False oldstyle_accelerate = False if not virtinst_version: print( "- warning: old virt-install detected, a lot of features will be disabled" ) disable_autostart = True disable_boot_opt = True disable_virt_type = True disable_driver_type = True disable_net_model = True disable_machine_type = True oldstyle_macs = True oldstyle_accelerate = True import_exists = False # avoid duplicating --import parameter disable_extra = False # disable --extra-args on --import if osimport: disable_extra = True is_import = uri.startswith("import") if is_import: # We use the special value 'import' for imagecreate.py. Since # it is connection agnostic, just let virt-install choose the # best hypervisor. uri = "" fullvirt = None is_xen = uri.startswith("xen") is_qemu = uri.startswith("qemu") if is_qemu: if virt_type != "kvm": fullvirt = True else: fullvirt = None floppy = None cdrom = None location = None importpath = None if is_import: importpath = profile_data.get("file") if not importpath: raise app.InfoException("Profile 'file' required for image " "install") elif "file" in profile_data: if is_xen: raise app.InfoException("Xen does not work with --image yet") # this is an image based installation input_path = profile_data["file"] print("- using image location %s" % input_path) if input_path.find(":") == -1: # this is not an NFS path cdrom = input_path else: (tempdir, filename) = nfsmount(input_path) cdrom = os.path.join(tempdir, filename) kickstart = profile_data.get("kickstart", "") if kickstart != "": # we have a (windows?) answer file we have to provide # to the ISO. print("I want to make a floppy for %s" % kickstart) floppy = make_floppy(kickstart) elif is_qemu or is_xen: # images don't need to source this if "install_tree" not in profile_data: raise app.InfoException( "Cannot find install source in kickstart file, aborting.") if not profile_data["install_tree"].endswith("/"): profile_data["install_tree"] = profile_data["install_tree"] + "/" location = profile_data["install_tree"] disks = _sanitize_disks(disks) nics = _sanitize_nics(profile_data.get("interfaces"), bridge, profile_data.get("virt_bridge"), profile_data.get("network_count")) if not nics: # for --profile you get one NIC, go define a system if you want more. # FIXME: can mac still be sent on command line in this case? if bridge is None: bridge = profile_data["virt_bridge"] if bridge == "": raise app.InfoException( "virt-bridge setting is not defined in cobbler") nics = [(bridge, None)] kernel = profile_data.get("kernel_local") initrd = profile_data.get("initrd_local") breed = profile_data.get("breed") os_version = profile_data.get("os_version") if os_version and breed == "ubuntu": os_version = "ubuntu%s" % os_version if os_version and breed == "debian": os_version = "debian%s" % os_version net_model = None disk_bus = None machine_type = None if is_qemu: net_model = qemu_net_type disk_bus = qemu_driver_type machine_type = qemu_machine_type if machine_type is None: machine_type = "pc" cmd = "virt-install " if uri: cmd += "--connect %s " % uri cmd += "--name %s " % name cmd += "--ram %s " % ram cmd += "--vcpus %s " % vcpus if uuid: cmd += "--uuid %s " % uuid if virt_auto_boot and not disable_autostart: cmd += "--autostart " if no_gfx: cmd += "--nographics " else: cmd += "--vnc " if is_qemu and virt_type: if not disable_virt_type: cmd += "--virt-type %s " % virt_type if is_qemu and machine_type and not disable_machine_type: cmd += "--machine %s " % machine_type if fullvirt or is_qemu or is_import: if fullvirt is not None: cmd += "--hvm " elif oldstyle_accelerate: cmd += "--accelerate " if is_qemu and extra and not (virt_pxe_boot) and not (disable_extra): cmd += ("--extra-args=\"%s\" " % (extra)) if virt_pxe_boot or is_xen: cmd += "--pxe " elif cdrom: cmd += "--cdrom %s " % cdrom elif location: cmd += "--location %s " % location elif importpath: cmd += "--import " import_exists = True if arch: cmd += "--arch %s " % arch else: cmd += "--paravirt " if not disable_boot_opt: cmd += ("--boot kernel=%s,initrd=%s,kernel_args=\"%s\" " % (kernel, initrd, extra)) else: if location: cmd += "--location %s " % location if extra: cmd += "--extra-args=\"%s\" " % extra if breed and breed != "other": if os_version and os_version != "other": if breed == "suse": suse_version_re = re.compile("^(opensuse[0-9]+)\.([0-9]+)$") if suse_version_re.match(os_version): os_version = suse_version_re.match(os_version).groups()[0] # make sure virt-install knows about our os_version, # otherwise default it to virtio26 or generic26 # found = False if os_version in supported_variants: pass # os_version is correct elif os_version + ".0" in supported_variants: # osinfo based virt-install only knows about major.minor # variants, not just major variants like it used to. Default # to major.0 variant in that case. Lack of backwards # compatibility in virt-install grumble grumble. os_version = os_version + ".0" else: if "virtio26" in supported_variants: os_version = "virtio26" else: os_version = "generic26" print("- warning: virt-install doesn't know this os_version, " "defaulting to %s" % os_version) cmd += "--os-variant %s " % os_version else: distro = "unix" if breed in ["debian", "suse", "redhat"]: distro = "linux" elif breed in ["windows"]: distro = "windows" cmd += "--os-type %s " % distro if importpath: # This needs to be the first disk for import to work cmd += "--disk path=%s " % importpath for path, size, driver_type in disks: print("- adding disk: %s of size %s (driver type=%s)" % (path, size, driver_type)) cmd += "--disk path=%s" % (path) if str(size) != "0": cmd += ",size=%s" % size if disk_bus: cmd += ",bus=%s" % disk_bus if driver_type and not disable_driver_type: cmd += ",format=%s" % driver_type cmd += " " if floppy: cmd += "--disk path=%s,device=floppy " % floppy for bridge, mac in nics: cmd += "--network bridge=%s" % bridge if net_model and not disable_net_model: cmd += ",model=%s" % net_model if mac: if oldstyle_macs: cmd += " --mac=%s" % mac else: cmd += ",mac=%s" % mac cmd += " " cmd += "--wait %d " % int(wait) if cpu: cmd += "--cpu %s " % cpu if noreboot: cmd += "--noreboot " if osimport and not (import_exists): cmd += "--import " cmd += "--noautoconsole " return shlex.split(str(cmd.strip()))