106 lines
2.2 KiB
Go
106 lines
2.2 KiB
Go
package main
|
|
|
|
import (
|
|
"context"
|
|
"encoding/json"
|
|
"fmt"
|
|
"io/ioutil"
|
|
"os"
|
|
|
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
|
"k8s.io/client-go/kubernetes"
|
|
_ "k8s.io/client-go/plugin/pkg/client/auth/oidc"
|
|
"k8s.io/client-go/rest"
|
|
"k8s.io/client-go/tools/clientcmd"
|
|
)
|
|
|
|
type Query struct {
|
|
Namespace string `json:"namespace"`
|
|
Name string `json:"name"`
|
|
Key string `json:"key"`
|
|
Context string `json:"context"`
|
|
}
|
|
|
|
type Result struct {
|
|
Value string `json:"value"`
|
|
}
|
|
|
|
func fatal(format string, args ...interface{}) {
|
|
fmt.Fprintf(os.Stderr, format+"\n", args...)
|
|
os.Exit(1)
|
|
}
|
|
|
|
func main() {
|
|
// Get terraform input
|
|
input, err := ioutil.ReadAll(os.Stdin)
|
|
if err != nil {
|
|
fatal("cannot read stdin input: %v", err)
|
|
}
|
|
|
|
var q Query
|
|
if err := json.Unmarshal(input, &q); err != nil {
|
|
fatal("cannot json umarshal input: %v", err)
|
|
}
|
|
|
|
if q.Namespace == "" {
|
|
fatal("missing or empty namespace parameter")
|
|
}
|
|
|
|
if q.Name == "" {
|
|
fatal("missing or empty name parameter")
|
|
}
|
|
|
|
if q.Key == "" {
|
|
fatal("missing or empty key parameter")
|
|
}
|
|
|
|
// if q.Context == "" {
|
|
// fatal("missing or empty context parameter")
|
|
// }
|
|
|
|
// Build kubernetes configuration
|
|
|
|
var config *rest.Config
|
|
|
|
if q.Context != "" {
|
|
config, err = clientcmd.NewNonInteractiveDeferredLoadingClientConfig(
|
|
clientcmd.NewDefaultClientConfigLoadingRules(),
|
|
&clientcmd.ConfigOverrides{CurrentContext: q.Context}).ClientConfig()
|
|
} else {
|
|
//in cluster config
|
|
config, err = rest.InClusterConfig()
|
|
if err != nil {
|
|
panic(err.Error())
|
|
}
|
|
}
|
|
|
|
if err != nil {
|
|
fatal("cannot load Kubernetes configuration: %v", err)
|
|
}
|
|
|
|
clientset, err := kubernetes.NewForConfig(config)
|
|
if err != nil {
|
|
fatal("cannot create Kubernetes configuration: %v", err)
|
|
}
|
|
|
|
secret, err := clientset.CoreV1().Secrets(q.Namespace).Get(context.TODO(), q.Name, metav1.GetOptions{})
|
|
if err != nil {
|
|
fatal("cannot get the %q secret in %q namespace: %v", q.Name, q.Namespace, err)
|
|
}
|
|
|
|
val, ok := secret.Data[q.Key]
|
|
if !ok {
|
|
fatal("cannot found the key %q for %q secret in %q namespace", q.Key, q.Name, q.Namespace)
|
|
}
|
|
|
|
r := &Result{Value: string(val)}
|
|
|
|
o, err := json.MarshalIndent(r, "", " ")
|
|
if err != nil {
|
|
fatal("cannot marshal indent result: %v", err)
|
|
}
|
|
|
|
os.Stdout.Write(o)
|
|
return
|
|
}
|