-
Notifications
You must be signed in to change notification settings - Fork 0
/
main.go
135 lines (116 loc) · 2.99 KB
/
main.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
package main
import (
"context"
"encoding/json"
"fmt"
"log"
"os"
"github.com/tomwright/dasel/v2"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/tools/clientcmd"
"sigs.k8s.io/yaml"
)
const (
KUBECONFIG_DIR = ".kube/config"
CONTEXT_SELECTOR_YAML = ".contexts.[0].context.namespace"
)
func main() {
nArgs := len(os.Args)
switch nArgs {
case 1:
homePath, err := os.UserHomeDir()
if err != nil {
log.Fatalf("error: %s\n", err)
}
kubeconfigPath := homePath + "/" + KUBECONFIG_DIR
currentNs, err := GetYamlField(kubeconfigPath, CONTEXT_SELECTOR_YAML)
if err != nil {
log.Fatalf("error: %s\n", err)
}
fmt.Println(currentNs)
case 2:
targetNamespace := os.Args[1]
fmt.Printf("switching to namespace %q\n", targetNamespace)
homePath, err := os.UserHomeDir()
if err != nil {
log.Fatalf("error: %s\n", err)
}
kubeconfigPath := homePath + "/" + KUBECONFIG_DIR
config, err := clientcmd.BuildConfigFromFlags("", kubeconfigPath)
if err != nil {
log.Fatalf("error: %s\n", err)
}
kubeClient, err := kubernetes.NewForConfig(config)
if err != nil {
log.Fatalf("error: %s\n", err)
}
myNs, err := kubeClient.CoreV1().Namespaces().Get(context.TODO(), targetNamespace, metav1.GetOptions{})
if err != nil {
log.Printf("error: %s\n", err)
}
err = UpdateYamlField(kubeconfigPath, CONTEXT_SELECTOR_YAML, myNs.Name)
if err != nil {
log.Fatalf("error: %s\n", err)
}
default:
log.Fatalf("error: incorrect number of arguments (0 or 1!)\n")
}
}
// UpdateYamlField reads a yaml file and returns one field
func GetYamlField(file, field string) (string, error) {
// open the config file and transform to json (so we can modify it with dasel)
yFile, err := os.ReadFile(file)
if err != nil {
return "", err
}
jFile, err := yaml.YAMLToJSON(yFile)
if err != nil {
return "", err
}
// manipulate the data with dasel library
var data interface{}
err = json.Unmarshal(jFile, &data)
if err != nil {
return "", err
}
result, err := dasel.Select(data, field)
if err != nil {
return "", err
}
currentNs := result[0].String()
return currentNs, nil
}
// UpdateYamlField reads a yaml file and modify one field with the desired value
func UpdateYamlField(file, field, value string) error {
// open the config file and transform to json (so we can modify it with dasel)
yFile, err := os.ReadFile(file)
if err != nil {
return err
}
jFile, err := yaml.YAMLToJSON(yFile)
if err != nil {
return err
}
// manipulate the data with dasel library
var data interface{}
err = json.Unmarshal(jFile, &data)
if err != nil {
return err
}
result, err := dasel.Put(data, field, value)
if err != nil {
return err
}
// return the file to json, convert it to yaml so metricbeat can use it, and write it to his destination
jOut, _ := json.Marshal(result.Interface())
yOut, err := yaml.JSONToYAML(jOut)
if err != nil {
return err
}
err = os.WriteFile(file, yOut, 0)
if err != nil {
return err
}
return nil
}