Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
88 changes: 67 additions & 21 deletions pkg/kube/kube.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ package kube
import (
"encoding/base64"
"fmt"
"io/ioutil"
"os"
"path/filepath"
"strings"
Expand All @@ -22,6 +21,7 @@ import (
"k8s.io/client-go/rest"
"k8s.io/client-go/restmapper"
"k8s.io/client-go/tools/clientcmd"
"k8s.io/client-go/tools/clientcmd/api"

"github.com/werf/kubedog/pkg/utils"
)
Expand Down Expand Up @@ -81,6 +81,9 @@ type KubeConfigOptions struct {
ConfigPath string
ConfigDataBase64 string
ConfigPathMergeList []string

BearerToken string
BearerTokenFile string
}

type KubeConfig struct {
Expand All @@ -91,8 +94,9 @@ type KubeConfig struct {

func GetKubeConfig(opts KubeConfigOptions) (*KubeConfig, error) {
// Try to load from kubeconfig in flags or from ~/.kube/config
config, outOfClusterErr := getOutOfClusterConfig(opts.Context, opts.ConfigPath, opts.ConfigDataBase64, opts.ConfigPathMergeList)

config, outOfClusterErr := getOutOfClusterConfig(
opts,
)
if config == nil {
if hasInClusterConfig() {
// Try to configure as inCluster
Expand Down Expand Up @@ -135,8 +139,11 @@ type ContextClient struct {
func GetAllContextsClients(opts GetAllContextsClientsOptions) ([]*ContextClient, error) {
// Try to load contexts from kubeconfig in flags or from ~/.kube/config
var outOfClusterErr error
contexts, outOfClusterErr := getOutOfClusterContextsClients(opts.ConfigPath, opts.ConfigDataBase64, opts.ConfigPathMergeList)
// return if contexts are loaded successfully
contexts, outOfClusterErr := getOutOfClusterContextsClients(KubeConfigOptions{
ConfigPath: opts.ConfigPath,
ConfigDataBase64: opts.ConfigDataBase64,
ConfigPathMergeList: opts.ConfigPathMergeList,
})
if len(contexts) > 0 {
return contexts, nil
}
Expand Down Expand Up @@ -179,8 +186,8 @@ func setConfigPathMergeListEnvironment(configPathMergeList []string) error {
return nil
}

func GetClientConfig(context, configPath string, configData []byte, configPathMergeList []string) (clientcmd.ClientConfig, error) {
overrides := &clientcmd.ConfigOverrides{ClusterDefaults: clientcmd.ClusterDefaults}
func GetClientConfig(context, configPath string, configData []byte, configPathMergeList []string, overrides *clientcmd.ConfigOverrides) (clientcmd.ClientConfig, error) {

if context != "" {
overrides.CurrentContext = context
}
Expand Down Expand Up @@ -229,17 +236,35 @@ func parseConfigDataBase64(configDataBase64 string) ([]byte, error) {
return configData, nil
}

func getOutOfClusterConfig(context, configPath, configDataBase64 string, configPathMergeList []string) (*KubeConfig, error) {
func getOutOfClusterConfig(opts KubeConfigOptions) (*KubeConfig, error) {
res := &KubeConfig{}

configData, err := parseConfigDataBase64(configDataBase64)
configData, err := parseConfigDataBase64(opts.ConfigDataBase64)
if err != nil {
return nil, fmt.Errorf("unable to parse base64 config data: %w", err)
}

clientConfig, err := GetClientConfig(context, configPath, configData, configPathMergeList)
overrides := &clientcmd.ConfigOverrides{
ClusterDefaults: clientcmd.ClusterDefaults,
AuthInfo: api.AuthInfo{
Token: opts.BearerToken,
TokenFile: opts.BearerTokenFile,
},
}

if opts.Context != "" {
overrides.CurrentContext = opts.Context
}

clientConfig, err := GetClientConfig(
opts.Context,
opts.ConfigPath,
configData,
opts.ConfigPathMergeList,
overrides,
)
if err != nil {
return nil, makeOutOfClusterClientConfigError(configPath, context, err)
return nil, makeOutOfClusterClientConfigError(opts.ConfigDataBase64, opts.Context, err)
}

if ns, _, err := clientConfig.Namespace(); err != nil {
Expand All @@ -250,35 +275,50 @@ func getOutOfClusterConfig(context, configPath, configDataBase64 string, configP

config, err := clientConfig.ClientConfig()
if err != nil {
return nil, makeOutOfClusterClientConfigError(configPath, context, err)
return nil, makeOutOfClusterClientConfigError(opts.ConfigDataBase64, opts.Context, err)
}
if config == nil {
return nil, nil
}

res.Config = config

if context == "" {
if opts.Context == "" {
if rc, err := clientConfig.RawConfig(); err != nil {
return nil, fmt.Errorf("cannot get raw kubernetes config: %w", err)
} else {
res.Context = rc.CurrentContext
}
} else {
res.Context = context
res.Context = opts.Context
}

return res, nil
}

func getOutOfClusterContextsClients(configPath, configDataBase64 string, configPathMergeList []string) ([]*ContextClient, error) {
func getOutOfClusterContextsClients(opts KubeConfigOptions) ([]*ContextClient, error) {
var res []*ContextClient

configData, err := parseConfigDataBase64(configDataBase64)
configData, err := parseConfigDataBase64(opts.ConfigDataBase64)
if err != nil {
return nil, fmt.Errorf("unable to parse base64 config data: %w", err)
}

clientConfig, err := GetClientConfig("", configPath, configData, configPathMergeList)
overrides := &clientcmd.ConfigOverrides{
ClusterDefaults: clientcmd.ClusterDefaults,
AuthInfo: api.AuthInfo{
Token: opts.BearerToken,
TokenFile: opts.BearerTokenFile,
},
}

clientConfig, err := GetClientConfig(
opts.Context,
opts.ConfigPath,
configData,
opts.ConfigPathMergeList,
overrides,
)
if err != nil {
return nil, err
}
Expand All @@ -289,14 +329,20 @@ func getOutOfClusterContextsClients(configPath, configDataBase64 string, configP
}

for contextName, context := range rc.Contexts {
clientConfig, err := GetClientConfig(contextName, configPath, configData, configPathMergeList)
clientConfig, err := GetClientConfig(
opts.Context,
opts.ConfigPath,
configData,
opts.ConfigPathMergeList,
overrides,
)
if err != nil {
return nil, makeOutOfClusterClientConfigError(configPath, contextName, err)
return nil, makeOutOfClusterClientConfigError(opts.ConfigPath, contextName, err)
}

config, err := clientConfig.ClientConfig()
if err != nil {
return nil, makeOutOfClusterClientConfigError(configPath, contextName, err)
return nil, makeOutOfClusterClientConfigError(opts.ConfigPath, contextName, err)
}

clientset, err := kubernetes.NewForConfig(config)
Expand All @@ -323,7 +369,7 @@ func getInClusterConfig() (*KubeConfig, error) {
res.Config = config
}

if data, err := ioutil.ReadFile(kubeNamespaceFilePath); err != nil {
if data, err := os.ReadFile(kubeNamespaceFilePath); err != nil {
return nil, fmt.Errorf("in-cluster configuration problem: cannot determine default kubernetes namespace: error reading %s: %w", kubeNamespaceFilePath, err)
} else {
res.DefaultNamespace = string(data)
Expand Down
2 changes: 1 addition & 1 deletion pkg/kube/kube_config_getter.go
Original file line number Diff line number Diff line change
Expand Up @@ -169,6 +169,6 @@ func (getter *ClientGetterFromConfigData) getRawKubeConfigLoader() (clientcmd.Cl
if data, err := base64.StdEncoding.DecodeString(getter.ConfigDataBase64); err != nil {
return nil, fmt.Errorf("unable to decode base64 config data: %w", err)
} else {
return GetClientConfig(getter.Context, "", data, nil)
return GetClientConfig(getter.Context, "", data, nil, nil)
}
}
Loading