Best Python code snippet using ATX
esmon_virt.py
Source:esmon_virt.py  
1# Copyright (c) 2017 DataDirect Networks, Inc.2# All Rights Reserved.3# Author: lixi@ddn.com4"""5Library for installing virtual machines6"""7# pylint: disable=too-many-lines8import sys9import logging10import traceback11import os12import shutil13import random14import yaml15import filelock16# Local libs17from pyesmon import utils18from pyesmon import time_util19from pyesmon import ssh_host20from pyesmon import esmon_common21ESMON_VIRT_CONFIG_FNAME = "esmon_virt.conf"22ESMON_VIRT_CONFIG = "/etc/" + ESMON_VIRT_CONFIG_FNAME23ESMON_VIRT_LOG_DIR = "/var/log/esmon_virt"24class VirtTemplate(object):25    """26    Each virtual machine template has an object of this type27    """28    # pylint: disable=too-few-public-methods,too-many-instance-attributes29    # pylint: disable=too-many-arguments30    def __init__(self, server_host, iso, template_hostname, internet,31                 network_configs, image_dir, distro, ram_size, disk_sizes):32        self.vt_server_host = server_host33        self.vt_iso = iso34        self.vt_template_hostname = template_hostname35        self.vt_internet = internet36        self.vt_network_configs = network_configs37        self.vt_image_dir = image_dir38        self.vt_distro = distro39        self.vt_ram_size = ram_size40        self.vt_disk_sizes = disk_sizes41def random_mac():42    """43    Generate random MAC address44    """45    mac_parts = [random.randint(0x00, 0x7f),46                 random.randint(0x00, 0xff),47                 random.randint(0x00, 0xff)]48    mac_string = "52:54:00"49    for mac_part in mac_parts:50        mac_string += ":" + ("%02x" % mac_part)51    return mac_string52def vm_is_shut_off(server_host, hostname):53    """54    Check whether vm is shut off55    """56    state = server_host.sh_virsh_dominfo_state(hostname)57    if state is None:58        return False59    elif state == "shut off":60        return True61    return False62def vm_check_shut_off(args):63    """64    Check whether vm is shut off65    """66    server_host = args[0]67    hostname = args[1]68    off = vm_is_shut_off(server_host, hostname)69    if off:70        return 071    return -172def vm_delete(server_host, hostname):73    """74    Delete a virtual machine75    """76    existed = True77    active = True78    state = server_host.sh_virsh_dominfo_state(hostname)79    if state is None:80        existed = False81        active = False82    elif state == "shut off":83        active = False84    if active:85        command = ("virsh destroy %s" % hostname)86        retval = server_host.sh_run(command)87        if retval.cr_exit_status:88            logging.error("failed to run command [%s] on host [%s], "89                          "ret = [%d], stdout = [%s], stderr = [%s]",90                          command,91                          server_host.sh_hostname,92                          retval.cr_exit_status,93                          retval.cr_stdout,94                          retval.cr_stderr)95            return -196    if existed:97        command = ("virsh undefine %s" % hostname)98        retval = server_host.sh_run(command)99        if retval.cr_exit_status:100            logging.error("failed to run command [%s] on host [%s], "101                          "ret = [%d], stdout = [%s], stderr = [%s]",102                          command,103                          server_host.sh_hostname,104                          retval.cr_exit_status,105                          retval.cr_stdout,106                          retval.cr_stderr)107            return -1108    return 0109def vm_clone(workspace, server_host, hostname, network_configs, ips,110             template_hostname, image_dir, distro, internet, disk_number):111    """112    Create virtual machine113    """114    # pylint: disable=too-many-arguments,too-many-locals,too-many-return-statements115    # pylint: disable=too-many-branches,too-many-statements116    host_ip = ips[0]117    ret = vm_delete(server_host, hostname)118    if ret:119        return -1120    command = ("ping -c 1 %s" % host_ip)121    retval = server_host.sh_run(command)122    if retval.cr_exit_status == 0:123        logging.error("IP [%s] already used by a host", host_ip)124        return -1125    command = ("ping -c 1 %s" % hostname)126    retval = server_host.sh_run(command)127    if retval.cr_exit_status == 0:128        logging.error("host [%s] already up", hostname)129        return -1130    active = True131    state = server_host.sh_virsh_dominfo_state(template_hostname)132    if state is None:133        logging.error("template [%s] doesn't exist on host [%s]",134                      template_hostname, server_host.sh_hostname)135        return -1136    elif state == "shut off":137        active = False138    if active:139        command = ("virsh destroy %s" % template_hostname)140        retval = server_host.sh_run(command)141        if retval.cr_exit_status:142            logging.error("failed to run command [%s] on host [%s], "143                          "ret = [%d], stdout = [%s], stderr = [%s]",144                          command,145                          server_host.sh_hostname,146                          retval.cr_exit_status,147                          retval.cr_stdout,148                          retval.cr_stderr)149            return -1150    file_options = ""151    for disk_index in range(disk_number):152        file_options += (" --file %s/%s_%d.img" %153                         (image_dir, hostname, disk_index))154        command = ("rm -f %s/%s_%d.img" %155                   (image_dir, hostname, disk_index))156        retval = server_host.sh_run(command)157        if retval.cr_exit_status:158            logging.error("failed to run command [%s] on host [%s], "159                          "ret = [%d], stdout = [%s], stderr = [%s]",160                          command,161                          server_host.sh_hostname,162                          retval.cr_exit_status,163                          retval.cr_stdout,164                          retval.cr_stderr)165            return -1166    command = ("virt-clone --original %s --name %s%s" %167               (template_hostname, hostname, file_options))168    retval = server_host.sh_run(command)169    if retval.cr_exit_status:170        logging.error("failed to run command [%s] on host [%s], "171                      "ret = [%d], stdout = [%s], stderr = [%s]",172                      command,173                      server_host.sh_hostname,174                      retval.cr_exit_status,175                      retval.cr_stdout,176                      retval.cr_stderr)177        return -1178    local_host_dir = workspace + "/" + hostname179    os.mkdir(local_host_dir)180    # net.ifnames=0 biosdevname=0 has been added to grub, so the interface181    # name will always be eth*182    eth_number = 0183    for eth_ip in ips:184        network_config = network_configs[eth_number]185        ifcfg = 'DEVICE="eth%d"\n' % eth_number186        ifcfg += 'IPADDR="%s"\n' % eth_ip187        ifcfg += 'NETMASK="%s"\n' % network_config["netmask"]188        if "gateway" in network_config:189            ifcfg += 'GATEWAY=\"%s"\n' % network_config["gateway"]190        ifcfg += """ONBOOT=yes191BOOTPROTO="static"192TYPE=Ethernet193IPV6INIT=no194NM_CONTROLLED=no195"""196        ifcfg_fname = "ifcfg-eth%d" % eth_number197        ifcfg_fpath = local_host_dir + "/" + ifcfg_fname198        with open(ifcfg_fpath, "wt") as fout:199            fout.write(ifcfg)200        host_ifcfg_fpath = workspace + "/" + ifcfg_fname201        ret = server_host.sh_send_file(ifcfg_fpath, workspace)202        if ret:203            logging.error("failed to send file [%s] on local host to "204                          "directory [%s] on host [%s]",205                          ifcfg_fpath, workspace,206                          server_host.sh_hostname)207            return -1208        ret = server_host.sh_run("which virt-copy-in")209        if ret.cr_exit_status != 0:210            command = ("yum install libguestfs-tools-c -y")211            retval = server_host.sh_run(command)212            if retval.cr_exit_status:213                logging.error("failed to run command [%s] on host [%s], "214                              "ret = [%d], stdout = [%s], stderr = [%s]",215                              command,216                              server_host.sh_hostname,217                              retval.cr_exit_status,218                              retval.cr_stdout,219                              retval.cr_stderr)220                return -1221        command = ("virt-copy-in -d %s %s "222                   "/etc/sysconfig/network-scripts" % (hostname, host_ifcfg_fpath))223        retval = server_host.sh_run(command)224        if retval.cr_exit_status:225            logging.error("failed to run command [%s] on host [%s], "226                          "ret = [%d], stdout = [%s], stderr = [%s]",227                          command,228                          server_host.sh_hostname,229                          retval.cr_exit_status,230                          retval.cr_stdout,231                          retval.cr_stderr)232            return -1233        eth_number += 1234    host_rules_fpath = workspace + "/70-persistent-net.rules"235    command = ("> %s" % host_rules_fpath)236    retval = server_host.sh_run(command)237    if retval.cr_exit_status:238        logging.error("failed to run command [%s] on host [%s], "239                      "ret = [%d], stdout = [%s], stderr = [%s]",240                      command,241                      server_host.sh_hostname,242                      retval.cr_exit_status,243                      retval.cr_stdout,244                      retval.cr_stderr)245        return -1246    command = ("virt-copy-in -d %s %s "247               "/etc/udev/rules.d" % (hostname, host_rules_fpath))248    retval = server_host.sh_run(command)249    if retval.cr_exit_status:250        logging.error("failed to run command [%s] on host [%s], "251                      "ret = [%d], stdout = [%s], stderr = [%s]",252                      command,253                      server_host.sh_hostname,254                      retval.cr_exit_status,255                      retval.cr_stdout,256                      retval.cr_stderr)257        return -1258    if distro == ssh_host.DISTRO_RHEL6:259        network_string = 'NETWORKING=yes\n'260        network_string += 'HOSTNAME=%s\n' % hostname261        network_fname = "network"262        network_fpath = local_host_dir + "/" + network_fname263        with open(network_fpath, "wt") as fout:264            fout.write(network_string)265        host_network_fpath = workspace + "/" + network_fname266        ret = server_host.sh_send_file(network_fpath, workspace)267        if ret:268            logging.error("failed to send file [%s] on local host to "269                          "directory [%s] on host [%s]",270                          network_fpath, workspace,271                          server_host.sh_hostname)272            return -1273        command = ("virt-copy-in -d %s %s "274                   "/etc/sysconfig" % (hostname, host_network_fpath))275        retval = server_host.sh_run(command)276        if retval.cr_exit_status:277            logging.error("failed to run command [%s] on host [%s], "278                          "ret = [%d], stdout = [%s], stderr = [%s]",279                          command,280                          server_host.sh_hostname,281                          retval.cr_exit_status,282                          retval.cr_stdout,283                          retval.cr_stderr)284            return -1285    else:286        host_hostname_fpath = workspace + "/hostname"287        command = ("echo %s > %s" % (hostname, host_hostname_fpath))288        retval = server_host.sh_run(command)289        if retval.cr_exit_status:290            logging.error("failed to run command [%s] on host [%s], "291                          "ret = [%d], stdout = [%s], stderr = [%s]",292                          command,293                          server_host.sh_hostname,294                          retval.cr_exit_status,295                          retval.cr_stdout,296                          retval.cr_stderr)297            return -1298        command = ("virt-copy-in -d %s %s "299                   "/etc" % (hostname, host_hostname_fpath))300        retval = server_host.sh_run(command)301        if retval.cr_exit_status:302            logging.error("failed to run command [%s] on host [%s], "303                          "ret = [%d], stdout = [%s], stderr = [%s]",304                          command,305                          server_host.sh_hostname,306                          retval.cr_exit_status,307                          retval.cr_stdout,308                          retval.cr_stderr)309            return -1310    command = ("virsh start %s" % hostname)311    retval = server_host.sh_run(command)312    if retval.cr_exit_status:313        logging.error("failed to run command [%s] on host [%s], "314                      "ret = [%d], stdout = [%s], stderr = [%s]",315                      command,316                      server_host.sh_hostname,317                      retval.cr_exit_status,318                      retval.cr_stdout,319                      retval.cr_stderr)320        return -1321    # Remove the record in known_hosts, otherwise ssh will fail322    command = ('sed -i "/%s /d" /root/.ssh/known_hosts' % (host_ip))323    retval = server_host.sh_run(command)324    if retval.cr_exit_status:325        logging.error("failed to run command [%s] on host [%s], "326                      "ret = [%d], stdout = [%s], stderr = [%s]",327                      command,328                      server_host.sh_hostname,329                      retval.cr_exit_status,330                      retval.cr_stdout,331                      retval.cr_stderr)332        return -1333    # Remove the record in known_hosts, otherwise ssh will fail334    command = ('sed -i "/%s /d" /root/.ssh/known_hosts' % (hostname))335    retval = server_host.sh_run(command)336    if retval.cr_exit_status:337        logging.error("failed to run command [%s] on host [%s], "338                      "ret = [%d], stdout = [%s], stderr = [%s]",339                      command,340                      server_host.sh_hostname,341                      retval.cr_exit_status,342                      retval.cr_stdout,343                      retval.cr_stderr)344        return -1345    vm_host = ssh_host.SSHHost(host_ip)346    ret = vm_host.sh_wait_up()347    if ret:348        logging.error("failed to wait host [%s] up",349                      host_ip)350        return -1351    ret = vm_check(hostname, host_ip, distro, internet)352    if ret:353        return -1354    return 0355def vm_check(hostname, host_ip, distro, internet):356    """357    Check whether virtual machine is up and fine358    """359    # pylint: disable=too-many-return-statements360    vm_host = ssh_host.SSHHost(host_ip)361    command = "hostname"362    retval = vm_host.sh_run(command)363    if retval.cr_exit_status:364        logging.error("failed to run command [%s] on host [%s], "365                      "ret = [%d], stdout = [%s], stderr = [%s]",366                      command,367                      host_ip,368                      retval.cr_exit_status,369                      retval.cr_stdout,370                      retval.cr_stderr)371        return -1372    current_hostname = retval.cr_stdout.strip()373    if current_hostname != hostname:374        logging.error("wrong host name of the virtual machine [%s], expected "375                      "[%s], got [%s]", host_ip, hostname, current_hostname)376        return -1377    vm_host = ssh_host.SSHHost(hostname)378    command = "hostname"379    retval = vm_host.sh_run(command)380    if retval.cr_exit_status:381        logging.error("failed to run command [%s] on host [%s], "382                      "ret = [%d], stdout = [%s], stderr = [%s]",383                      command,384                      hostname,385                      retval.cr_exit_status,386                      retval.cr_stdout,387                      retval.cr_stderr)388        return -1389    current_hostname = retval.cr_stdout.strip()390    if current_hostname != hostname:391        logging.error("wrong host name of the virtual machine [%s], expected "392                      "[%s], got [%s]", hostname, hostname, current_hostname)393        return -1394    if vm_host.sh_distro() != distro:395        logging.error("wrong distro of the virtual machine [%s], expected "396                      "[%s], got [%s]", hostname, distro, vm_host.sh_distro())397        return -1398    if internet:399        if vm_host.sh_check_internet():400            logging.error("virtual machine [%s] can not access Internet",401                          hostname)402            return -1403    return 0404def vm_start(workspace, server_host, hostname, network_configs, ips,405             template_hostname, image_dir, distro, internet, disk_number):406    """407    Start virtual machine, if vm is bad, clone it408    """409    # pylint: disable=too-many-arguments410    host_ip = ips[0]411    ret = vm_check(hostname, host_ip, distro, internet)412    if ret == 0:413        return 0414    if vm_is_shut_off(server_host, hostname):415        command = ("virsh start %s" % (hostname))416        retval = server_host.sh_run(command)417        if retval.cr_exit_status:418            logging.error("failed to run command [%s] on host [%s], "419                          "ret = [%d], stdout = [%s], stderr = [%s]",420                          command,421                          server_host.sh_hostname,422                          retval.cr_exit_status,423                          retval.cr_stdout,424                          retval.cr_stderr)425            return -1426    vm_host = ssh_host.SSHHost(hostname)427    ret = vm_host.sh_wait_up()428    if ret == 0:429        ret = vm_check(hostname, host_ip, distro, internet)430        if ret == 0:431            return 0432    ret = vm_clone(workspace, server_host, hostname, network_configs, ips,433                   template_hostname, image_dir, distro, internet, disk_number)434    if ret:435        logging.error("failed to create virtual machine [%s] based on "436                      "template [%s]", hostname, template_hostname)437        return -1438    return 0439def vm_install(workspace, server_host, iso_path, hostname,440               internet, network_configs, image_dir, distro,441               ram_size, disk_sizes):442    """443    Install virtual machine from ISO444    """445    # pylint: disable=too-many-arguments,too-many-locals446    # pylint: disable=too-many-return-statements,too-many-statements447    # pylint: disable=too-many-branches448    ret = vm_delete(server_host, hostname)449    if ret:450        return -1451    network_config = network_configs[0]452    host_ip = network_config["ip"]453    command = ("ping -c 1 %s" % host_ip)454    retval = server_host.sh_run(command)455    if retval.cr_exit_status == 0:456        logging.error("IP [%s] is already used by a host", host_ip)457        return -1458    command = ("ping -c 1 %s" % hostname)459    retval = server_host.sh_run(command)460    if retval.cr_exit_status == 0:461        logging.error("host [%s] is already up", hostname)462        return -1463    mnt_path = "/mnt/" + utils.random_word(8)464    command = ("mkdir -p %s && mount -o loop %s %s" %465               (mnt_path, iso_path, mnt_path))466    retval = server_host.sh_run(command)467    if retval.cr_exit_status:468        logging.error("failed to run command [%s] on host [%s], "469                      "ret = [%d], stdout = [%s], stderr = [%s]",470                      command,471                      server_host.sh_hostname,472                      retval.cr_exit_status,473                      retval.cr_stdout,474                      retval.cr_stderr)475        return -1476    ks_config = """# Kickstart file automatically generated by ESMON.477install478reboot479cdrom480lang en_US.UTF-8481keyboard us482"""483    ks_config += """rootpw password484firewall --disabled485authconfig --enableshadow --passalgo=sha512486selinux --disabled487timezone --utc Asia/Shanghai488bootloader --location=mbr --driveorder=sda --append="crashkernel=auto net.ifnames=0 biosdevname=0"489zerombr490clearpart --all --initlabel491part / --fstype=ext4 --grow --size=500 --ondisk=sda --asprimary492repo --name="Media" --baseurl=file:///mnt/source --cost=100493%packages494@Core495%end496%post --log=/var/log/anaconda/post-install.log497#!/bin/bash498# Configure hostname, somehow virt-install --name doesn't work499"""500    if distro == ssh_host.DISTRO_RHEL6:501        ks_config += 'echo NETWORKING=yes > /etc/sysconfig/network\n'502        ks_config += ('echo HOSTNAME=%s >> /etc/sysconfig/network\n' %503                      (hostname))504    elif distro == ssh_host.DISTRO_RHEL7:505        ks_config += "echo %s > /etc/hostname\n" % (hostname)506    else:507        logging.error("wrong distro [%s]", distro)508        return -1509    ks_config += "# Configure network\n"510    eth_number = 0511    ens_number = 3512    for network_config in network_configs:513        # net.ifnames=0 biosdevname=0 will be added to GRUB_CMDLINE_LINUX, so the514        # interface name will always be eth*515        ks_config += "# Network eth%d\n" % eth_number516        ks_config += ("rm -f /etc/sysconfig/network-scripts/ifcfg-ens%d\n" %517                      ens_number)518        ks_config += ("cat << EOF > /etc/sysconfig/network-scripts/ifcfg-eth%d\n" %519                      eth_number)520        ks_config += "DEVICE=eth%d\n" % eth_number521        ks_config += 'IPADDR="%s"\n' % network_config["ip"]522        ks_config += 'NETMASK="%s"\n' % network_config["netmask"]523        if "gateway" in network_config:524            ks_config += 'GATEWAY=\"%s"\n' % network_config["gateway"]525        ks_config += """ONBOOT=yes526BOOTPROTO="static"527TYPE=Ethernet528IPV6INIT=no529NM_CONTROLLED=no530EOF531"""532        eth_number += 1533        ens_number += 1534    ks_config += "%end\n"535    local_host_dir = workspace + "/" + hostname536    os.mkdir(local_host_dir)537    ks_fname = "%s.ks" % hostname538    ks_fpath = local_host_dir + "/" + ks_fname539    with open(ks_fpath, "wt") as fout:540        fout.write(ks_config)541    host_ks_fpath = workspace + "/" + ks_fname542    ret = server_host.sh_send_file(ks_fpath, workspace)543    if ret:544        logging.error("failed to send file [%s] on local host to "545                      "directory [%s] on host [%s]",546                      ks_fpath, workspace,547                      server_host.sh_hostname)548        return -1549    command = ("virt-install --vcpus=1 --os-type=linux "550               "--hvm --connect=qemu:///system "551               "--accelerate --serial pty -v --nographics --noautoconsole --wait=-1 ")552    command += "--ram=%s " % ram_size553    for network_config in network_configs:554        command += ("--network=%s " % (network_config["virt_install_option"]))555    command += ("--name=%s " % (hostname))556    command += ("--initrd-inject=%s " % (host_ks_fpath))557    disk_index = 0558    for disk_size in disk_sizes:559        command += ("--disk path=%s/%s_%d.img,size=%s " %560                    (image_dir, hostname, disk_index, disk_size))561        disk_index += 1562    command += ("--location %s " % (mnt_path))563    command += ("--disk=%s,device=cdrom,perms=ro " % (iso_path))564    command += ("--extra-args='console=tty0 console=ttyS0,115200n8 "565                "ks=file:/%s'" % (ks_fname))566    if distro == ssh_host.DISTRO_RHEL6:567        install_timeout = 300568    elif distro == ssh_host.DISTRO_RHEL7:569        install_timeout = 1200570    retval = server_host.sh_run(command, timeout=install_timeout)571    if retval.cr_exit_status:572        logging.error("failed to run command [%s] on host [%s], "573                      "ret = [%d], stdout = [%s], stderr = [%s]",574                      command,575                      server_host.sh_hostname,576                      retval.cr_exit_status,577                      retval.cr_stdout,578                      retval.cr_stderr)579        return -1580    ret = server_host.sh_run("which sshpass")581    if ret.cr_exit_status != 0:582        # sshpass rely on epel-release on centos6583        command = ("yum install epel-release -y")584        retval = server_host.sh_run(command)585        if retval.cr_exit_status:586            logging.error("failed to run command [%s] on host [%s], "587                          "ret = [%d], stdout = [%s], stderr = [%s]",588                          command,589                          server_host.sh_hostname,590                          retval.cr_exit_status,591                          retval.cr_stdout,592                          retval.cr_stderr)593            return -1594        command = ("yum install sshpass -y")595        retval = server_host.sh_run(command)596        if retval.cr_exit_status:597            logging.error("failed to run command [%s] on host [%s], "598                          "ret = [%d], stdout = [%s], stderr = [%s]",599                          command,600                          server_host.sh_hostname,601                          retval.cr_exit_status,602                          retval.cr_stdout,603                          retval.cr_stderr)604            return -1605    # Remove the record in known_hosts, otherwise ssh will fail606    command = ('sed -i "/%s /d" /root/.ssh/known_hosts' % (host_ip))607    retval = server_host.sh_run(command)608    if retval.cr_exit_status:609        logging.error("failed to run command [%s] on host [%s], "610                      "ret = [%d], stdout = [%s], stderr = [%s]",611                      command,612                      server_host.sh_hostname,613                      retval.cr_exit_status,614                      retval.cr_stdout,615                      retval.cr_stderr)616        return -1617    # When virt-install finished, the virtual machine starts to reboot618    # so wait a little bit here until the host is up. Need619    # StrictHostKeyChecking=no, otherwise exit code will be 6 (ENOENT)620    expect_stdout = hostname + "\n"621    command = ("sshpass -p password ssh -o StrictHostKeyChecking=no "622               "root@%s hostname" % (host_ip))623    ret = server_host.sh_wait_update(command, expect_exit_status=0,624                                     expect_stdout=expect_stdout)625    if ret:626        logging.error("failed to wait host [%s] up", hostname)627        return -1628    command = ("sshpass -p password ssh root@%s "629               "\"mkdir /root/.ssh && chmod 600 /root/.ssh\"" % (host_ip))630    retval = server_host.sh_run(command)631    if retval.cr_exit_status:632        logging.error("failed to run command [%s] on host [%s], "633                      "ret = [%d], stdout = [%s], stderr = [%s]",634                      command,635                      server_host.sh_hostname,636                      retval.cr_exit_status,637                      retval.cr_stdout,638                      retval.cr_stderr)639        return -1640    command = ("sshpass -p password scp /root/.ssh/* root@%s:/root/.ssh" % (host_ip))641    retval = server_host.sh_run(command)642    if retval.cr_exit_status:643        logging.error("failed to run command [%s] on host [%s], "644                      "ret = [%d], stdout = [%s], stderr = [%s]",645                      command,646                      server_host.sh_hostname,647                      retval.cr_exit_status,648                      retval.cr_stdout,649                      retval.cr_stderr)650        return -1651    vm_host = ssh_host.SSHHost(host_ip)652    command = "> /root/.ssh/known_hosts"653    retval = vm_host.sh_run(command)654    if retval.cr_exit_status:655        logging.error("failed to run command [%s] on host [%s], "656                      "ret = [%d], stdout = [%s], stderr = [%s]",657                      command,658                      vm_host.sh_hostname,659                      retval.cr_exit_status,660                      retval.cr_stdout,661                      retval.cr_stderr)662        return -1663    command = "hostname"664    retval = vm_host.sh_run(command)665    if retval.cr_exit_status:666        logging.error("failed to run command [%s] on host [%s], "667                      "ret = [%d], stdout = [%s], stderr = [%s]",668                      command,669                      vm_host.sh_hostname,670                      retval.cr_exit_status,671                      retval.cr_stdout,672                      retval.cr_stderr)673        return -1674    real_hostname = retval.cr_stdout.strip()675    if real_hostname != hostname:676        logging.error("wrong hostname, expected [%s], got [%s]",677                      hostname, real_hostname)678        return -1679    if internet:680        ret = vm_host.sh_enable_dns()681        if ret:682            logging.error("failed to enable dns on host [%s]")683            return -1684        command = "yum install rsync -y"685        retval = vm_host.sh_run(command)686        if retval.cr_exit_status:687            logging.error("failed to run command [%s] on host [%s], "688                          "ret = [%d], stdout = [%s], stderr = [%s]",689                          command,690                          vm_host.sh_hostname,691                          retval.cr_exit_status,692                          retval.cr_stdout,693                          retval.cr_stderr)694            return -1695    # Do not check the return status, because the connection could be stopped696    command = "init 0"697    vm_host.sh_run(command)698    command = ("umount %s" % (mnt_path))699    retval = server_host.sh_run(command)700    if retval.cr_exit_status:701        logging.error("failed to run command [%s] on host [%s], "702                      "ret = [%d], stdout = [%s], stderr = [%s]",703                      command,704                      server_host.sh_hostname,705                      retval.cr_exit_status,706                      retval.cr_stdout,707                      retval.cr_stderr)708        ret = -1709    command = ("rmdir %s" % (mnt_path))710    retval = server_host.sh_run(command)711    if retval.cr_exit_status:712        logging.error("failed to run command [%s] on host [%s], "713                      "ret = [%d], stdout = [%s], stderr = [%s]",714                      command,715                      server_host.sh_hostname,716                      retval.cr_exit_status,717                      retval.cr_stdout,718                      retval.cr_stderr)719        return -1720    # Need to wait until VM shut off, otherwise "virsh change-media" won't721    # change the XML file722    ret = utils.wait_condition(vm_check_shut_off, [server_host, hostname])723    if ret:724        logging.error("failed when waiting host [%s] on [%s] shut off",725                      hostname, server_host.sh_hostname)726        return ret727    # Find the CDROM device728    command = ("virsh domblklist %s --details | grep cdrom | "729               "awk '{print $3}'" % (hostname))730    retval = server_host.sh_run(command)731    if retval.cr_exit_status:732        logging.error("failed to run command [%s] on host [%s], "733                      "ret = [%d], stdout = [%s], stderr = [%s]",734                      command,735                      server_host.sh_hostname,736                      retval.cr_exit_status,737                      retval.cr_stdout,738                      retval.cr_stderr)739        return -1740    cdroms = retval.cr_stdout.splitlines()741    if len(cdroms) != 1:742        logging.error("unexpected cdroms: [%s]",743                      retval.cr_stdout)744        return -1745    cdrom = cdroms[0]746    command = ("virsh change-media %s %s --eject" % (hostname, cdrom))747    retval = server_host.sh_run(command)748    if retval.cr_exit_status:749        logging.error("failed to run command [%s] on host [%s], "750                      "ret = [%d], stdout = [%s], stderr = [%s]",751                      command,752                      server_host.sh_hostname,753                      retval.cr_exit_status,754                      retval.cr_stdout,755                      retval.cr_stderr)756        return -1757    return 0758def esmon_vm_install(workspace, config, config_fpath):759    """760    Start to test with ESMON761    """762    # pylint: disable=too-many-return-statements,too-many-locals763    # pylint: disable=too-many-branches,too-many-statements764    ssh_host_configs = esmon_common.config_value(config, esmon_common.CSTR_SSH_HOSTS)765    if ssh_host_configs is None:766        logging.error("can NOT find [%s] in the config file, "767                      "please correct file [%s]",768                      esmon_common.CSTR_SSH_HOSTS, config_fpath)769        return -1770    hosts = {}771    for host_config in ssh_host_configs:772        host_id = host_config[esmon_common.CSTR_HOST_ID]773        if host_id is None:774            logging.error("can NOT find [%s] in the config of a "775                          "SSH host, please correct file [%s]",776                          esmon_common.CSTR_HOST_ID, config_fpath)777            return -1778        hostname = esmon_common.config_value(host_config,779                                             esmon_common.CSTR_HOSTNAME)780        if hostname is None:781            logging.error("can NOT find [%s] in the config of SSH host "782                          "with ID [%s], please correct file [%s]",783                          esmon_common.CSTR_HOSTNAME, host_id, config_fpath)784            return -1785        local = esmon_common.config_value(host_config,786                                          esmon_common.CSTR_LOCAL_HOST)787        if local is None:788            logging.debug("can NOT find [%s] in the config of SSH host "789                          "with ID [%s], use [false] as default value",790                          esmon_common.CSTR_LOCAL_HOST, host_id)791            local = False792        mapping_dict = {esmon_common.ESMON_CONFIG_CSTR_NONE: None}793        ssh_identity_file = esmon_common.config_value(host_config,794                                                      esmon_common.CSTR_SSH_IDENTITY_FILE,795                                                      mapping_dict=mapping_dict)796        if host_id in hosts:797            logging.error("multiple SSH hosts with the same ID [%s], please "798                          "correct file [%s]", host_id, config_fpath)799            return -1800        host = ssh_host.SSHHost(hostname, ssh_identity_file, local=local)801        hosts[host_id] = host802    template_configs = esmon_common.config_value(config, esmon_common.CSTR_TEMPLATES)803    if template_configs is None:804        logging.error("can NOT find [%s] in the config file, "805                      "please correct file [%s]",806                      esmon_common.CSTR_TEMPLATES, config_fpath)807        return -1808    templates = {}809    for template_config in template_configs:810        template_hostname = esmon_common.config_value(template_config,811                                                      esmon_common.CSTR_HOSTNAME)812        if template_hostname is None:813            logging.error("can NOT find [%s] in the config of a "814                          "SSH host, please correct file [%s]",815                          esmon_common.CSTR_HOSTNAME, config_fpath)816            return -1817        reinstall = esmon_common.config_value(template_config,818                                              esmon_common.CSTR_REINSTALL)819        if reinstall is None:820            logging.error("no [%s] is configured, please correct file [%s]",821                          esmon_common.CSTR_REINSTALL, config_fpath)822            return -1823        internet = esmon_common.config_value(template_config,824                                             esmon_common.CSTR_INTERNET)825        if internet is None:826            internet = False827            logging.debug("no [%s] is configured, will "828                          "not add internet support", esmon_common.CSTR_INTERNET)829        ram_size = esmon_common.config_value(template_config, esmon_common.CSTR_RAM_SIZE)830        if ram_size is None:831            logging.error("no [%s] is configured, please correct file [%s]",832                          esmon_common.CSTR_RAM_SIZE, config_fpath)833            return -1834        disk_sizes = esmon_common.config_value(template_config,835                                               esmon_common.CSTR_DISK_SIZES)836        if disk_sizes is None:837            logging.error("no [%s] is configured, please correct file [%s]",838                          esmon_common.CSTR_DISK_SIZES, config_fpath)839            return -1840        network_configs = esmon_common.config_value(template_config,841                                                    esmon_common.CSTR_NETWORK_CONFIGS)842        if network_configs is None:843            logging.error("no [%s] is configured, please correct file [%s]",844                          esmon_common.CSTR_NETWORK_CONFIGS, config_fpath)845            return -1846        iso = esmon_common.config_value(template_config, esmon_common.CSTR_ISO)847        if iso is None:848            logging.error("no [%s] is configured, please correct file [%s]",849                          esmon_common.CSTR_ISO, config_fpath)850            return -1851        distro = esmon_common.config_value(template_config, esmon_common.CSTR_DISTRO)852        if distro is None:853            logging.error("no [%s] is configured, please correct file [%s]",854                          esmon_common.CSTR_DISTRO, config_fpath)855            return -1856        image_dir = esmon_common.config_value(template_config, esmon_common.CSTR_IMAGE_DIR)857        if image_dir is None:858            logging.error("no [%s] is configured, please correct file [%s]",859                          esmon_common.CSTR_IMAGE_DIR, config_fpath)860            return -1861        server_host_id = esmon_common.config_value(template_config,862                                                   esmon_common.CSTR_SERVER_HOST_ID)863        if server_host_id is None:864            logging.error("no [%s] is configured, please correct file [%s]",865                          esmon_common.CSTR_SERVER_HOST_ID, config_fpath)866            return -1867        if server_host_id not in hosts:868            logging.error("SSH host with ID [%s] is NOT configured in "869                          "[%s], please correct file [%s]",870                          server_host_id, esmon_common.CSTR_SSH_HOSTS,871                          config_fpath)872            return -1873        server_host = hosts[server_host_id]874        command = "mkdir -p %s" % workspace875        retval = server_host.sh_run(command)876        if retval.cr_exit_status:877            logging.error("failed to run command [%s] on host [%s], "878                          "ret = [%d], stdout = [%s], stderr = [%s]",879                          command,880                          server_host.sh_hostname,881                          retval.cr_exit_status,882                          retval.cr_stdout,883                          retval.cr_stderr)884            return -1885        template = VirtTemplate(server_host, iso, template_hostname, internet,886                                network_configs, image_dir, distro, ram_size,887                                disk_sizes)888        templates[template_hostname] = template889        state = server_host.sh_virsh_dominfo_state(template_hostname)890        if not reinstall and state is not None:891            logging.debug("skipping reinstall of template [%s] according to config",892                          template_hostname)893            continue894        ret = vm_install(workspace, server_host, iso,895                         template_hostname, internet,896                         network_configs, image_dir,897                         distro, ram_size, disk_sizes)898        if ret:899            logging.error("failed to create virtual machine template [%s]",900                          template_hostname)901            return -1902    vm_host_configs = esmon_common.config_value(config, "vm_hosts")903    if vm_host_configs is None:904        logging.error("no [vm_hosts] is configured, "905                      "please correct file [%s]", config_fpath)906        return -1907    vm_hosts = []908    hosts_string = """127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4909::1         localhost localhost.localdomain localhost6 localhost6.localdomain6910"""911    for vm_host_config in vm_host_configs:912        hostname = esmon_common.config_value(vm_host_config, esmon_common.CSTR_HOSTNAME)913        if hostname is None:914            logging.error("no [hostname] is configured for a vm_host, "915                          "please correct file [%s]", config_fpath)916            return -1917        ips = esmon_common.config_value(vm_host_config, esmon_common.CSTR_HOST_IPS)918        if ips is None:919            logging.error("no [%s] is configured for a vm_host, "920                          "please correct file [%s]", esmon_common.CSTR_HOST_IPS,921                          config_fpath)922            return -1923        template_hostname = esmon_common.config_value(vm_host_config,924                                                      esmon_common.CSTR_TEMPLATE_HOSTNAME)925        if template_hostname is None:926            logging.error("can NOT find [%s] in the config of a "927                          "SSH host, please correct file [%s]",928                          esmon_common.CSTR_TEMPLATE_HOSTNAME, config_fpath)929            return -1930        if template_hostname not in templates:931            logging.error("template with hostname [%s] is NOT configured in "932                          "[%s], please correct file [%s]",933                          template_hostname, esmon_common.CSTR_TEMPLATES, config_fpath)934            return -1935        template = templates[template_hostname]936        reinstall = esmon_common.config_value(vm_host_config, "reinstall")937        state = template.vt_server_host.sh_virsh_dominfo_state(hostname)938        if reinstall is None:939            reinstall = False940        if state is None:941            reinstall = True942        if not reinstall:943            ret = vm_start(workspace,944                           template.vt_server_host,945                           hostname,946                           template.vt_network_configs,947                           ips,948                           template.vt_template_hostname,949                           template.vt_image_dir,950                           template.vt_distro,951                           template.vt_internet,952                           len(template.vt_disk_sizes))953            if ret:954                logging.error("virtual machine [%s] can't be started",955                              hostname)956                return -1957        else:958            ret = vm_clone(workspace,959                           template.vt_server_host,960                           hostname,961                           template.vt_network_configs,962                           ips,963                           template.vt_template_hostname,964                           template.vt_image_dir,965                           template.vt_distro,966                           template.vt_internet,967                           len(template.vt_disk_sizes))968            if ret:969                logging.error("failed to create virtual machine [%s] based on "970                              "template [%s]", hostname,971                              template.vt_template_hostname)972                return -1973        host_ip = ips[0]974        vm_host = ssh_host.SSHHost(hostname)975        hosts_string += ("%s %s\n" % (host_ip, hostname))976        vm_hosts.append(vm_host)977    host_configs = esmon_common.config_value(config, esmon_common.CSTR_HOSTS)978    if host_configs is None:979        logging.error("can NOT find [%s] in the config file, "980                      "please correct file [%s]",981                      esmon_common.CSTR_HOSTS, config_fpath)982        return -1983    for host_config in host_configs:984        hostname = esmon_common.config_value(host_config, esmon_common.CSTR_HOSTNAME)985        if hostname is None:986            logging.error("can NOT find [%s] in the config file, "987                          "please correct file [%s]",988                          esmon_common.CSTR_HOSTNAME, config_fpath)989            return -1990        host_ip = esmon_common.config_value(host_config, esmon_common.CSTR_IP)991        if host_ip is None:992            logging.error("can NOT find [%s] in the config file, "993                          "please correct file [%s]",994                          esmon_common.CSTR_IP, config_fpath)995            return -1996        hosts_string += ("%s %s\n" % (host_ip, hostname))997    hosts_fpath = workspace + "/hosts"998    with open(hosts_fpath, "wt") as hosts_file:999        hosts_file.write(hosts_string)1000    for host in vm_hosts:1001        ret = host.sh_send_file(hosts_fpath, "/etc")1002        if ret:1003            logging.error("failed to send hosts file [%s] on local host to "1004                          "directory [%s] on host [%s]",1005                          hosts_fpath, workspace,1006                          host.sh_hostname)1007            return -11008        # Clear the known_hosts, otherwise the reinstalled hosts can't be1009        # accessed by other hosts1010        command = "> /root/.ssh/known_hosts"1011        retval = host.sh_run(command)1012        if retval.cr_exit_status:1013            logging.error("failed to run command [%s] on host [%s], "1014                          "ret = [%d], stdout = [%s], stderr = [%s]",1015                          command,1016                          host.sh_hostname,1017                          retval.cr_exit_status,1018                          retval.cr_stdout,1019                          retval.cr_stderr)1020            return -11021    return 01022def esmon_virt_locked(workspace, config_fpath):1023    """1024    Start to test holding the confiure lock1025    """1026    # pylint: disable=too-many-branches,bare-except,too-many-locals1027    # pylint: disable=too-many-statements1028    config_fd = open(config_fpath)1029    ret = 01030    try:1031        config = yaml.load(config_fd)1032    except:1033        logging.error("not able to load [%s] as yaml file: %s", config_fpath,1034                      traceback.format_exc())1035        ret = -11036    config_fd.close()1037    if ret:1038        return -11039    try:1040        ret = esmon_vm_install(workspace, config, config_fpath)1041    except:1042        ret = -11043        logging.error("exception: %s", traceback.format_exc())1044    return ret1045def esmon_virt(workspace, config_fpath):1046    """1047    Start to install virtual machines1048    """1049    # pylint: disable=bare-except1050    lock_file = config_fpath + ".lock"1051    lock = filelock.FileLock(lock_file)1052    try:1053        with lock.acquire(timeout=0):1054            try:1055                ret = esmon_virt_locked(workspace, config_fpath)1056            except:1057                ret = -11058                logging.error("exception: %s", traceback.format_exc())1059            lock.release()1060    except filelock.Timeout:1061        ret = -11062        logging.error("someone else is holding lock of file [%s], aborting "1063                      "to prevent conflicts", lock_file)1064    return ret1065def usage():1066    """1067    Print usage string1068    """1069    utils.eprint("Usage: %s <config_file>" %1070                 sys.argv[0])1071def main():1072    """1073    Install virtual machines1074    """1075    # pylint: disable=unused-variable1076    reload(sys)1077    sys.setdefaultencoding("utf-8")1078    config_fpath = ESMON_VIRT_CONFIG1079    if len(sys.argv) == 2:1080        config_fpath = sys.argv[1]1081    elif len(sys.argv) > 2:1082        usage()1083        sys.exit(-1)1084    identity = time_util.local_strftime(time_util.utcnow(), "%Y-%m-%d-%H_%M_%S")1085    workspace = ESMON_VIRT_LOG_DIR + "/" + identity1086    if not os.path.exists(ESMON_VIRT_LOG_DIR):1087        os.mkdir(ESMON_VIRT_LOG_DIR)1088    elif not os.path.isdir(ESMON_VIRT_LOG_DIR):1089        logging.error("[%s] is not a directory", ESMON_VIRT_LOG_DIR)1090        sys.exit(-1)1091    if not os.path.exists(workspace):1092        os.mkdir(workspace)1093    elif not os.path.isdir(workspace):1094        logging.error("[%s] is not a directory", workspace)1095        sys.exit(-1)1096    print("Started installing virtual machines using config [%s], "1097          "please check [%s] for more log" %1098          (config_fpath, workspace))1099    utils.configure_logging(workspace)1100    console_handler = utils.LOGGING_HANLDERS["console"]1101    console_handler.setLevel(logging.DEBUG)1102    save_fpath = workspace + "/" + ESMON_VIRT_CONFIG_FNAME1103    logging.debug("copying config file from [%s] to [%s]", config_fpath,1104                  save_fpath)1105    shutil.copyfile(config_fpath, save_fpath)1106    ret = esmon_virt(workspace, config_fpath)1107    if ret:1108        logging.error("installation failed, please check [%s] for more log\n",1109                      workspace)1110        sys.exit(ret)1111    logging.info("Installed the virtual machines, please check [%s] "1112                 "for more log", workspace)...service_request_body.py
Source:service_request_body.py  
...50        :type service_name: str51        """52        self._service_name = service_name53    @property54    def server_host(self):55        """Gets the server_host of this ServiceRequestBody.56        server_hostæ¯ç±ç¨æ·æä¾çååã æä»¬ä¼éè¿æ¤ååè¿è¡æ¥å£è°ç¨ï¼è¯·ä»¥https/httpå¼å¤´,é¿åº¦å°äºçäº128ä½å符ã TestHubå°ä¼éè¿æ¤ååä¸çæ¥å£ï¼ä¿è¯äºæµæ°æ®ä¸ç¨æ·ç³»ç»æ°æ®çä¸è´æ§ã57        :return: The server_host of this ServiceRequestBody.58        :rtype: str59        """60        return self._server_host61    @server_host.setter62    def server_host(self, server_host):63        """Sets the server_host of this ServiceRequestBody.64        server_hostæ¯ç±ç¨æ·æä¾çååã æä»¬ä¼éè¿æ¤ååè¿è¡æ¥å£è°ç¨ï¼è¯·ä»¥https/httpå¼å¤´,é¿åº¦å°äºçäº128ä½å符ã TestHubå°ä¼éè¿æ¤ååä¸çæ¥å£ï¼ä¿è¯äºæµæ°æ®ä¸ç¨æ·ç³»ç»æ°æ®çä¸è´æ§ã65        :param server_host: The server_host of this ServiceRequestBody.66        :type server_host: str67        """68        self._server_host = server_host69    def to_dict(self):70        """Returns the model properties as a dict"""71        result = {}72        for attr, _ in six.iteritems(self.openapi_types):73            value = getattr(self, attr)74            if isinstance(value, list):75                result[attr] = list(map(76                    lambda x: x.to_dict() if hasattr(x, "to_dict") else x,...vpn.py
Source:vpn.py  
1import os2class VPN:3    def __init__(self, server_host, remote_dir, local_dir):4        self.server_host = server_host5        self.remote_dir = remote_dir6        self.local_dir = local_dir7    def add_vpn_user(self, user_name):8        os.system(f'ssh {self.server_host} "sudo ikev2.sh --addclient {user_name}"')9    def copy_sert(self, user_name):10        os.system(f'ssh {self.server_host} "sudo ikev2.sh --addclient {user_name}"')11        os.system(f'ssh {self.server_host} "sudo ikev2.sh --exportclient {user_name}"')12        os.system(f'scp {self.server_host}:{self.remote_dir}/{user_name}.mobileconfig '13                  f'{self.local_dir}/{self.server_host}-{user_name}.mobileconfig')14        os.system(f'scp {self.server_host}:{self.remote_dir}/{user_name}.p12 '15                  f'{self.local_dir}/{self.server_host}-{user_name}.p12')16        os.system(f'scp {self.server_host}:{self.remote_dir}/{user_name}.sswan '17                  f'{self.local_dir}/{self.server_host}-{user_name}.sswan')18    def delete_sert_files(self, user_name):19        os.system(f'ssh {self.server_host} "rm {user_name}*"')20def main():21    pass22if __name__ == '__main__':...Learn to execute automation testing from scratch with LambdaTest Learning Hub. Right from setting up the prerequisites to run your first automation test, to following best practices and diving deeper into advanced test scenarios. LambdaTest Learning Hubs compile a list of step-by-step guides to help you be proficient with different test automation frameworks i.e. Selenium, Cypress, TestNG etc.
You could also refer to video tutorials over LambdaTest YouTube channel to get step by step demonstration from industry experts.
Get 100 minutes of automation test minutes FREE!!
