class KubernetesClientTimeoutException extends KubernetesClientException {

  private static final String RESOURCE_FORMAT = "Timed out waiting for [%d] milliseconds for [%s] with name:[%s] in namespace [%s].";
  private static final String KNOWS_RESOURCES_FORMAT = "Timed out waiting for [%d] milliseconds for multiple resources. %s";

  private final List<HasMetadata> resourcesNotReady;

  public KubernetesClientTimeoutException(String kind, String name, String namespace, long amount, TimeUnit timeUnit) {
    super(String.format(RESOURCE_FORMAT, timeUnit.toMillis(amount), kind, name, namespace));
    this.resourcesNotReady = Collections.emptyList();
  }

  public KubernetesClientTimeoutException(HasMetadata resource, long amount, TimeUnit timeUnit) {
    super(String.format(RESOURCE_FORMAT, timeUnit.toMillis(amount), resource.getKind(), resource.getMetadata().getName(),
        resource.getMetadata().getNamespace()));
    this.resourcesNotReady = Collections.unmodifiableList(Arrays.asList(resource));
  }

  public KubernetesClientTimeoutException(Collection<HasMetadata> resourcesNotReady, long amount, TimeUnit timeUnit) {
    super(String.format(KNOWS_RESOURCES_FORMAT, timeUnit.toMillis(amount), notReadyToString(resourcesNotReady)));
    this.resourcesNotReady = Collections.unmodifiableList(new ArrayList<>(resourcesNotReady));
  }

  public List<HasMetadata> getResourcesNotReady() {
    return resourcesNotReady;
  }

  /**
   * Creates a string listing all the resources that are not ready.
   * 
   * @param resources The resources that are not ready.
   * @return
   */
  private static String notReadyToString(Iterable<HasMetadata> resources) {<FILL_FUNCTION_BODY>}
}

    StringBuilder sb = new StringBuilder();
    sb.append("Resources that are not ready: ");
    boolean first = true;
    for (HasMetadata r : resources) {
      if (first) {
        first = false;
      } else {
        sb.append(", ");
      }
      sb.append("[Kind:").append(r.getKind())
          .append(" Name:").append(r.getMetadata().getName())
          .append(" Namespace:").append(r.getMetadata().getNamespace())
          .append("]");
    }
    return sb.toString();
  
<methods>public void <init>(java.lang.String) ,public void <init>(java.lang.String, java.lang.Throwable) ,public void <init>(Status) ,public void <init>(java.lang.String, int, Status) ,public void <init>(java.lang.String, java.lang.Throwable, int, Status, io.fabric8.kubernetes.client.http.HttpRequest) ,public void <init>(java.lang.String, int, Status, java.lang.String, java.lang.String, java.lang.String, java.lang.String) ,public void <init>(java.lang.String, java.lang.Throwable, java.lang.String, java.lang.String, java.lang.String, java.lang.String) ,public io.fabric8.kubernetes.client.KubernetesClientException copyAsCause() ,public int getCode() ,public java.lang.String getFullResourceName() ,public java.lang.String getGroup() ,public java.lang.String getName() ,public java.lang.String getNamespace() ,public java.lang.String getResourcePlural() ,public Status getStatus() ,public java.lang.String getVersion() ,public static java.lang.RuntimeException launderThrowable(java.lang.Throwable) ,public static java.lang.RuntimeException launderThrowable(java.lang.String, java.lang.Throwable) ,public static java.lang.RuntimeException launderThrowable(io.fabric8.kubernetes.client.OperationInfo, java.lang.Throwable) ,public static java.lang.RuntimeException launderThrowable(io.fabric8.kubernetes.client.OperationInfo, Status, java.lang.Throwable) <variables>private final non-sealed int code,private final non-sealed io.fabric8.kubernetes.client.KubernetesClientException.RequestMetadata requestMetadata,private final non-sealed Status status