in internal/stackdiag.go [261:340]
func (ds *diagJobState) extractJobResults(file *archive.ZipFile) {
_, err := ds.informer.AddEventHandler(cache.ResourceEventHandlerFuncs{
AddFunc: func(obj interface{}) {
if pod, ok := obj.(*corev1.Pod); ok && ds.verbose {
logger.Printf("Diagnostic pod %s/%s added\n", pod.Namespace, pod.Name)
}
},
UpdateFunc: func(_, newObj interface{}) {
pod, ok := newObj.(*corev1.Pod)
if !ok {
logger.Printf("Unexpected %v, expected type Pod\n", newObj)
return
}
job, found := ds.jobs[pod.Name]
if !found {
logger.Printf("Unexpected no record for Pod %s/%s\n", pod.Namespace, pod.Name)
return
}
if job.Done() {
return
}
switch pod.Status.Phase {
case corev1.PodPending:
if err := ds.detectImageErrors(pod); err != nil {
file.AddError(err)
file.AddError(ds.terminateJob(ds.context, job))
}
case corev1.PodUnknown:
logger.Printf("Unexpected diagnostic Pod %s/%s in unknown phase", pod.Namespace, pod.Name)
case corev1.PodRunning:
if podutils.IsPodReady(pod) {
ds.extractFromRemote(pod, file)
}
case corev1.PodSucceeded:
file.AddError(fmt.Errorf("unexpected: Pod %s/%s succeeded", pod.Namespace, pod.Name))
file.AddError(ds.completeJob(job))
case corev1.PodFailed:
file.AddError(fmt.Errorf("unexpected: Pod %s/%s failed", pod.Namespace, pod.Name))
file.AddError(ds.completeJob(job))
}
},
DeleteFunc: func(obj interface{}) {
pod, ok := obj.(*corev1.Pod)
if !ok {
logger.Printf("Unexpected %v, expected type Pod", obj)
return
}
if ds.verbose {
logger.Printf("%s/%s deleted", pod.Namespace, pod.Name)
}
done := true
for _, j := range ds.jobs {
if !j.Done() {
done = false
}
}
if done {
ds.cancelFunc()
}
},
})
if err != nil {
file.AddError(err)
}
ds.informer.Run(ds.context.Done())
err = ds.context.Err()
// we cancel the context when we are done but want to log any other errors e.g. deadline exceeded
if err != nil && !errors.Is(err, context.Canceled) {
file.AddError(fmt.Errorf("extracting Elastic stack diagnostic for namespace %s: %w", ds.ns, err))
}
// make sure any open jobs are aborted at this point, under normal circumstances this should be a NOOP
// when interrupted jobs might still be running and should be stopped now.
file.AddError(ds.abortAllJobs())
}