@@ -25,6 +25,7 @@ import (
25
25
"time"
26
26
27
27
authenticationv1 "k8s.io/api/authentication/v1"
28
+ apierrors "k8s.io/apimachinery/pkg/api/errors"
28
29
"k8s.io/apimachinery/pkg/types"
29
30
"k8s.io/apimachinery/pkg/util/clock"
30
31
"k8s.io/apimachinery/pkg/util/wait"
@@ -39,12 +40,35 @@ const (
39
40
40
41
// NewManager returns a new token manager.
41
42
func NewManager (c clientset.Interface ) * Manager {
43
+ // check whether the server supports token requests so we can give a more helpful error message
44
+ supported := false
45
+ once := & sync.Once {}
46
+ tokenRequestsSupported := func () bool {
47
+ once .Do (func () {
48
+ resources , err := c .Discovery ().ServerResourcesForGroupVersion ("v1" )
49
+ if err != nil {
50
+ return
51
+ }
52
+ for _ , resource := range resources .APIResources {
53
+ if resource .Name == "serviceaccounts/token" {
54
+ supported = true
55
+ return
56
+ }
57
+ }
58
+ })
59
+ return supported
60
+ }
61
+
42
62
m := & Manager {
43
63
getToken : func (name , namespace string , tr * authenticationv1.TokenRequest ) (* authenticationv1.TokenRequest , error ) {
44
64
if c == nil {
45
65
return nil , errors .New ("cannot use TokenManager when kubelet is in standalone mode" )
46
66
}
47
- return c .CoreV1 ().ServiceAccounts (namespace ).CreateToken (name , tr )
67
+ tokenRequest , err := c .CoreV1 ().ServiceAccounts (namespace ).CreateToken (name , tr )
68
+ if apierrors .IsNotFound (err ) && ! tokenRequestsSupported () {
69
+ return nil , fmt .Errorf ("the API server does not have TokenRequest endpoints enabled" )
70
+ }
71
+ return tokenRequest , err
48
72
},
49
73
cache : make (map [string ]* authenticationv1.TokenRequest ),
50
74
clock : clock.RealClock {},
0 commit comments