...
1
16
17 package main
18
19 import (
20 "encoding/json"
21 "errors"
22 "io"
23 "net/http"
24 "os"
25 "time"
26
27 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
28 "k8s.io/klog/v2"
29 credentialproviderv1 "k8s.io/kubelet/pkg/apis/credentialprovider/v1"
30 )
31
32 const metadataTokenEndpoint = "http://metadata.google.internal./computeMetadata/v1/instance/service-accounts/default/token"
33
34 func main() {
35 if err := getCredentials(metadataTokenEndpoint, os.Stdin, os.Stdout); err != nil {
36 klog.Fatalf("failed to get credentials: %v", err)
37 }
38 }
39
40 func getCredentials(tokenEndpoint string, r io.Reader, w io.Writer) error {
41 provider := &provider{
42 client: &http.Client{
43 Timeout: 10 * time.Second,
44 },
45 tokenEndpoint: tokenEndpoint,
46 }
47
48 data, err := io.ReadAll(r)
49 if err != nil {
50 return err
51 }
52
53 var authRequest credentialproviderv1.CredentialProviderRequest
54 err = json.Unmarshal(data, &authRequest)
55 if err != nil {
56 return err
57 }
58
59 auth, err := provider.Provide(authRequest.Image)
60 if err != nil {
61 return err
62 }
63
64 response := &credentialproviderv1.CredentialProviderResponse{
65 TypeMeta: metav1.TypeMeta{
66 Kind: "CredentialProviderResponse",
67 APIVersion: "credentialprovider.kubelet.k8s.io/v1",
68 },
69 CacheKeyType: credentialproviderv1.RegistryPluginCacheKeyType,
70 Auth: auth,
71 }
72
73 if err := json.NewEncoder(w).Encode(response); err != nil {
74
75 return errors.New("error marshaling response")
76 }
77
78 return nil
79 }
80
View as plain text