func()

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())
}