diff --git a/cli/cmd/logs.go b/cli/cmd/logs.go index 6c3bde0f4..16c626f33 100644 --- a/cli/cmd/logs.go +++ b/cli/cmd/logs.go @@ -19,8 +19,9 @@ var logsCmd = &cobra.Command{ RunE: func(cmd *cobra.Command, args []string) error { go telemetry.ReportRun("logs", config.Config.Logs) - kubernetesProvider, err := kubernetes.NewProvider(config.Config.KubeConfigPath) + kubernetesProvider, err := kubernetes.NewProvider(config.Config.KubeConfigPath()) if err != nil { + logger.Log.Error(err) return nil } ctx, _ := context.WithCancel(context.Background()) diff --git a/cli/cmd/tapRunner.go b/cli/cmd/tapRunner.go index 0045cb438..933090ef7 100644 --- a/cli/cmd/tapRunner.go +++ b/cli/cmd/tapRunner.go @@ -62,7 +62,7 @@ func RunMizuTap() { } } - kubernetesProvider, err := kubernetes.NewProvider(config.Config.KubeConfigPath) + kubernetesProvider, err := kubernetes.NewProvider(config.Config.KubeConfigPath()) if err != nil { logger.Log.Error(err) return diff --git a/cli/cmd/viewRunner.go b/cli/cmd/viewRunner.go index 16b299a43..8aa419092 100644 --- a/cli/cmd/viewRunner.go +++ b/cli/cmd/viewRunner.go @@ -13,7 +13,7 @@ import ( ) func runMizuView() { - kubernetesProvider, err := kubernetes.NewProvider(config.Config.KubeConfigPath) + kubernetesProvider, err := kubernetes.NewProvider(config.Config.KubeConfigPath()) if err != nil { logger.Log.Error(err) return diff --git a/cli/config/configStruct.go b/cli/config/configStruct.go index 503984d1e..aa4de7944 100644 --- a/cli/config/configStruct.go +++ b/cli/config/configStruct.go @@ -5,6 +5,9 @@ import ( "github.com/up9inc/mizu/cli/config/configStructs" "github.com/up9inc/mizu/cli/mizu" v1 "k8s.io/api/core/v1" + "k8s.io/client-go/util/homedir" + "os" + "path/filepath" ) const ( @@ -23,7 +26,7 @@ type ConfigStruct struct { MizuResourcesNamespace string `yaml:"mizu-resources-namespace" default:"mizu"` Telemetry bool `yaml:"telemetry" default:"true"` DumpLogs bool `yaml:"dump-logs" default:"false"` - KubeConfigPath string `yaml:"kube-config-path"` + KubeConfigPathStr string `yaml:"kube-config-path"` } func (config *ConfigStruct) SetDefaults() { @@ -37,3 +40,17 @@ func (config *ConfigStruct) ImagePullPolicy() v1.PullPolicy { func (config *ConfigStruct) IsNsRestrictedMode() bool { return config.MizuResourcesNamespace != "mizu" // Notice "mizu" string must match the default MizuResourcesNamespace } + +func (config *ConfigStruct) KubeConfigPath() string { + if config.KubeConfigPathStr != "" { + return config.KubeConfigPathStr + } + + envKubeConfigPath := os.Getenv("KUBECONFIG") + if envKubeConfigPath != "" { + return envKubeConfigPath + } + + home := homedir.HomeDir() + return filepath.Join(home, ".kube", "config") +} diff --git a/cli/kubernetes/provider.go b/cli/kubernetes/provider.go index 81ef70a45..1603b1307 100644 --- a/cli/kubernetes/provider.go +++ b/cli/kubernetes/provider.go @@ -9,7 +9,6 @@ import ( "fmt" "github.com/up9inc/mizu/cli/config/configStructs" "github.com/up9inc/mizu/cli/logger" - "os" "path/filepath" "regexp" "strconv" @@ -38,7 +37,6 @@ import ( "k8s.io/client-go/tools/clientcmd" _ "k8s.io/client-go/tools/portforward" watchtools "k8s.io/client-go/tools/watch" - "k8s.io/client-go/util/homedir" ) type Provider struct { @@ -57,13 +55,23 @@ func NewProvider(kubeConfigPath string) (*Provider, error) { restClientConfig, err := kubernetesConfig.ClientConfig() if err != nil { if clientcmd.IsEmptyConfig(err) { - return nil, fmt.Errorf("Couldn't find the kube config file, or file is empty. Try adding '--kube-config='\n") + return nil, fmt.Errorf("couldn't find the kube config file, or file is empty (%s)\n" + + "you can set alternative kube config file path by adding the kube-config-path field to the mizu config file, err: %w", kubeConfigPath, err) } if clientcmd.IsConfigurationInvalid(err) { - return nil, fmt.Errorf("Invalid kube config file. Try using a different config with '--kube-config='\n") + return nil, fmt.Errorf("invalid kube config file (%s)\n" + + "you can set alternative kube config file path by adding the kube-config-path field to the mizu config file, err: %w", kubeConfigPath, err) } + + return nil, fmt.Errorf("error while using kube config (%s)\n" + + "you can set alternative kube config file path by adding the kube-config-path field to the mizu config file, err: %w", kubeConfigPath, err) + } + + clientSet, err := getClientSet(restClientConfig) + if err != nil { + return nil, fmt.Errorf("error while using kube config (%s)\n" + + "you can set alternative kube config file path by adding the kube-config-path field to the mizu config file, err: %w", kubeConfigPath, err) } - clientSet := getClientSet(restClientConfig) return &Provider{ clientSet: clientSet, @@ -731,24 +739,16 @@ func (provider *Provider) GetPodLogs(namespace string, podName string, ctx conte return str, nil } -func getClientSet(config *restclient.Config) *kubernetes.Clientset { +func getClientSet(config *restclient.Config) (*kubernetes.Clientset, error) { clientSet, err := kubernetes.NewForConfig(config) if err != nil { - panic(err.Error()) + return nil, err } - return clientSet + + return clientSet, nil } func loadKubernetesConfiguration(kubeConfigPath string) clientcmd.ClientConfig { - if kubeConfigPath == "" { - kubeConfigPath = os.Getenv("KUBECONFIG") - } - - if kubeConfigPath == "" { - home := homedir.HomeDir() - kubeConfigPath = filepath.Join(home, ".kube", "config") - } - logger.Log.Debugf("Using kube config %s", kubeConfigPath) configPathList := filepath.SplitList(kubeConfigPath) configLoadingRules := &clientcmd.ClientConfigLoadingRules{}