-
Notifications
You must be signed in to change notification settings - Fork 1
/
health_daemonset.go
73 lines (64 loc) · 2.28 KB
/
health_daemonset.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
68
69
70
71
72
73
package health
import (
"fmt"
appsv1 "k8s.io/api/apps/v1"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
"k8s.io/apimachinery/pkg/runtime"
)
func getDaemonSetHealth(obj *unstructured.Unstructured) (*HealthStatus, error) {
gvk := obj.GroupVersionKind()
switch gvk {
case appsv1.SchemeGroupVersion.WithKind(DaemonSetKind):
var daemon appsv1.DaemonSet
err := runtime.DefaultUnstructuredConverter.FromUnstructured(obj.Object, &daemon)
if err != nil {
return nil, fmt.Errorf("failed to convert unstructured DaemonSet to typed: %v", err)
}
return getAppsv1DaemonSetHealth(&daemon)
default:
return nil, fmt.Errorf("unsupported DaemonSet GVK: %s", gvk)
}
}
func getAppsv1DaemonSetHealth(daemon *appsv1.DaemonSet) (*HealthStatus, error) {
health := HealthUnknown
if daemon.Status.NumberAvailable == daemon.Status.DesiredNumberScheduled {
health = HealthHealthy
} else if daemon.Status.NumberAvailable > 0 {
health = HealthWarning
} else if daemon.Status.NumberAvailable == 0 {
health = HealthUnhealthy
}
if daemon.Generation == daemon.Status.ObservedGeneration && daemon.Status.UpdatedNumberScheduled == daemon.Status.DesiredNumberScheduled {
return &HealthStatus{
Health: HealthHealthy,
Ready: true,
Status: HealthStatusRunning,
}, nil
}
if daemon.Spec.UpdateStrategy.Type == appsv1.OnDeleteDaemonSetStrategyType {
return &HealthStatus{
Health: health,
Ready: daemon.Status.NumberAvailable == daemon.Status.DesiredNumberScheduled,
Status: HealthStatusRunning,
Message: fmt.Sprintf("%d of %d pods updated", daemon.Status.UpdatedNumberScheduled, daemon.Status.DesiredNumberScheduled),
}, nil
}
if daemon.Status.UpdatedNumberScheduled < daemon.Status.DesiredNumberScheduled {
return &HealthStatus{
Health: health,
Status: HealthStatusRollingOut,
Message: fmt.Sprintf("%d of %d pods updated", daemon.Status.UpdatedNumberScheduled, daemon.Status.DesiredNumberScheduled),
}, nil
}
if daemon.Status.NumberAvailable < daemon.Status.DesiredNumberScheduled {
return &HealthStatus{
Health: health,
Status: HealthStatusRollingOut,
Message: fmt.Sprintf("%d of %d pods ready", daemon.Status.NumberAvailable, daemon.Status.DesiredNumberScheduled),
}, nil
}
return &HealthStatus{
Status: HealthStatusRunning,
Health: health,
}, nil
}