This repository has been archived by the owner on Jul 11, 2023. It is now read-only.
/
reporter.go
67 lines (52 loc) · 1.71 KB
/
reporter.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
package task
import (
"context"
"net/http"
"code.cloudfoundry.org/eirini/k8s/jobs"
"code.cloudfoundry.org/eirini/k8s/utils"
"code.cloudfoundry.org/eirini/models/cf"
"code.cloudfoundry.org/lager"
"github.com/pkg/errors"
corev1 "k8s.io/api/core/v1"
)
type StateReporter struct {
Client *http.Client
Logger lager.Logger
}
func (r StateReporter) Report(ctx context.Context, pod *corev1.Pod) error {
taskGUID := pod.Annotations[jobs.AnnotationGUID]
uri := pod.Annotations[jobs.AnnotationCompletionCallback]
logger := r.Logger.Session("report", lager.Data{"task-guid": taskGUID})
logger.Debug("sending completion notification")
req := r.generateTaskCompletedRequest(logger, taskGUID, pod)
if err := utils.Post(ctx, r.Client, uri, req); err != nil {
logger.Error("cannot-send-task-status-response", err)
return errors.Wrap(err, "failed to complete task")
}
return nil
}
func (r StateReporter) generateTaskCompletedRequest(logger lager.Logger, guid string, pod *corev1.Pod) cf.TaskCompletedRequest {
res := cf.TaskCompletedRequest{
TaskGUID: guid,
}
taskContainerStatus, _ := getTaskContainerStatus(pod)
terminated := taskContainerStatus.State.Terminated
if terminated.ExitCode != 0 {
res.Failed = true
res.FailureReason = terminated.Reason
logger.Error("job-failed", nil, lager.Data{
"failure-reason": terminated.Reason,
"failure-message": terminated.Message,
})
}
return res
}
func getTaskContainerStatus(pod *corev1.Pod) (corev1.ContainerStatus, bool) {
taskContainerName := pod.Annotations[jobs.AnnotationTaskContainerName]
for _, status := range pod.Status.ContainerStatuses {
if status.Name == taskContainerName {
return status, true
}
}
return corev1.ContainerStatus{}, false
}