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