Skip to content

Commit d2aee7a

Browse files
authored
feat(kube): add support for kube token (#387)
1 parent 304218f commit d2aee7a

File tree

2 files changed

+122
-24
lines changed

2 files changed

+122
-24
lines changed

pkg/kube/kube.go

Lines changed: 121 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ package kube
33
import (
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

8693
type KubeConfig struct {
@@ -91,8 +98,9 @@ type KubeConfig struct {
9198

9299
func 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

129143
type ContextClient struct {
@@ -135,8 +149,12 @@ type ContextClient struct {
135149
func 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+
}

pkg/kube/kube_config_getter.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,6 @@ func (getter *ClientGetterFromConfigData) getRawKubeConfigLoader() (clientcmd.Cl
169169
if data, err := base64.StdEncoding.DecodeString(getter.ConfigDataBase64); err != nil {
170170
return nil, fmt.Errorf("unable to decode base64 config data: %w", err)
171171
} else {
172-
return GetClientConfig(getter.Context, "", data, nil)
172+
return GetClientConfig(getter.Context, "", data, nil, nil)
173173
}
174174
}

0 commit comments

Comments
 (0)