From 0f576b58d67ed8e6275583ffa48d4077166504c7 Mon Sep 17 00:00:00 2001 From: David O'Riordan Date: Mon, 12 Mar 2018 17:17:10 +0000 Subject: [PATCH] Add pod condition fields (#125) --- client/src/it/scala/skuber/PodSpec.scala | 35 +++++++++++++------ client/src/main/scala/skuber/Pod.scala | 8 ++++- .../src/main/scala/skuber/json/package.scala | 7 ++-- 3 files changed, 36 insertions(+), 14 deletions(-) diff --git a/client/src/it/scala/skuber/PodSpec.scala b/client/src/it/scala/skuber/PodSpec.scala index 8a07f727..2693f058 100644 --- a/client/src/it/scala/skuber/PodSpec.scala +++ b/client/src/it/scala/skuber/PodSpec.scala @@ -31,18 +31,31 @@ class PodSpec extends K8SFixture with Eventually with Matchers { } } - it should "get the status of newly created pod and container" in { k8s => - k8s.get[Pod](nginxPodName).map { p => - val nginxCont = for { - podStatus <- p.status - nginxContainerStatus = podStatus.containerStatuses(0) - nginxContName = nginxContainerStatus.name - nginxContStatus <- nginxContainerStatus.state - } yield (nginxContName, nginxContStatus) - nginxCont.map { case (name, status) => - println(s"Container ${name} has status ${status}") + it should "check for newly created pod and container to be ready" in { k8s => + eventually(timeout(100 seconds), interval(3 seconds)) { + val retrievePod=k8s.get[Pod](nginxPodName) + val podRetrieved=Await.ready(retrievePod, 2 seconds).value.get + val podStatus=podRetrieved.get.status.get + val nginxContainerStatus = podStatus.containerStatuses(0) + podStatus.phase should contain(Pod.Phase.Running) + nginxContainerStatus.name should be("nginx") + nginxContainerStatus.state.get shouldBe a[Container.Running] + val isUnschedulable=podStatus.conditions.exists { c => + c._type=="PodScheduled" && c.status=="False" && c.reason==Some("Unschedulable") } - assert(nginxCont.isDefined) + val isScheduled=podStatus.conditions.exists { c => + c._type=="PodScheduled" && c.status=="True" + } + val isInitialised=podStatus.conditions.exists { c => + c._type=="Initialized" && c.status=="True" + } + val isReady=podStatus.conditions.exists { c => + c._type=="Ready" && c.status=="True" + } + assert(!isUnschedulable) + assert(isScheduled) + assert(isInitialised) + assert(isReady) } } diff --git a/client/src/main/scala/skuber/Pod.scala b/client/src/main/scala/skuber/Pod.scala index 646ae568..5c75b4b5 100644 --- a/client/src/main/scala/skuber/Pod.scala +++ b/client/src/main/scala/skuber/Pod.scala @@ -146,7 +146,13 @@ object Pod { startTime: Option[Timestamp] = None, containerStatuses: List[Container.Status] = Nil) - case class Condition(_type : String="Ready", status: String) + case class Condition( + _type : String="Ready", + status: String, + reason: Option[String]=None, + message: Option[String]=None, + lastProbeTime: Option[Timestamp]=None, + lastTransitionTime: Option[Timestamp]=None) case class Template( val kind: String ="PodTemplate", diff --git a/client/src/main/scala/skuber/json/package.scala b/client/src/main/scala/skuber/json/package.scala index d36179a8..e00b041c 100644 --- a/client/src/main/scala/skuber/json/package.scala +++ b/client/src/main/scala/skuber/json/package.scala @@ -545,9 +545,12 @@ package object format { implicit val podStatusCondFormat : Format[Pod.Condition] = ( (JsPath \ "type").format[String] and - (JsPath \ "status").format[String] + (JsPath \ "status").formatMaybeEmptyString() and + (JsPath \ "reason").formatNullable[String] and + (JsPath \ "message").formatNullable[String] and + (JsPath \ "lastProbeTime").formatNullable[Timestamp] and + (JsPath \ "lastTransitionTime").formatNullable[Timestamp] )(Pod.Condition.apply _, unlift(Pod.Condition.unapply)) - implicit val podStatusFormat: Format[Pod.Status] = ( (JsPath \ "phase").formatNullableEnum(Pod.Phase) and