factory.py revision ca7da37fd4346d8944ca2e94c5b629d00c0cd102
1635b06f6c016fd5e4e14e98c471e92b1f435ac46jadmanskifrom autotest_lib.client.common_lib import utils, error
2635b06f6c016fd5e4e14e98c471e92b1f435ac46jadmanskifrom autotest_lib.server import utils as server_utils
3ca7da37fd4346d8944ca2e94c5b629d00c0cd102jadmanskifrom autotest_lib.server.hosts import site_factory, abstract_ssh
4635b06f6c016fd5e4e14e98c471e92b1f435ac46jadmanskifrom autotest_lib.server.hosts import ssh_host, serial, netconsole, dmesg
5635b06f6c016fd5e4e14e98c471e92b1f435ac46jadmanski
6635b06f6c016fd5e4e14e98c471e92b1f435ac46jadmanski
754f90af69daac8a781678f0ccd42d6728d5d81d1jadmanskidef create_host(hostname, auto_monitor=True, **args):
8635b06f6c016fd5e4e14e98c471e92b1f435ac46jadmanski    # by default assume we're using SSH support
9635b06f6c016fd5e4e14e98c471e92b1f435ac46jadmanski    classes = [ssh_host.SSHHost]
10635b06f6c016fd5e4e14e98c471e92b1f435ac46jadmanski
1154f90af69daac8a781678f0ccd42d6728d5d81d1jadmanski    if auto_monitor:
1254f90af69daac8a781678f0ccd42d6728d5d81d1jadmanski        # use serial console support if it's available
1354f90af69daac8a781678f0ccd42d6728d5d81d1jadmanski        conmux_args = {}
1454f90af69daac8a781678f0ccd42d6728d5d81d1jadmanski        for key in ("conmux_server", "conmux_attach"):
1554f90af69daac8a781678f0ccd42d6728d5d81d1jadmanski            if key in args:
1654f90af69daac8a781678f0ccd42d6728d5d81d1jadmanski                conmux_args[key] = args[key]
1754f90af69daac8a781678f0ccd42d6728d5d81d1jadmanski        if serial.SerialHost.host_is_supported(hostname, **conmux_args):
1854f90af69daac8a781678f0ccd42d6728d5d81d1jadmanski            classes.append(serial.SerialHost)
19635b06f6c016fd5e4e14e98c471e92b1f435ac46jadmanski        else:
2054f90af69daac8a781678f0ccd42d6728d5d81d1jadmanski            # no serial host available, try netconsole logging if available
2154f90af69daac8a781678f0ccd42d6728d5d81d1jadmanski            def run_func(cmd):
22ca7da37fd4346d8944ca2e94c5b629d00c0cd102jadmanski                base_cmd = abstract_ssh.make_ssh_command(connect_timeout=3)
2354f90af69daac8a781678f0ccd42d6728d5d81d1jadmanski                full_cmd = '%s %s "%s"' % (base_cmd, hostname,
2454f90af69daac8a781678f0ccd42d6728d5d81d1jadmanski                                           server_utils.sh_escape(cmd))
2554f90af69daac8a781678f0ccd42d6728d5d81d1jadmanski                try:
2654f90af69daac8a781678f0ccd42d6728d5d81d1jadmanski                    utils.run(full_cmd)
2754f90af69daac8a781678f0ccd42d6728d5d81d1jadmanski                except error.CmdError:
2854f90af69daac8a781678f0ccd42d6728d5d81d1jadmanski                    pass
2954f90af69daac8a781678f0ccd42d6728d5d81d1jadmanski
3054f90af69daac8a781678f0ccd42d6728d5d81d1jadmanski            if netconsole.NetconsoleHost.host_is_supported(run_func):
3154f90af69daac8a781678f0ccd42d6728d5d81d1jadmanski                classes.append(netconsole.NetconsoleHost)
3254f90af69daac8a781678f0ccd42d6728d5d81d1jadmanski            else:
3354f90af69daac8a781678f0ccd42d6728d5d81d1jadmanski                # nothing available, fall back to direct dmesg logging
3454f90af69daac8a781678f0ccd42d6728d5d81d1jadmanski                classes.append(dmesg.DmesgHost)
35635b06f6c016fd5e4e14e98c471e92b1f435ac46jadmanski
36635b06f6c016fd5e4e14e98c471e92b1f435ac46jadmanski    # do any site-specific processing of the classes list
37ea90226c42c24de00839d2c68a04909b233e9a4fjadmanski    site_factory.postprocess_classes(classes, hostname,
38ea90226c42c24de00839d2c68a04909b233e9a4fjadmanski                                     auto_monitor=auto_monitor, **args)
39635b06f6c016fd5e4e14e98c471e92b1f435ac46jadmanski
40635b06f6c016fd5e4e14e98c471e92b1f435ac46jadmanski    # create a custom host class for this machine and return an instance of it
41635b06f6c016fd5e4e14e98c471e92b1f435ac46jadmanski    host_class = type("%s_host" % hostname, tuple(classes), {})
42635b06f6c016fd5e4e14e98c471e92b1f435ac46jadmanski    return host_class(hostname, **args)
43