Skip to content

Commit

Permalink
periodically reload tokens read from TokenFile in kubeconfig
Browse files Browse the repository at this point in the history
Like we do with InClusterConfig.
  • Loading branch information
mikedanese committed Nov 5, 2018
1 parent 7e102de commit 718adb7
Show file tree
Hide file tree
Showing 4 changed files with 22 additions and 6 deletions.
2 changes: 1 addition & 1 deletion staging/src/k8s.io/client-go/rest/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -322,7 +322,7 @@ func InClusterConfig() (*Config, error) {
return nil, ErrNotInCluster
}

ts := newCachedPathTokenSource(tokenFile)
ts := NewCachedFileTokenSource(tokenFile)

if _, err := ts.Token(); err != nil {
return nil, err
Expand Down
4 changes: 3 additions & 1 deletion staging/src/k8s.io/client-go/rest/token_source.go
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,9 @@ func TokenSourceWrapTransport(ts oauth2.TokenSource) func(http.RoundTripper) htt
}
}

func newCachedPathTokenSource(path string) oauth2.TokenSource {
// NewCachedFileTokenSource returns a oauth2.TokenSource reads a token from a
// file at a specified path and periodically reloads it.
func NewCachedFileTokenSource(path string) oauth2.TokenSource {
return &cachingTokenSource{
now: time.Now,
leeway: 1 * time.Minute,
Expand Down
6 changes: 3 additions & 3 deletions staging/src/k8s.io/client-go/tools/clientcmd/client_config.go
Original file line number Diff line number Diff line change
Expand Up @@ -229,11 +229,11 @@ func (config *DirectClientConfig) getUserIdentificationPartialConfig(configAuthI
if len(configAuthInfo.Token) > 0 {
mergedConfig.BearerToken = configAuthInfo.Token
} else if len(configAuthInfo.TokenFile) > 0 {
tokenBytes, err := ioutil.ReadFile(configAuthInfo.TokenFile)
if err != nil {
ts := restclient.NewCachedFileTokenSource(configAuthInfo.TokenFile)
if _, err := ts.Token(); err != nil {
return nil, err
}
mergedConfig.BearerToken = string(tokenBytes)
mergedConfig.WrapTransport = restclient.TokenSourceWrapTransport(ts)
}
if len(configAuthInfo.Impersonate) > 0 {
mergedConfig.Impersonate = restclient.ImpersonationConfig{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,12 +18,14 @@ package clientcmd

import (
"io/ioutil"
"net/http"
"os"
"reflect"
"strings"
"testing"

"github.com/imdario/mergo"

restclient "k8s.io/client-go/rest"
clientcmdapi "k8s.io/client-go/tools/clientcmd/api"
)
Expand Down Expand Up @@ -332,7 +334,19 @@ func TestBasicTokenFile(t *testing.T) {
t.Fatalf("Unexpected error: %v", err)
}

matchStringArg(token, clientConfig.BearerToken, t)
var out *http.Request
clientConfig.WrapTransport(fakeTransport(func(req *http.Request) (*http.Response, error) {
out = req
return &http.Response{}, nil
})).RoundTrip(&http.Request{})

matchStringArg(token, strings.TrimPrefix(out.Header.Get("Authorization"), "Bearer "), t)
}

type fakeTransport func(*http.Request) (*http.Response, error)

func (ft fakeTransport) RoundTrip(req *http.Request) (*http.Response, error) {
return ft(req)
}

func TestPrecedenceTokenFile(t *testing.T) {
Expand Down

0 comments on commit 718adb7

Please sign in to comment.