@@ -3,7 +3,6 @@ package kube
33import (
44 "encoding/base64"
55 "fmt"
6- "io/ioutil"
76 "os"
87 "path/filepath"
98 "strings"
@@ -22,6 +21,7 @@ import (
2221 "k8s.io/client-go/rest"
2322 "k8s.io/client-go/restmapper"
2423 "k8s.io/client-go/tools/clientcmd"
24+ "k8s.io/client-go/tools/clientcmd/api"
2525
2626 "github.com/werf/kubedog/pkg/utils"
2727)
@@ -81,6 +81,13 @@ type KubeConfigOptions struct {
8181 ConfigPath string
8282 ConfigDataBase64 string
8383 ConfigPathMergeList []string
84+
85+ BearerToken string
86+ BearerTokenFile string
87+
88+ APIServerURL string
89+ Insecure bool
90+ CADataBase64 string
8491}
8592
8693type KubeConfig struct {
@@ -91,8 +98,9 @@ type KubeConfig struct {
9198
9299func GetKubeConfig (opts KubeConfigOptions ) (* KubeConfig , error ) {
93100 // Try to load from kubeconfig in flags or from ~/.kube/config
94- config , outOfClusterErr := getOutOfClusterConfig (opts .Context , opts .ConfigPath , opts .ConfigDataBase64 , opts .ConfigPathMergeList )
95-
101+ config , outOfClusterErr := getOutOfClusterConfig (
102+ opts ,
103+ )
96104 if config == nil {
97105 if hasInClusterConfig () {
98106 // Try to configure as inCluster
@@ -124,6 +132,12 @@ type GetAllContextsClientsOptions struct {
124132 ConfigPath string
125133 ConfigDataBase64 string
126134 ConfigPathMergeList []string
135+ BearerToken string
136+ BearerTokenFile string
137+
138+ APIServerURL string
139+ Insecure bool
140+ CADataBase64 string
127141}
128142
129143type ContextClient struct {
@@ -135,8 +149,12 @@ type ContextClient struct {
135149func GetAllContextsClients (opts GetAllContextsClientsOptions ) ([]* ContextClient , error ) {
136150 // Try to load contexts from kubeconfig in flags or from ~/.kube/config
137151 var outOfClusterErr error
138- contexts , outOfClusterErr := getOutOfClusterContextsClients (opts .ConfigPath , opts .ConfigDataBase64 , opts .ConfigPathMergeList )
139- // return if contexts are loaded successfully
152+
153+ contexts , outOfClusterErr := getOutOfClusterContextsClients (KubeConfigOptions {
154+ ConfigPath : opts .ConfigPath ,
155+ ConfigDataBase64 : opts .ConfigDataBase64 ,
156+ ConfigPathMergeList : opts .ConfigPathMergeList ,
157+ })
140158 if len (contexts ) > 0 {
141159 return contexts , nil
142160 }
@@ -146,10 +164,26 @@ func GetAllContextsClients(opts GetAllContextsClientsOptions) ([]*ContextClient,
146164 if err != nil {
147165 return nil , err
148166 }
149-
150167 return []* ContextClient {contextClient }, nil
151168 }
152- // if not in cluster return outOfCluster error
169+
170+ tokenClient , err := getTokenContextClient (KubeConfigOptions {
171+ ConfigPath : opts .ConfigPath ,
172+ ConfigDataBase64 : opts .ConfigDataBase64 ,
173+ ConfigPathMergeList : opts .ConfigPathMergeList ,
174+ BearerToken : opts .BearerToken ,
175+ BearerTokenFile : opts .BearerTokenFile ,
176+ APIServerURL : opts .APIServerURL ,
177+ Insecure : opts .Insecure ,
178+ CADataBase64 : opts .CADataBase64 ,
179+ })
180+ if err != nil {
181+ return nil , err
182+ }
183+ if tokenClient != nil {
184+ return []* ContextClient {tokenClient }, nil
185+ }
186+
153187 if outOfClusterErr != nil {
154188 return nil , outOfClusterErr
155189 }
@@ -179,8 +213,7 @@ func setConfigPathMergeListEnvironment(configPathMergeList []string) error {
179213 return nil
180214}
181215
182- func GetClientConfig (context , configPath string , configData []byte , configPathMergeList []string ) (clientcmd.ClientConfig , error ) {
183- overrides := & clientcmd.ConfigOverrides {ClusterDefaults : clientcmd .ClusterDefaults }
216+ func GetClientConfig (context , configPath string , configData []byte , configPathMergeList []string , overrides * clientcmd.ConfigOverrides ) (clientcmd.ClientConfig , error ) {
184217 if context != "" {
185218 overrides .CurrentContext = context
186219 }
@@ -229,17 +262,35 @@ func parseConfigDataBase64(configDataBase64 string) ([]byte, error) {
229262 return configData , nil
230263}
231264
232- func getOutOfClusterConfig (context , configPath , configDataBase64 string , configPathMergeList [] string ) (* KubeConfig , error ) {
265+ func getOutOfClusterConfig (opts KubeConfigOptions ) (* KubeConfig , error ) {
233266 res := & KubeConfig {}
234267
235- configData , err := parseConfigDataBase64 (configDataBase64 )
268+ configData , err := parseConfigDataBase64 (opts . ConfigDataBase64 )
236269 if err != nil {
237270 return nil , fmt .Errorf ("unable to parse base64 config data: %w" , err )
238271 }
239272
240- clientConfig , err := GetClientConfig (context , configPath , configData , configPathMergeList )
273+ overrides := & clientcmd.ConfigOverrides {
274+ ClusterDefaults : clientcmd .ClusterDefaults ,
275+ AuthInfo : api.AuthInfo {
276+ Token : opts .BearerToken ,
277+ TokenFile : opts .BearerTokenFile ,
278+ },
279+ }
280+
281+ if opts .Context != "" {
282+ overrides .CurrentContext = opts .Context
283+ }
284+
285+ clientConfig , err := GetClientConfig (
286+ opts .Context ,
287+ opts .ConfigPath ,
288+ configData ,
289+ opts .ConfigPathMergeList ,
290+ overrides ,
291+ )
241292 if err != nil {
242- return nil , makeOutOfClusterClientConfigError (configPath , context , err )
293+ return nil , makeOutOfClusterClientConfigError (opts . ConfigDataBase64 , opts . Context , err )
243294 }
244295
245296 if ns , _ , err := clientConfig .Namespace (); err != nil {
@@ -250,35 +301,50 @@ func getOutOfClusterConfig(context, configPath, configDataBase64 string, configP
250301
251302 config , err := clientConfig .ClientConfig ()
252303 if err != nil {
253- return nil , makeOutOfClusterClientConfigError (configPath , context , err )
304+ return nil , makeOutOfClusterClientConfigError (opts . ConfigDataBase64 , opts . Context , err )
254305 }
255306 if config == nil {
256307 return nil , nil
257308 }
309+
258310 res .Config = config
259311
260- if context == "" {
312+ if opts . Context == "" {
261313 if rc , err := clientConfig .RawConfig (); err != nil {
262314 return nil , fmt .Errorf ("cannot get raw kubernetes config: %w" , err )
263315 } else {
264316 res .Context = rc .CurrentContext
265317 }
266318 } else {
267- res .Context = context
319+ res .Context = opts . Context
268320 }
269321
270322 return res , nil
271323}
272324
273- func getOutOfClusterContextsClients (configPath , configDataBase64 string , configPathMergeList [] string ) ([]* ContextClient , error ) {
325+ func getOutOfClusterContextsClients (opts KubeConfigOptions ) ([]* ContextClient , error ) {
274326 var res []* ContextClient
275327
276- configData , err := parseConfigDataBase64 (configDataBase64 )
328+ configData , err := parseConfigDataBase64 (opts . ConfigDataBase64 )
277329 if err != nil {
278330 return nil , fmt .Errorf ("unable to parse base64 config data: %w" , err )
279331 }
280332
281- clientConfig , err := GetClientConfig ("" , configPath , configData , configPathMergeList )
333+ overrides := & clientcmd.ConfigOverrides {
334+ ClusterDefaults : clientcmd .ClusterDefaults ,
335+ AuthInfo : api.AuthInfo {
336+ Token : opts .BearerToken ,
337+ TokenFile : opts .BearerTokenFile ,
338+ },
339+ }
340+
341+ clientConfig , err := GetClientConfig (
342+ opts .Context ,
343+ opts .ConfigPath ,
344+ configData ,
345+ opts .ConfigPathMergeList ,
346+ overrides ,
347+ )
282348 if err != nil {
283349 return nil , err
284350 }
@@ -289,14 +355,20 @@ func getOutOfClusterContextsClients(configPath, configDataBase64 string, configP
289355 }
290356
291357 for contextName , context := range rc .Contexts {
292- clientConfig , err := GetClientConfig (contextName , configPath , configData , configPathMergeList )
358+ clientConfig , err := GetClientConfig (
359+ opts .Context ,
360+ opts .ConfigPath ,
361+ configData ,
362+ opts .ConfigPathMergeList ,
363+ overrides ,
364+ )
293365 if err != nil {
294- return nil , makeOutOfClusterClientConfigError (configPath , contextName , err )
366+ return nil , makeOutOfClusterClientConfigError (opts . ConfigPath , contextName , err )
295367 }
296368
297369 config , err := clientConfig .ClientConfig ()
298370 if err != nil {
299- return nil , makeOutOfClusterClientConfigError (configPath , contextName , err )
371+ return nil , makeOutOfClusterClientConfigError (opts . ConfigPath , contextName , err )
300372 }
301373
302374 clientset , err := kubernetes .NewForConfig (config )
@@ -323,7 +395,7 @@ func getInClusterConfig() (*KubeConfig, error) {
323395 res .Config = config
324396 }
325397
326- if data , err := ioutil .ReadFile (kubeNamespaceFilePath ); err != nil {
398+ if data , err := os .ReadFile (kubeNamespaceFilePath ); err != nil {
327399 return nil , fmt .Errorf ("in-cluster configuration problem: cannot determine default kubernetes namespace: error reading %s: %w" , kubeNamespaceFilePath , err )
328400 } else {
329401 res .DefaultNamespace = string (data )
@@ -403,3 +475,29 @@ func restMapper(cachedDiscoveryClient *discovery.CachedDiscoveryInterface) meta.
403475 fmt .Printf (s )
404476 })
405477}
478+
479+ func getTokenContextClient (opts KubeConfigOptions ) (* ContextClient , error ) {
480+ if opts .BearerToken == "" || opts .APIServerURL == "" {
481+ return nil , fmt .Errorf ("cannot create client: missing token or API server URL" )
482+ }
483+
484+ cfg := & rest.Config {
485+ Host : opts .APIServerURL ,
486+ BearerToken : opts .BearerToken ,
487+ TLSClientConfig : rest.TLSClientConfig {
488+ Insecure : opts .Insecure ,
489+ CAData : []byte (opts .CADataBase64 ),
490+ },
491+ }
492+
493+ clientset , err := kubernetes .NewForConfig (cfg )
494+ if err != nil {
495+ return nil , fmt .Errorf ("cannot create kubernetes client: %w" , err )
496+ }
497+
498+ return & ContextClient {
499+ ContextName : "token" ,
500+ ContextNamespace : "" ,
501+ Client : clientset ,
502+ }, nil
503+ }
0 commit comments