def dependency_install(local_host): """ Install the missing pylib """ iso_path = iso_path_in_config(local_host) if iso_path is None: iso_path = esmon_install_common.find_iso_path_in_cwd(local_host) if iso_path is None: logging.error("failed to find ESMON ISO %s under currect " "directory") return -1 logging.info( "no [iso_path] is configured, use [%s] under current " "directory", iso_path) mnt_path = "/mnt/" + utils.random_word(8) command = ("mkdir -p %s && mount -o loop %s %s" % (mnt_path, iso_path, mnt_path)) retval = local_host.sh_run(command) if retval.cr_exit_status: logging.error( "failed to run command [%s] on host [%s], " "ret = [%d], stdout = [%s], stderr = [%s]", command, local_host.sh_hostname, retval.cr_exit_status, retval.cr_stdout, retval.cr_stderr) return -1 ret = dependency_do_install(local_host, mnt_path) if ret: logging.error("failed to install dependent libraries on local host") return ret command = ("umount %s" % (mnt_path)) retval = local_host.sh_run(command) if retval.cr_exit_status: logging.error( "failed to run command [%s] on host [%s], " "ret = [%d], stdout = [%s], stderr = [%s]", command, local_host.sh_hostname, retval.cr_exit_status, retval.cr_stdout, retval.cr_stderr) ret = -1 command = ("rmdir %s" % (mnt_path)) retval = local_host.sh_run(command) if retval.cr_exit_status: logging.error( "failed to run command [%s] on host [%s], " "ret = [%d], stdout = [%s], stderr = [%s]", command, local_host.sh_hostname, retval.cr_exit_status, retval.cr_stdout, retval.cr_stderr) ret = -1 return ret
def esmon_test_install(workspace, install_server, host_iso_path): """ Run the install test """ # pylint: disable=bare-except mnt_path = "/mnt/" + utils.random_word(8) command = ("mkdir -p %s && mount -o loop %s %s" % (mnt_path, host_iso_path, mnt_path)) retval = install_server.sh_run(command) if retval.cr_exit_status: logging.error( "failed to run command [%s] on host [%s], " "ret = [%d], stdout = [%s], stderr = [%s]", command, install_server.sh_hostname, retval.cr_exit_status, retval.cr_stdout, retval.cr_stderr) return -1 try: ret = esmon_do_test_install(workspace, install_server, mnt_path) except: ret = -1 logging.error("exception: %s", traceback.format_exc()) command = ("umount %s" % (mnt_path)) retval = install_server.sh_run(command) if retval.cr_exit_status: logging.error( "failed to run command [%s] on host [%s], " "ret = [%d], stdout = [%s], stderr = [%s]", command, install_server.sh_hostname, retval.cr_exit_status, retval.cr_stdout, retval.cr_stderr) ret = -1 command = ("rmdir %s" % (mnt_path)) retval = install_server.sh_run(command) if retval.cr_exit_status: logging.error( "failed to run command [%s] on host [%s], " "ret = [%d], stdout = [%s], stderr = [%s]", command, install_server.sh_hostname, retval.cr_exit_status, retval.cr_stdout, retval.cr_stderr) return -1 return ret
def vm_install(workspace, server_host, iso_path, hostname, internet, network_configs, image_dir, distro, ram_size, disk_sizes): """ Install virtual machine from ISO """ # pylint: disable=too-many-arguments,too-many-locals # pylint: disable=too-many-return-statements,too-many-statements # pylint: disable=too-many-branches ret = vm_delete(server_host, hostname) if ret: return -1 network_config = network_configs[0] host_ip = network_config["ip"] command = ("ping -c 1 %s" % host_ip) retval = server_host.sh_run(command) if retval.cr_exit_status == 0: logging.error("IP [%s] is already used by a host", host_ip) return -1 command = ("ping -c 1 %s" % hostname) retval = server_host.sh_run(command) if retval.cr_exit_status == 0: logging.error("host [%s] is already up", hostname) return -1 mnt_path = "/mnt/" + utils.random_word(8) command = ("mkdir -p %s && mount -o loop %s %s" % (mnt_path, iso_path, mnt_path)) retval = server_host.sh_run(command) if retval.cr_exit_status: logging.error("failed to run command [%s] on host [%s], " "ret = [%d], stdout = [%s], stderr = [%s]", command, server_host.sh_hostname, retval.cr_exit_status, retval.cr_stdout, retval.cr_stderr) return -1 ks_config = """# Kickstart file automatically generated by ESMON. install reboot cdrom lang en_US.UTF-8 keyboard us """ ks_config += """rootpw password firewall --disabled authconfig --enableshadow --passalgo=sha512 selinux --disabled timezone --utc Asia/Shanghai bootloader --location=mbr --driveorder=sda --append="crashkernel=auto net.ifnames=0 biosdevname=0" zerombr clearpart --all --initlabel part / --fstype=ext4 --grow --size=500 --ondisk=sda --asprimary repo --name="Media" --baseurl=file:///mnt/source --cost=100 %packages @Core %end %post --log=/var/log/anaconda/post-install.log #!/bin/bash # Configure hostname, somehow virt-install --name doesn't work """ if distro == ssh_host.DISTRO_RHEL6: ks_config += 'echo NETWORKING=yes > /etc/sysconfig/network\n' ks_config += ('echo HOSTNAME=%s >> /etc/sysconfig/network\n' % (hostname)) elif distro == ssh_host.DISTRO_RHEL7: ks_config += "echo %s > /etc/hostname\n" % (hostname) else: logging.error("wrong distro [%s]", distro) return -1 ks_config += "# Configure network\n" eth_number = 0 ens_number = 3 for network_config in network_configs: # net.ifnames=0 biosdevname=0 will be added to GRUB_CMDLINE_LINUX, so the # interface name will always be eth* ks_config += "# Network eth%d\n" % eth_number ks_config += ("rm -f /etc/sysconfig/network-scripts/ifcfg-ens%d\n" % ens_number) ks_config += ("cat << EOF > /etc/sysconfig/network-scripts/ifcfg-eth%d\n" % eth_number) ks_config += "DEVICE=eth%d\n" % eth_number ks_config += 'IPADDR="%s"\n' % network_config["ip"] ks_config += 'NETMASK="%s"\n' % network_config["netmask"] if "gateway" in network_config: ks_config += 'GATEWAY=\"%s"\n' % network_config["gateway"] ks_config += """ONBOOT=yes BOOTPROTO="static" TYPE=Ethernet IPV6INIT=no NM_CONTROLLED=no EOF """ eth_number += 1 ens_number += 1 ks_config += "%end\n" local_host_dir = workspace + "/" + hostname os.mkdir(local_host_dir) ks_fname = "%s.ks" % hostname ks_fpath = local_host_dir + "/" + ks_fname with open(ks_fpath, "wt") as fout: fout.write(ks_config) host_ks_fpath = workspace + "/" + ks_fname ret = server_host.sh_send_file(ks_fpath, workspace) if ret: logging.error("failed to send file [%s] on local host to " "directory [%s] on host [%s]", ks_fpath, workspace, server_host.sh_hostname) return -1 command = ("virt-install --vcpus=1 --os-type=linux " "--hvm --connect=qemu:///system " "--accelerate --serial pty -v --nographics --noautoconsole --wait=-1 ") command += "--ram=%s " % ram_size for network_config in network_configs: command += ("--network=%s " % (network_config["virt_install_option"])) command += ("--name=%s " % (hostname)) command += ("--initrd-inject=%s " % (host_ks_fpath)) disk_index = 0 for disk_size in disk_sizes: command += ("--disk path=%s/%s_%d.img,size=%s " % (image_dir, hostname, disk_index, disk_size)) disk_index += 1 command += ("--location %s " % (mnt_path)) command += ("--disk=%s,device=cdrom,perms=ro " % (iso_path)) command += ("--extra-args='console=tty0 console=ttyS0,115200n8 " "ks=file:/%s'" % (ks_fname)) if distro == ssh_host.DISTRO_RHEL6: install_timeout = 300 elif distro == ssh_host.DISTRO_RHEL7: install_timeout = 1200 retval = server_host.sh_run(command, timeout=install_timeout) if retval.cr_exit_status: logging.error("failed to run command [%s] on host [%s], " "ret = [%d], stdout = [%s], stderr = [%s]", command, server_host.sh_hostname, retval.cr_exit_status, retval.cr_stdout, retval.cr_stderr) return -1 ret = server_host.sh_run("which sshpass") if ret.cr_exit_status != 0: # sshpass rely on epel-release on centos6 command = ("yum install epel-release -y") retval = server_host.sh_run(command) if retval.cr_exit_status: logging.error("failed to run command [%s] on host [%s], " "ret = [%d], stdout = [%s], stderr = [%s]", command, server_host.sh_hostname, retval.cr_exit_status, retval.cr_stdout, retval.cr_stderr) return -1 command = ("yum install sshpass -y") retval = server_host.sh_run(command) if retval.cr_exit_status: logging.error("failed to run command [%s] on host [%s], " "ret = [%d], stdout = [%s], stderr = [%s]", command, server_host.sh_hostname, retval.cr_exit_status, retval.cr_stdout, retval.cr_stderr) return -1 # Remove the record in known_hosts, otherwise ssh will fail command = ('sed -i "/%s /d" /root/.ssh/known_hosts' % (host_ip)) retval = server_host.sh_run(command) if retval.cr_exit_status: logging.error("failed to run command [%s] on host [%s], " "ret = [%d], stdout = [%s], stderr = [%s]", command, server_host.sh_hostname, retval.cr_exit_status, retval.cr_stdout, retval.cr_stderr) return -1 # When virt-install finished, the virtual machine starts to reboot # so wait a little bit here until the host is up. Need # StrictHostKeyChecking=no, otherwise exit code will be 6 (ENOENT) expect_stdout = hostname + "\n" command = ("sshpass -p password ssh -o StrictHostKeyChecking=no " "root@%s hostname" % (host_ip)) ret = server_host.sh_wait_update(command, expect_exit_status=0, expect_stdout=expect_stdout) if ret: logging.error("failed to wait host [%s] up", hostname) return -1 command = ("sshpass -p password ssh root@%s " "\"mkdir /root/.ssh && chmod 600 /root/.ssh\"" % (host_ip)) retval = server_host.sh_run(command) if retval.cr_exit_status: logging.error("failed to run command [%s] on host [%s], " "ret = [%d], stdout = [%s], stderr = [%s]", command, server_host.sh_hostname, retval.cr_exit_status, retval.cr_stdout, retval.cr_stderr) return -1 command = ("sshpass -p password scp /root/.ssh/* root@%s:/root/.ssh" % (host_ip)) retval = server_host.sh_run(command) if retval.cr_exit_status: logging.error("failed to run command [%s] on host [%s], " "ret = [%d], stdout = [%s], stderr = [%s]", command, server_host.sh_hostname, retval.cr_exit_status, retval.cr_stdout, retval.cr_stderr) return -1 vm_host = ssh_host.SSHHost(host_ip) command = "> /root/.ssh/known_hosts" retval = vm_host.sh_run(command) if retval.cr_exit_status: logging.error("failed to run command [%s] on host [%s], " "ret = [%d], stdout = [%s], stderr = [%s]", command, vm_host.sh_hostname, retval.cr_exit_status, retval.cr_stdout, retval.cr_stderr) return -1 command = "hostname" retval = vm_host.sh_run(command) if retval.cr_exit_status: logging.error("failed to run command [%s] on host [%s], " "ret = [%d], stdout = [%s], stderr = [%s]", command, vm_host.sh_hostname, retval.cr_exit_status, retval.cr_stdout, retval.cr_stderr) return -1 real_hostname = retval.cr_stdout.strip() if real_hostname != hostname: logging.error("wrong hostname, expected [%s], got [%s]", hostname, real_hostname) return -1 if internet: ret = vm_host.sh_enable_dns() if ret: logging.error("failed to enable dns on host [%s]") return -1 command = "yum install rsync -y" retval = vm_host.sh_run(command) if retval.cr_exit_status: logging.error("failed to run command [%s] on host [%s], " "ret = [%d], stdout = [%s], stderr = [%s]", command, vm_host.sh_hostname, retval.cr_exit_status, retval.cr_stdout, retval.cr_stderr) return -1 # Do not check the return status, because the connection could be stopped command = "init 0" vm_host.sh_run(command) command = ("umount %s" % (mnt_path)) retval = server_host.sh_run(command) if retval.cr_exit_status: logging.error("failed to run command [%s] on host [%s], " "ret = [%d], stdout = [%s], stderr = [%s]", command, server_host.sh_hostname, retval.cr_exit_status, retval.cr_stdout, retval.cr_stderr) ret = -1 command = ("rmdir %s" % (mnt_path)) retval = server_host.sh_run(command) if retval.cr_exit_status: logging.error("failed to run command [%s] on host [%s], " "ret = [%d], stdout = [%s], stderr = [%s]", command, server_host.sh_hostname, retval.cr_exit_status, retval.cr_stdout, retval.cr_stderr) return -1 # Need to wait until VM shut off, otherwise "virsh change-media" won't # change the XML file ret = utils.wait_condition(vm_check_shut_off, [server_host, hostname]) if ret: logging.error("failed when waiting host [%s] on [%s] shut off", hostname, server_host.sh_hostname) return ret # Find the CDROM device command = ("virsh domblklist %s --details | grep cdrom | " "awk '{print $3}'" % (hostname)) retval = server_host.sh_run(command) if retval.cr_exit_status: logging.error("failed to run command [%s] on host [%s], " "ret = [%d], stdout = [%s], stderr = [%s]", command, server_host.sh_hostname, retval.cr_exit_status, retval.cr_stdout, retval.cr_stderr) return -1 cdroms = retval.cr_stdout.splitlines() if len(cdroms) != 1: logging.error("unexpected cdroms: [%s]", retval.cr_stdout) return -1 cdrom = cdroms[0] command = ("virsh change-media %s %s --eject" % (hostname, cdrom)) retval = server_host.sh_run(command) if retval.cr_exit_status: logging.error("failed to run command [%s] on host [%s], " "ret = [%d], stdout = [%s], stderr = [%s]", command, server_host.sh_hostname, retval.cr_exit_status, retval.cr_stdout, retval.cr_stderr) return -1 return 0