code: def run(self):
          
  
          stop_watcher = threading.Event()
          watcher = None
          if self.watch_func:
              watcher = threading.Thread(
                  target=self.watch_func,
                  args=(self.stack, stop_watcher)
              )
              watcher.start()
  
          try:
              while not self.done:
                  self._run_once()
          finally:
              if watcher:
                  stop_watcher.set()
                  watcher.join()
          return self.ok
docs: Runs this step until it has completed successfully, or been
          skipped.