in discovery-kubernetes-api/src/main/scala/org/apache/pekko/discovery/kubernetes/KubernetesApiServiceDiscovery.scala [54:91]
private[kubernetes] def targets(
podList: PodList,
portName: Option[String],
podNamespace: String,
podDomain: String,
rawIp: Boolean,
containerName: Option[String]): Seq[ResolvedTarget] =
for {
item <- podList.items
if item.metadata.flatMap(_.deletionTimestamp).isEmpty
itemSpec <- item.spec.toSeq
itemStatus <- item.status.toSeq
if itemStatus.phase.contains("Running")
if containerName.forall(name =>
itemStatus.containerStatuses match {
case Some(statuses) => statuses.filter(_.name == name).exists(!_.state.contains("waiting"))
case None => false
})
ip <- itemStatus.podIP.toSeq
// Maybe port is an Option of a port, and will be None if no portName was requested
maybePort <- portName match {
case None =>
Seq(None)
case Some(name) =>
for {
container <- itemSpec.containers
ports <- container.ports.toSeq
port <- ports
if port.name.contains(name)
} yield Some(port.containerPort)
}
} yield {
val hostOrIp = if (rawIp) ip else s"${ip.replace('.', '-')}.$podNamespace.pod.$podDomain"
ResolvedTarget(
host = hostOrIp,
port = maybePort,
address = Some(InetAddress.getByName(ip)))
}