This repository has been archived by the owner on Jul 1, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 7
/
kubectl.go
98 lines (77 loc) · 2.24 KB
/
kubectl.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
/*
Copyright 2020 Gravitational, Inc.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package gravity
import (
"context"
"strings"
"github.com/gravitational/robotest/lib/wait"
"github.com/gravitational/trace"
)
type Pod struct {
Name string
Ready bool
NodeIP string
}
const (
kubeSystemNS = "kube-system"
appGravityLabel = "app=gravity-site"
)
func KubectlGetPods(ctx context.Context, g Gravity, namespace, label string) ([]Pod, error) {
args := []string{
"get", "pods", "-n", namespace,
`-ojsonpath='{range .items[*]}{.metadata.name},{.status.conditions[?(@.type=="Ready")].status},{.status.hostIP}{"\n"}{end}'`,
}
if label != "" {
args = append(args, "-l", label)
}
out, err := g.RunInPlanet(ctx, "/usr/bin/kubectl", args...)
if err != nil {
return nil, trace.Wrap(err)
}
pods := []Pod{}
for _, line := range strings.Split(out, "\n") {
v := strings.Split(line, ",")
if line == "" {
continue
}
if len(v) != 3 {
return nil, trace.Errorf("unexpected string %q", line)
}
pods = append(pods, Pod{Name: v[0], Ready: v[1] == "True", NodeIP: v[2]})
}
return pods, nil
}
func KubectlDeletePod(ctx context.Context, g Gravity, namespace, pod string) error {
out, err := g.RunInPlanet(ctx, "/usr/bin/kubectl", "delete", "po", "-n", namespace, pod)
if err != nil {
return trace.Wrap(err)
}
// FIXME: https://github.com/gravitational/gravity/issues/2408
if strings.HasPrefix(out, "Error") {
return trace.Errorf(out)
}
// wait for the pod to disappear
err = wait.Retry(ctx, func() error {
pods, err := KubectlGetPods(ctx, g, namespace, "")
if err != nil {
return wait.Abort(err)
}
for _, p := range pods {
if p.Name == pod {
return wait.Continue("pod is still present")
}
}
return nil
})
return trace.Wrap(err)
}