From c66ee9dc1068ce5c8ae8a2fafb4eda99b88170c9 Mon Sep 17 00:00:00 2001 From: Jeff Ortel Date: Thu, 27 Jun 2024 11:09:21 -0700 Subject: [PATCH 1/4] :bug: Detect image issues. Signed-off-by: Jeff Ortel --- task/manager.go | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/task/manager.go b/task/manager.go index 5eb63c78c..badda9b9e 100644 --- a/task/manager.go +++ b/task/manager.go @@ -51,6 +51,7 @@ const ( const ( AddonSelected = "AddonSelected" ExtSelected = "ExtensionSelected" + ImageError = "ImageError" PodNotFound = "PodNotFound" PodCreated = "PodCreated" PodRunning = "PodRunning" @@ -946,6 +947,9 @@ func (m *Manager) podEvent(pod *core.Pod) (events []Event, err error) { // podLogs - get and store pod logs as a Files. func (m *Manager) podLogs(pod *core.Pod) (files []*model.File, err error) { + if pod.Status.Phase == core.PodPending { + return + } for _, container := range pod.Spec.Containers { f, nErr := m.containerLog(pod, container.Name) if nErr == nil { @@ -1234,6 +1238,23 @@ func (r *Task) podPending(pod *core.Pod) { status, pod.Status.ContainerStatuses...) for _, status := range status { + state := status.State + if state.Waiting != nil { + waiting := state.Waiting + reason := strings.ToLower(waiting.Reason) + if strings.Contains(reason, "invalid") || strings.Contains(reason, "backoff") { + r.Error( + "Error", + "Container (%s) failed: %s", + status.Name, + waiting.Reason) + mark := time.Now() + r.Terminated = &mark + r.Event(ImageError, waiting.Reason) + r.State = Failed + return + } + } if status.Started == nil { continue } From 3ca2bd32a4f027f67c5f76ace3dd680365437170 Mon Sep 17 00:00:00 2001 From: Jeff Ortel Date: Thu, 27 Jun 2024 11:24:54 -0700 Subject: [PATCH 2/4] checkpoint Signed-off-by: Jeff Ortel --- task/manager.go | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/task/manager.go b/task/manager.go index badda9b9e..9e11d4c30 100644 --- a/task/manager.go +++ b/task/manager.go @@ -947,10 +947,13 @@ func (m *Manager) podEvent(pod *core.Pod) (events []Event, err error) { // podLogs - get and store pod logs as a Files. func (m *Manager) podLogs(pod *core.Pod) (files []*model.File, err error) { - if pod.Status.Phase == core.PodPending { - return - } - for _, container := range pod.Spec.Containers { + for _, container := range pod.Status.ContainerStatuses { + if container.Started == nil { + continue + } + if !*container.Started { + continue + } f, nErr := m.containerLog(pod, container.Name) if nErr == nil { files = append(files, f) From 98bbbe298d2b5dcdf5aa203c39abb209d28d656a Mon Sep 17 00:00:00 2001 From: Jeff Ortel Date: Thu, 27 Jun 2024 12:02:10 -0700 Subject: [PATCH 3/4] checkpoint Signed-off-by: Jeff Ortel --- task/manager.go | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/task/manager.go b/task/manager.go index 9e11d4c30..bbb4347a6 100644 --- a/task/manager.go +++ b/task/manager.go @@ -1245,7 +1245,7 @@ func (r *Task) podPending(pod *core.Pod) { if state.Waiting != nil { waiting := state.Waiting reason := strings.ToLower(waiting.Reason) - if strings.Contains(reason, "invalid") || strings.Contains(reason, "backoff") { + if r.containsAny(reason, "invalid", "error", "backoff") { r.Error( "Error", "Container (%s) failed: %s", @@ -1573,6 +1573,17 @@ func (r *Task) attach(file *model.File) { }) } +// containsAny returns true when the str contains any of substr. +func (r *Task) containsAny(str string, substr ...string) (matched bool) { + for i := range substr { + if strings.Contains(str, substr[i]) { + matched = true + break + } + } + return +} + // Event represents a pod event. type Event struct { Type string From b1a759b388de19482aa75c1ce606f94a21f4d0f6 Mon Sep 17 00:00:00 2001 From: Jeff Ortel Date: Thu, 27 Jun 2024 12:15:30 -0700 Subject: [PATCH 4/4] checkpoint Signed-off-by: Jeff Ortel --- task/manager.go | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/task/manager.go b/task/manager.go index bbb4347a6..23c3ae558 100644 --- a/task/manager.go +++ b/task/manager.go @@ -948,10 +948,7 @@ func (m *Manager) podEvent(pod *core.Pod) (events []Event, err error) { // podLogs - get and store pod logs as a Files. func (m *Manager) podLogs(pod *core.Pod) (files []*model.File, err error) { for _, container := range pod.Status.ContainerStatuses { - if container.Started == nil { - continue - } - if !*container.Started { + if container.State.Waiting != nil { continue } f, nErr := m.containerLog(pod, container.Name)