'The multi-run engine used when the control file defines step_init.
Does the next step.'

def step_engine(self):

    global_control_vars = {'job': self, 'args': self.args}
    exec JOB_PREAMBLE in global_control_vars, global_control_vars
    try:
        execfile(self.control, global_control_vars, global_control_vars)
    except error.TestNAError as detail:
        self.record(detail.exit_status, None, self.control, str(detail))
    except SystemExit:
        raise
    except Exception as detail:
        raise error.UnhandledJobError(detail)
    if (not self._is_continuation):
        if ('step_init' in global_control_vars):
            self.next_step(global_control_vars['step_init'])
    else:
        last_job = self._state.get('client', 'unexpected_reboot', None)
        if last_job:
            (subdir, testname) = last_job
            self.record('FAIL', subdir, testname, 'unexpected    reboot')
            self.record('END    FAIL', subdir, testname)
    while (len(self._state.get('client', 'steps')) > 0):
        steps = self._state.get('client', 'steps')
        (ancestry, fn_name, args, dargs) = steps.pop(0)
        self._state.set('client', 'steps', steps)
        self._next_step_index = 0
        ret = self._create_frame(global_control_vars, ancestry, fn_name)
        (local_vars, self._current_step_ancestry) = ret
        local_vars = self._run_step_fn(local_vars, fn_name, args, dargs)
        self._add_step_init(local_vars, fn_name)
