keptn-terraform/terraform-kubernetes-get-se.../main.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
}