-
Notifications
You must be signed in to change notification settings - Fork 2
/
autocompletion.go
129 lines (119 loc) · 4.04 KB
/
autocompletion.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
package utils
import (
"path/filepath"
"strings"
dmskube "github.com/altinn/dotnet-monitor-sidecar-cli/pkg/kubernetes"
"github.com/spf13/cobra"
appsv1 "k8s.io/api/apps/v1"
corev1 "k8s.io/api/core/v1"
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/tools/clientcmd"
"k8s.io/client-go/util/homedir"
)
// AutoCompleteDaemonSets implements autocompletion for the daemonset commands
func AutoCompleteDaemonSets(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) {
kubeconfig, namespace, err := getFlags(cmd)
if err != nil {
return nil, cobra.ShellCompDirectiveNoFileComp
}
h, namespace, err := getKubernetesHelper(kubeconfig, namespace)
if err != nil {
return nil, cobra.ShellCompDirectiveNoFileComp
}
daemonsets, err := h.ListDaemonsetsInNamespace(cmd.Context(), namespace)
if err != nil {
return nil, cobra.ShellCompDirectiveNoFileComp
}
names := getFilteredDaemonSetNames(daemonsets.Items, toComplete)
return names, cobra.ShellCompDirectiveDefault
}
// AutoCompleteDeployments implements autocompletion for the deployment commands
func AutoCompleteDeployments(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) {
kubeconfig, namespace, err := getFlags(cmd)
if err != nil {
return nil, cobra.ShellCompDirectiveNoFileComp
}
h, namespace, err := getKubernetesHelper(kubeconfig, namespace)
if err != nil {
return nil, cobra.ShellCompDirectiveNoFileComp
}
deployments, err := h.ListDeploymentsInNamespace(cmd.Context(), namespace)
if err != nil {
return nil, cobra.ShellCompDirectiveNoFileComp
}
names := getFilteredDeploymentNames(deployments.Items, toComplete)
return names, cobra.ShellCompDirectiveDefault
}
// AutoCompletePodsWithDebugContainer implements autocompletion for the pod commands where debug contianer is present
func AutoCompletePodsWithDebugContainer(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) {
kubeconfig, namespace, err := getFlags(cmd)
if err != nil {
return nil, cobra.ShellCompDirectiveNoFileComp
}
h, namespace, err := getKubernetesHelper(kubeconfig, namespace)
if err != nil {
return nil, cobra.ShellCompDirectiveNoFileComp
}
pods, err := h.ListPodsInNamespace(cmd.Context(), namespace)
if err != nil {
return nil, cobra.ShellCompDirectiveNoFileComp
}
names := getFilteredPodNamesWithDebugContainer(pods.Items, toComplete)
return names, cobra.ShellCompDirectiveDefault
}
// getKubernetesHelper returns a kubernetes helper
func getKubernetesHelper(kubeconfig, namespace string) (h dmskube.Helper, ns string, err error) {
if home := homedir.HomeDir(); home != "" && kubeconfig == "" {
kubeconfig = filepath.Join(home, ".kube", "config")
}
config, err := clientcmd.BuildConfigFromFlags("", kubeconfig)
if err != nil {
return dmskube.Helper{}, "", err
}
if namespace == "" {
namespace, err = GetNamespaceFromCurrentContext()
if err != nil {
namespace = "default"
}
}
clientset, err := kubernetes.NewForConfig(config)
if err != nil {
panic(err.Error())
}
return dmskube.Helper{
Client: clientset,
}, namespace, nil
}
// getFlags returns kubeconfig and namespace flags
func getFlags(cmd *cobra.Command) (namespace, kubeconfig string, err error) {
kubeconfig, err = cmd.Flags().GetString("kubeconfig")
if err != nil {
return
}
namespace, err = cmd.Flags().GetString("namespace")
return
}
func getFilteredDeploymentNames(deployments []appsv1.Deployment, filter string) (names []string) {
for _, d := range deployments {
if strings.HasPrefix(d.Name, filter) {
names = append(names, d.Name)
}
}
return
}
func getFilteredDaemonSetNames(daemonsets []appsv1.DaemonSet, filter string) (names []string) {
for _, d := range daemonsets {
if strings.HasPrefix(d.Name, filter) {
names = append(names, d.Name)
}
}
return
}
func getFilteredPodNamesWithDebugContainer(pods []corev1.Pod, filter string) (names []string) {
for _, p := range pods {
if strings.HasPrefix(p.Name, filter) && p.Annotations["dev.local/dd-added"] == "true" {
names = append(names, p.Name)
}
}
return
}