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