-
Notifications
You must be signed in to change notification settings - Fork 269
/
kube_api.go
140 lines (114 loc) · 3.4 KB
/
kube_api.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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
package main
import (
"context"
"time"
"github.com/cenkalti/backoff"
log "github.com/sirupsen/logrus"
appsv1 "k8s.io/api/apps/v1"
v13 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
v1 "k8s.io/client-go/kubernetes/typed/apps/v1"
corev1 "k8s.io/client-go/kubernetes/typed/core/v1"
)
// Use exponential backoff for retries
var exponentialBackoff = backoff.NewExponentialBackOff()
const maxElapsedTime = time.Minute
func init() {
exponentialBackoff.MaxElapsedTime = maxElapsedTime
}
// getDSClient returns a daemonset client, useful for interacting with daemonsets
func getDSClient() v1.DaemonSetInterface {
log.Debug("Creating Daemonset client.")
return client.AppsV1().DaemonSets(checkNamespace)
}
// getPodClient returns a pod client, useful for interacting with pods
func getPodClient() corev1.PodInterface {
log.Debug("Creating Pod client.")
return client.CoreV1().Pods(checkNamespace)
}
// getNodeClient returns a node client, useful for interacting with nodes
func getNodeClient() corev1.NodeInterface {
log.Debug("Creating Node client.")
return client.CoreV1().Nodes()
}
func createDaemonset(ctx context.Context, daemonsetSpec *appsv1.DaemonSet) error {
err := backoff.Retry(func() error {
var err error
_, err = getDSClient().Create(ctx, daemonsetSpec, metav1.CreateOptions{})
return err
}, exponentialBackoff)
if err != nil {
log.Errorln("Failed to create daemonset. Error:", err)
return err
}
return err
}
func listDaemonsets(ctx context.Context, more string) (*appsv1.DaemonSetList, error) {
var dsList *appsv1.DaemonSetList
err := backoff.Retry(func() error {
var err error
dsList, err = getDSClient().List(ctx, metav1.ListOptions{
Continue: more,
})
return err
}, exponentialBackoff)
if err != nil {
log.Errorln("Failed to list daemonsets. Error:", err)
return dsList, err
}
return dsList, err
}
func deleteDaemonset(ctx context.Context, dsName string) error {
err := backoff.Retry(func() error {
var err error
err = getDSClient().Delete(ctx, dsName, metav1.DeleteOptions{})
return err
}, exponentialBackoff)
if err != nil {
log.Errorln("Failed to delete daemonset. Error:", err)
return err
}
return err
}
func listPods(ctx context.Context) (*v13.PodList, error) {
var podList *v13.PodList
err := backoff.Retry(func() error {
var err error
podList, err = getPodClient().List(ctx, metav1.ListOptions{
LabelSelector: "kh-app=" + daemonSetName + ",source=kuberhealthy,khcheck=daemonset",
})
return err
}, exponentialBackoff)
if err != nil {
log.Errorln("Failed to list daemonset pods. Error:", err)
return podList, err
}
return podList, err
}
func deletePods(ctx context.Context, dsName string) error {
err := backoff.Retry(func() error {
var err error
err = getPodClient().DeleteCollection(ctx, metav1.DeleteOptions{}, metav1.ListOptions{
LabelSelector: "kh-app=" + dsName + ",source=kuberhealthy,khcheck=daemonset",
})
return err
}, exponentialBackoff)
if err != nil {
log.Errorln("Failed to delete daemonset pods. Error:", err)
return err
}
return err
}
func listNodes(ctx context.Context) (*v13.NodeList, error) {
var nodeList *v13.NodeList
err := backoff.Retry(func() error {
var err error
nodeList, err = getNodeClient().List(ctx, metav1.ListOptions{})
return err
}, exponentialBackoff)
if err != nil {
log.Errorln("Failed to list nodes. Error:", err)
return nodeList, err
}
return nodeList, err
}