Github user mccheah commented on a diff in the pull request:

    https://github.com/apache/spark/pull/22215#discussion_r214491177
  
    --- Diff: 
resource-managers/kubernetes/core/src/main/scala/org/apache/spark/deploy/k8s/KubernetesUtils.scala
 ---
    @@ -60,4 +64,81 @@ private[spark] object KubernetesUtils {
       }
     
       def parseMasterUrl(url: String): String = url.substring("k8s://".length)
    +
    +  def formatPairsBundle(pairs: Seq[(String, String)], indent: Int = 1) : 
String = {
    +    // Use more loggable format if value is null or empty
    +    val indentStr = "\t" * indent
    +    pairs.map {
    +      case (k, v) => s"\n$indentStr $k: 
${Option(v).filter(_.nonEmpty).getOrElse("N/A")}"
    +    }.mkString("")
    +  }
    +
    +  /**
    +   * Given a pod, output a human readable representation of its state
    +   *
    +   * @param pod Pod
    +   * @return Human readable pod state
    +   */
    +  def formatPodState(pod: Pod): String = {
    +    val details = Seq[(String, String)](
    +      // pod metadata
    +      ("pod name", pod.getMetadata.getName),
    +      ("namespace", pod.getMetadata.getNamespace),
    +      ("labels", pod.getMetadata.getLabels.asScala.mkString(", ")),
    +      ("pod uid", pod.getMetadata.getUid),
    +      ("creation time", formatTime(pod.getMetadata.getCreationTimestamp)),
    +
    +      // spec details
    +      ("service account name", pod.getSpec.getServiceAccountName),
    +      ("volumes", 
pod.getSpec.getVolumes.asScala.map(_.getName).mkString(", ")),
    +      ("node name", pod.getSpec.getNodeName),
    +
    +      // status
    +      ("start time", formatTime(pod.getStatus.getStartTime)),
    +      ("phase", pod.getStatus.getPhase),
    +      ("container status", containersDescription(pod, 2))
    +    )
    +
    +    formatPairsBundle(details)
    +  }
    +
    +  def containersDescription(p: Pod, indent: Int = 1): String = {
    +    p.getStatus.getContainerStatuses.asScala.map { status =>
    +      Seq(
    +        ("container name", status.getName),
    +        ("container image", status.getImage)) ++
    +        containerStatusDescription(status)
    +    }.map(p => formatPairsBundle(p, indent)).mkString("\n\n")
    +  }
    +
    +  def containerStatusDescription(containerStatus: ContainerStatus)
    +    : Seq[(String, String)] = {
    +    val state = containerStatus.getState
    +    Option(state.getRunning)
    --- End diff --
    
    This is a really cool use of partial functions - wonder if there's other 
places where we should be matching this way (of course doesn't have to be done 
here).


---

---------------------------------------------------------------------
To unsubscribe, e-mail: reviews-unsubscr...@spark.apache.org
For additional commands, e-mail: reviews-h...@spark.apache.org

Reply via email to