factory.py revision 635b06f6c016fd5e4e14e98c471e92b1f435ac46
1635b06f6c016fd5e4e14e98c471e92b1f435ac46jadmanskifrom autotest_lib.client.common_lib import utils, error
2635b06f6c016fd5e4e14e98c471e92b1f435ac46jadmanskifrom autotest_lib.server import utils as server_utils
3635b06f6c016fd5e4e14e98c471e92b1f435ac46jadmanskifrom autotest_lib.server.hosts import site_factory
4635b06f6c016fd5e4e14e98c471e92b1f435ac46jadmanskifrom autotest_lib.server.hosts import ssh_host, serial, netconsole, dmesg
5635b06f6c016fd5e4e14e98c471e92b1f435ac46jadmanski
6635b06f6c016fd5e4e14e98c471e92b1f435ac46jadmanski
7635b06f6c016fd5e4e14e98c471e92b1f435ac46jadmanskidef create_host(hostname, **args):
8635b06f6c016fd5e4e14e98c471e92b1f435ac46jadmanski    # by default assume we're using SSH support
9635b06f6c016fd5e4e14e98c471e92b1f435ac46jadmanski    classes = [ssh_host.SSHHost]
10635b06f6c016fd5e4e14e98c471e92b1f435ac46jadmanski
11635b06f6c016fd5e4e14e98c471e92b1f435ac46jadmanski    # use serial console support if it's available
12635b06f6c016fd5e4e14e98c471e92b1f435ac46jadmanski    conmux_args = {}
13635b06f6c016fd5e4e14e98c471e92b1f435ac46jadmanski    for key in ("conmux_server", "conmux_attach"):
14635b06f6c016fd5e4e14e98c471e92b1f435ac46jadmanski        if key in args:
15635b06f6c016fd5e4e14e98c471e92b1f435ac46jadmanski            conmux_args[key] = args[key]
16635b06f6c016fd5e4e14e98c471e92b1f435ac46jadmanski    if serial.SerialHost.host_is_supported(hostname, **conmux_args):
17635b06f6c016fd5e4e14e98c471e92b1f435ac46jadmanski        classes.append(serial.SerialHost)
18635b06f6c016fd5e4e14e98c471e92b1f435ac46jadmanski    else:
19635b06f6c016fd5e4e14e98c471e92b1f435ac46jadmanski        # no serial host available, try netconsole logging if available
20635b06f6c016fd5e4e14e98c471e92b1f435ac46jadmanski        def run_func(cmd):
21635b06f6c016fd5e4e14e98c471e92b1f435ac46jadmanski            base_cmd = ssh_host.SSHHost.ssh_base_command(connect_timeout=3)
22635b06f6c016fd5e4e14e98c471e92b1f435ac46jadmanski            full_cmd = '%s %s "%s"' % (base_cmd, hostname,
23635b06f6c016fd5e4e14e98c471e92b1f435ac46jadmanski                                       server_utils.sh_escape(cmd))
24635b06f6c016fd5e4e14e98c471e92b1f435ac46jadmanski            try:
25635b06f6c016fd5e4e14e98c471e92b1f435ac46jadmanski                utils.run(full_cmd)
26635b06f6c016fd5e4e14e98c471e92b1f435ac46jadmanski            except error.CmdError:
27635b06f6c016fd5e4e14e98c471e92b1f435ac46jadmanski                pass
28635b06f6c016fd5e4e14e98c471e92b1f435ac46jadmanski
29635b06f6c016fd5e4e14e98c471e92b1f435ac46jadmanski        if netconsole.NetconsoleHost.host_is_supported(run_func):
30635b06f6c016fd5e4e14e98c471e92b1f435ac46jadmanski            classes.append(netconsole.NetconsoleHost)
31635b06f6c016fd5e4e14e98c471e92b1f435ac46jadmanski        else:
32635b06f6c016fd5e4e14e98c471e92b1f435ac46jadmanski            # nothing available, fall back to direct dmesg logging
33635b06f6c016fd5e4e14e98c471e92b1f435ac46jadmanski            classes.append(dmesg.DmesgHost)
34635b06f6c016fd5e4e14e98c471e92b1f435ac46jadmanski
35635b06f6c016fd5e4e14e98c471e92b1f435ac46jadmanski    # do any site-specific processing of the classes list
36635b06f6c016fd5e4e14e98c471e92b1f435ac46jadmanski    site_factory.postprocess_classes(classes, hostname, **args)
37635b06f6c016fd5e4e14e98c471e92b1f435ac46jadmanski
38635b06f6c016fd5e4e14e98c471e92b1f435ac46jadmanski    # create a custom host class for this machine and return an instance of it
39635b06f6c016fd5e4e14e98c471e92b1f435ac46jadmanski    host_class = type("%s_host" % hostname, tuple(classes), {})
40635b06f6c016fd5e4e14e98c471e92b1f435ac46jadmanski    return host_class(hostname, **args)
41