| package main | 
 |  | 
 | import ( | 
 | 	"crypto/x509" | 
 | 	"encoding/json" | 
 | 	"encoding/pem" | 
 | 	"log" | 
 | 	"os" | 
 |  | 
 | 	"github.com/spf13/cobra" | 
 | 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" | 
 | 	clientauthentication "k8s.io/client-go/pkg/apis/clientauthentication/v1beta1" | 
 | ) | 
 |  | 
 | var k8scredpluginCmd = &cobra.Command{ | 
 | 	Use:   "k8scredplugin", | 
 | 	Short: "Kubernetes client-go credential plugin [internal use]", | 
 | 	Long: `This implements a Kubernetes client-go credential plugin to | 
 | authenticate client-go based callers including kubectl against a Metropolis | 
 | cluster. This should never be directly called by end users.`, | 
 | 	Args: cobra.ExactArgs(0), | 
 | 	Run:  doK8sCredPlugin, | 
 | } | 
 |  | 
 | func doK8sCredPlugin(cmd *cobra.Command, args []string) { | 
 | 	cert, key, err := getCredentials() | 
 | 	if err == noCredentialsError { | 
 | 		log.Fatal("No credentials found on your machine") | 
 | 	} | 
 | 	if err != nil { | 
 | 		log.Fatalf("failed to get Metropolis credentials: %v", err) | 
 | 	} | 
 |  | 
 | 	pkcs8Key, err := x509.MarshalPKCS8PrivateKey(key) | 
 | 	if err != nil { | 
 | 		// We explicitly pass an Ed25519 private key in, so this can't happen | 
 | 		panic(err) | 
 | 	} | 
 |  | 
 | 	cred := clientauthentication.ExecCredential{ | 
 | 		TypeMeta: metav1.TypeMeta{ | 
 | 			APIVersion: clientauthentication.SchemeGroupVersion.String(), | 
 | 			Kind:       "ExecCredential", | 
 | 		}, | 
 | 		Status: &clientauthentication.ExecCredentialStatus{ | 
 | 			ClientCertificateData: string(pem.EncodeToMemory(&pem.Block{Type: "CERTIFICATE", Bytes: cert.Raw})), | 
 | 			ClientKeyData:         string(pem.EncodeToMemory(&pem.Block{Type: "PRIVATE KEY", Bytes: pkcs8Key})), | 
 | 		}, | 
 | 	} | 
 | 	if err := json.NewEncoder(os.Stdout).Encode(cred); err != nil { | 
 | 		log.Fatalf("failed to encode ExecCredential: %v", err) | 
 | 	} | 
 | } | 
 |  | 
 | func init() { | 
 | 	rootCmd.AddCommand(k8scredpluginCmd) | 
 | } |