diff --git a/components/processors/observek8sattributesprocessor/podactions.go b/components/processors/observek8sattributesprocessor/podactions.go index 6f0dee053..dbe694eb0 100644 --- a/components/processors/observek8sattributesprocessor/podactions.go +++ b/components/processors/observek8sattributesprocessor/podactions.go @@ -33,6 +33,38 @@ const ( OwnerKindStatefulSet = "StatefulSet" ) +// Helper Fns +func hasPodReadyCondition(conditions []v1.PodCondition) bool { + for _, condition := range conditions { + if condition.Type == v1.PodReady && condition.Status == v1.ConditionTrue { + return true + } + } + return false +} + +func isPodInitializedConditionTrue(status *v1.PodStatus) bool { + for _, condition := range status.Conditions { + if condition.Type != v1.PodInitialized { + continue + } + + return condition.Status == v1.ConditionTrue + } + return false +} + +func isRestartableInitContainer(initContainer *v1.Container) bool { + if initContainer == nil || initContainer.RestartPolicy == nil { + return false + } + return *initContainer.RestartPolicy == v1.ContainerRestartPolicyAlways +} + +func isPodPhaseTerminal(phase v1.PodPhase) bool { + return phase == v1.PodFailed || phase == v1.PodSucceeded +} + // ---------------------------------- Pod "status" ---------------------------------- type PodStatusAction struct{} @@ -43,18 +75,34 @@ func NewPodStatusAction() PodStatusAction { // Generates the Pod "status" facet. func (PodStatusAction) ComputeAttributes(pod v1.Pod) (attributes, error) { - // based on https://github.com/kubernetes/kubernetes/blob/0d3b859af81e6a5f869a7766c8d45afd1c600b04/pkg/printers/internalversion/printers.go#L901 - reason := string(pod.Status.Phase) + // based on https://github.com/kubernetes/kubernetes/blob/cd3b5c57668a0a6e32057ef82dfab40e9b0bec5b/pkg/printers/internalversion/printers.go#L881 + podPhase := pod.Status.Phase + reason := string(podPhase) if pod.Status.Reason != "" { reason = pod.Status.Reason } + // If the Pod carries {type:PodScheduled, reason:SchedulingGated}, set reason to 'SchedulingGated'. + for _, condition := range pod.Status.Conditions { + if condition.Type == v1.PodScheduled && condition.Reason == v1.PodReasonSchedulingGated { + reason = v1.PodReasonSchedulingGated + } + } + + initContainers := make(map[string]*v1.Container) + for i := range pod.Spec.InitContainers { + initContainers[pod.Spec.InitContainers[i].Name] = &pod.Spec.InitContainers[i] + } + initializing := false for i := range pod.Status.InitContainerStatuses { container := pod.Status.InitContainerStatuses[i] switch { case container.State.Terminated != nil && container.State.Terminated.ExitCode == 0: continue + case isRestartableInitContainer(initContainers[container.Name]) && + container.Started != nil && *container.Started: + continue case container.State.Terminated != nil: // initialization is failed if len(container.State.Terminated.Reason) == 0 { @@ -76,11 +124,11 @@ func (PodStatusAction) ComputeAttributes(pod v1.Pod) (attributes, error) { } break } - if !initializing { + + if !initializing || isPodInitializedConditionTrue(&pod.Status) { hasRunning := false for i := len(pod.Status.ContainerStatuses) - 1; i >= 0; i-- { container := pod.Status.ContainerStatuses[i] - if container.State.Waiting != nil && container.State.Waiting.Reason != "" { reason = container.State.Waiting.Reason } else if container.State.Terminated != nil && container.State.Terminated.Reason != "" { @@ -98,7 +146,11 @@ func (PodStatusAction) ComputeAttributes(pod v1.Pod) (attributes, error) { // change pod status back to "Running" if there is at least one container still reporting as "Running" status if reason == "Completed" && hasRunning { - reason = "Running" + if hasPodReadyCondition(pod.Status.Conditions) { + reason = "Running" + } else { + reason = "NotReady" + } } } diff --git a/components/processors/observek8sattributesprocessor/podactions_test.go b/components/processors/observek8sattributesprocessor/podactions_test.go index 0ca775dd2..25b21df49 100644 --- a/components/processors/observek8sattributesprocessor/podactions_test.go +++ b/components/processors/observek8sattributesprocessor/podactions_test.go @@ -14,7 +14,7 @@ func TestPodActions(t *testing.T) { ), expectedResults: []queryWithResult{ { - path: "observe_transform.facets.status", + path: "observe_transform.facets.status", expResult: "Terminating", }, },