class_docstr: This is run on Buildkite runners.
class_docstr_tok: ["This","is","run","on","Buildkite","runners","."]
docstr: Wait for cluster nodes to be up.
  
  Args:
      num_nodes: Number of nodes to wait for.
      timeout: Timeout in seconds to wait for nodes before
       raising a ``PrepareCommandTimeoutError``.
  
  Returns:
      None
  
  Raises:
      PrepareCommandTimeoutError
docstr_tok: ["Wait","for","cluster","nodes","to","be","up",".","Args",":","num_nodes",":","Number","of","nodes","to","wait","for",".","timeout",":","Timeout","in","seconds","to","wait","for","nodes","before","raising","a","``","PrepareCommandTimeoutError","``",".","Returns",":","None","Raises",":","PrepareCommandTimeoutError"]
code: def wait_for_nodes(self, num_nodes: int, timeout: float = 900.0):
      """Wait for cluster nodes to be up.
  
      Args:
          num_nodes: Number of nodes to wait for.
          timeout: Timeout in seconds to wait for nodes before
           raising a ``PrepareCommandTimeoutError``.
  
      Returns:
          None
  
      Raises:
          PrepareCommandTimeoutError
      """
      raise NotImplementedError
  
imports: import abc
  from typing import Dict, Any, Optional, List
  from ray_release.cluster_manager.cluster_manager import ClusterManager
  from ray_release.file_manager.file_manager import FileManager
  from ray_release.reporter.artifacts import DEFAULT_ARTIFACTS_DIR
  from ray_release.util import exponential_backoff_retry
  from ray_release.logger import logger
  from click.exceptions import ClickException
label_desc: Use image node_id 6 for calling the CommandRunner obj's underlying member method code with example usage: obj.wait_for_nodes(num_nodes, timeout) without return types