From: Sam Lang Date: Wed, 13 Mar 2013 15:11:06 +0000 (-0500) Subject: task/thrashosds: Ipmi checking/setup in thrashosds X-Git-Tag: 1.1.0~2251^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=6be6f6c607706cbab9228bab13fef2e7a40797b2;p=teuthology.git task/thrashosds: Ipmi checking/setup in thrashosds We don't need to setup the ipmi console on runs that don't use powercycling, so delay setup of the RemoteConsole with ipmi to the thrashosd task and only then if the powercycle config is set. This avoids spurious test failures from flaky ipmi. Signed-off-by: Sam Lang --- diff --git a/teuthology/task/internal.py b/teuthology/task/internal.py index 7195e31cb..e10bfdc4f 100644 --- a/teuthology/task/internal.py +++ b/teuthology/task/internal.py @@ -152,29 +152,13 @@ def connect(ctx, config): from ..orchestra import cluster remotes = [] for t, key in ctx.config['targets'].iteritems(): - console = None - if 'ipmi_user' in ctx.teuthology_config: - host = t.split('@')[-1] - shortname = host.split('.')[0] - console = remote.RemoteConsole(name=host, - ipmiuser=ctx.teuthology_config['ipmi_user'], - ipmipass=ctx.teuthology_config['ipmi_password'], - ipmidomain=ctx.teuthology_config['ipmi_domain']) - cname = '{host}.{domain}'.format(host=shortname, domain=ctx.teuthology_config['ipmi_domain']) - log.debug('checking console status of %s' % cname) - if not console.check_status(): - log.info('Failed to get console status for %s, disabling console...' % cname) - console=None - else: - log.debug('console ready on %s' % cname) - log.debug('connecting to %s', t) remotes.append( remote.Remote(name=t, ssh=connection.connect(user_at_host=t, host_key=key, keep_alive=True), - console=console)) + console=None)) ctx.cluster = cluster.Cluster() if 'roles' in ctx.config: for rem, roles in zip(remotes, ctx.config['roles']): diff --git a/teuthology/task/thrashosds.py b/teuthology/task/thrashosds.py index 50628a3e6..f8b74a900 100644 --- a/teuthology/task/thrashosds.py +++ b/teuthology/task/thrashosds.py @@ -87,6 +87,37 @@ def task(ctx, config): config = {} assert isinstance(config, dict), \ 'thrashosds task only accepts a dict for configuration' + + if 'powercycle' in config: + + if 'ipmi_user' in ctx.teuthology_config: + for t, key in ctx.config['targets'].iteritems(): + host = t.split('@')[-1] + shortname = host.split('.')[0] + from ..orchestra import remote as oremote + console = oremote.RemoteConsole(name=host, + ipmiuser=ctx.teuthology_config['ipmi_user'], + ipmipass=ctx.teuthology_config['ipmi_password'], + ipmidomain=ctx.teuthology_config['ipmi_domain']) + cname = '{host}.{domain}'.format(host=shortname, domain=ctx.teuthology_config['ipmi_domain']) + log.debug('checking console status of %s' % cname) + if not console.check_status(): + log.info('Failed to get console status for %s, disabling console...' % cname) + console=None + else: + # find the remote for this console and add it + remotes = [r for r in ctx.cluster.remotes.keys() if r.name == t] + if len(remotes) != 1: + raise Exception('Too many (or too few) remotes found for target {t}'.format(t=t)) + remotes[0].console = console + log.debug('console ready on %s' % cname) + + # check that all osd remotes have a valid console + osds = ctx.cluster.only(teuthology.is_type('osd')) + for remote, _ in osds.remotes.iteritems(): + if not remote.console: + raise Exception('IPMI console required for powercycling, but not available on osd role: {r}'.format(r=remote.name)) + log.info('Beginning thrashosds...') first_mon = teuthology.get_first_mon(ctx, config) (mon,) = ctx.cluster.only(first_mon).remotes.iterkeys()