def nuke_one(ctx, targets, log, should_unlock, synch_clocks, reboot_all, check_locks, noipmi): from teuthology.lock import unlock ret = None ctx = argparse.Namespace( config=dict(targets=targets), owner=ctx.owner, check_locks=check_locks, synch_clocks=synch_clocks, reboot_all=reboot_all, teuthology_config=ctx.teuthology_config, name=ctx.name, noipmi=noipmi, ) try: nuke_helper(ctx, log) except Exception: log.exception('Could not nuke all targets in %s' % targets) # not re-raising the so that parallel calls aren't killed ret = targets else: if should_unlock: for target in targets.keys(): unlock(ctx, target, ctx.owner) return ret
def lock_machines(ctx, config): log.info('Locking machines...') assert isinstance(config, int), 'config must be an integer' while True: # make sure there are enough machines up machines = lock.list_locks(ctx) if machines is None: if ctx.block: log.warn('error listing machines, trying again') time.sleep(20) continue else: assert 0, 'error listing machines' num_up = len(filter(lambda machine: machine['up'], machines)) assert num_up >= config, 'not enough machines are up' # make sure there are machines for non-automated jobs to run num_free = len( filter(lambda machine: machine['up'] and machine['locked'] == 0, machines)) if num_free < 6 and ctx.owner.startswith('scheduled'): if ctx.block: log.info('waiting for more machines to be free...') time.sleep(10) continue else: assert 0, 'not enough machines free' newly_locked = lock.lock_many(ctx, config, ctx.owner) if len(newly_locked) == config: ctx.config['targets'] = newly_locked log.info('\n '.join([ 'Locked targets:', ] + yaml.safe_dump(ctx.config['targets'], default_flow_style=False).splitlines())) break elif not ctx.block: assert 0, 'not enough machines are available' log.warn('Could not lock enough machines, waiting...') time.sleep(10) try: yield finally: if ctx.summary.get('success', False): log.info('Unlocking machines...') for machine in ctx.config['targets'].iterkeys(): lock.unlock(ctx, machine, ctx.owner)
def lock_machines(ctx, config): log.info('Locking machines...') assert isinstance(config, int), 'config must be an integer' while True: # make sure there are enough machines up machines = lock.list_locks(ctx) if machines is None: if ctx.block: log.warn('error listing machines, trying again') time.sleep(20) continue else: assert 0, 'error listing machines' num_up = len(filter(lambda machine: machine['up'], machines)) assert num_up >= config, 'not enough machines are up' # make sure there are machines for non-automated jobs to run num_free = len(filter( lambda machine: machine['up'] and machine['locked'] == 0, machines )) if num_free < 6 and ctx.owner.startswith('scheduled'): if ctx.block: log.info('waiting for more machines to be free...') time.sleep(10) continue else: assert 0, 'not enough machines free' newly_locked = lock.lock_many(ctx, config, ctx.owner) if len(newly_locked) == config: ctx.config['targets'] = newly_locked log.info('\n '.join(['Locked targets:', ] + yaml.safe_dump(ctx.config['targets'], default_flow_style=False).splitlines())) break elif not ctx.block: assert 0, 'not enough machines are available' log.warn('Could not lock enough machines, waiting...') time.sleep(10) try: yield finally: if ctx.summary.get('success', False): log.info('Unlocking machines...') for machine in ctx.config['targets'].iterkeys(): lock.unlock(ctx, machine, ctx.owner)
def nuke(targets, owner, log, teuth_config, should_unlock, synch_clocks=True, reboot_all=True): from teuthology.nuke import nuke from teuthology.lock import unlock ctx = argparse.Namespace( config=dict(targets=targets), owner=owner, synch_clocks=synch_clocks, reboot_all=reboot_all, teuthology_config=teuth_config, ) try: nuke(ctx, log) except: log.exception('Could not nuke all targets in %s', targets) # not re-raising the so that parallel calls aren't killed else: if should_unlock: for target in targets.keys(): unlock(ctx, target, owner)
def lock_machines(ctx, config): log.info('Locking machines...') assert isinstance(config[0], int), 'config must be an integer' machine_type = config[1] config = config[0] while True: # make sure there are enough machines up machines = lock.list_locks(ctx) if machines is None: if ctx.block: log.warn('error listing machines, trying again') time.sleep(20) continue else: assert 0, 'error listing machines' num_up = len(filter(lambda machine: machine['up'] and machine['type'] == machine_type, machines)) assert num_up >= config, 'not enough machines are up' # make sure there are machines for non-automated jobs to run num_free = len(filter( lambda machine: machine['up'] and machine['locked'] == 0 and machine['type'] == machine_type, machines )) if num_free < 6 and ctx.owner.startswith('scheduled'): if ctx.block: log.info('waiting for more machines to be free...') time.sleep(10) continue else: assert 0, 'not enough machines free' newly_locked = lock.lock_many(ctx, config, machine_type, ctx.owner, ctx.archive) if len(newly_locked) == config: vmlist = [] for lmach in newly_locked: if lock.create_if_vm(ctx,lmach): vmlist.append(lmach) if vmlist: log.info('Waiting for virtual machines to come up') keyscan_out = '' while len(keyscan_out.splitlines()) != len(vmlist): time.sleep(10) keyscan_out, current_locks = lock.keyscan_check(ctx, vmlist) log.info('virtual machine is stil unavailable') if lock.update_keys(ctx, keyscan_out, current_locks): log.info("Error in virtual machine keys") newscandict = {} for dkey in newly_locked.iterkeys(): stats = lockstatus.get_status(ctx, dkey) newscandict[dkey] = stats['sshpubkey'] ctx.config['targets'] = newscandict else: ctx.config['targets'] = newly_locked log.info('\n '.join(['Locked targets:', ] + yaml.safe_dump(ctx.config['targets'], default_flow_style=False).splitlines())) break elif not ctx.block: assert 0, 'not enough machines are available' log.warn('Could not lock enough machines, waiting...') time.sleep(10) try: yield finally: if ctx.summary.get('success', False): log.info('Unlocking machines...') for machine in ctx.config['targets'].iterkeys(): lock.unlock(ctx, machine, ctx.owner)
def lock_machines(ctx, config): log.info('Locking machines...') assert isinstance(config[0], int), 'config must be an integer' machine_type = config[1] config = config[0] while True: # make sure there are enough machines up machines = lock.list_locks(ctx) if machines is None: if ctx.block: log.warn('error listing machines, trying again') time.sleep(20) continue else: assert 0, 'error listing machines' num_up = len( filter( lambda machine: machine['up'] and machine['type'] == machine_type, machines)) assert num_up >= config, 'not enough machines are up' # make sure there are machines for non-automated jobs to run num_free = len( filter( lambda machine: machine['up'] and machine['locked'] == 0 and machine['type'] == machine_type, machines)) if num_free < 6 and ctx.owner.startswith('scheduled'): if ctx.block: log.info('waiting for more machines to be free...') time.sleep(10) continue else: assert 0, 'not enough machines free' newly_locked = lock.lock_many(ctx, config, machine_type, ctx.owner, ctx.archive) if len(newly_locked) == config: vmlist = [] for lmach in newly_locked: if lock.create_if_vm(ctx, lmach): vmlist.append(lmach) if vmlist: log.info('Waiting for virtual machines to come up') keyscan_out = '' loopcount = 0 while len(keyscan_out.splitlines()) != len(vmlist): loopcount += 1 time.sleep(10) keyscan_out, current_locks = lock.keyscan_check( ctx, vmlist) log.info('virtual machine is stil unavailable') if loopcount == 40: loopcount = 0 log.info( 'virtual machine(s) still not up, recreating unresponsive ones.' ) for guest in vmlist: if guest not in keyscan_out: log.info('recreating: ' + guest) lock.destroy_if_vm(ctx, 'ubuntu@' + guest) lock.create_if_vm(ctx, 'ubuntu@' + guest) if lock.update_keys(ctx, keyscan_out, current_locks): log.info("Error in virtual machine keys") newscandict = {} for dkey in newly_locked.iterkeys(): stats = lockstatus.get_status(ctx, dkey) newscandict[dkey] = stats['sshpubkey'] ctx.config['targets'] = newscandict else: ctx.config['targets'] = newly_locked log.info('\n '.join([ 'Locked targets:', ] + yaml.safe_dump(ctx.config['targets'], default_flow_style=False).splitlines())) break elif not ctx.block: assert 0, 'not enough machines are available' log.warn('Could not lock enough machines, waiting...') time.sleep(10) try: yield finally: if ctx.summary.get('success', False): log.info('Unlocking machines...') for machine in ctx.config['targets'].iterkeys(): lock.unlock(ctx, machine, ctx.owner)