From 7343bbcc81dd704b85b6817bce7bee4f564f4415 Mon Sep 17 00:00:00 2001 From: Andrey Melnikov Date: Mon, 26 Apr 2021 13:15:46 -0700 Subject: [PATCH 1/6] feat: detect microk8s provider and offer suggestion for apply/status command to make sure correct kubeconfig is being used --- cmd/app.go | 27 +++++++++++++++++++++++++++ cmd/apply.go | 33 +++++++++++++++++++++++++++++---- util/dynamic_yaml.go | 19 +++++++++++++++++++ 3 files changed, 75 insertions(+), 4 deletions(-) diff --git a/cmd/app.go b/cmd/app.go index f14d722..20c1ee1 100644 --- a/cmd/app.go +++ b/cmd/app.go @@ -5,6 +5,7 @@ import ( opConfig "github.com/onepanelio/cli/config" "github.com/onepanelio/cli/util" "github.com/spf13/cobra" + "strings" ) var appCmd = &cobra.Command{ @@ -32,8 +33,34 @@ var statusCmd = &cobra.Command{ fmt.Println("Error parsing configuration file.") return } + + ready, err := util.DeploymentStatus(yamlFile) if err != nil { + if strings.Contains(err.Error(), "connection refused") { + yamlFile, yamlErr := util.LoadDynamicYamlFromFile(config.Spec.Params) + if yamlErr != nil { + fmt.Printf("Error reading file '%v' %v", config.Spec.Params, yamlErr.Error()) + return + } + + flatMap := yamlFile.FlattenToKeyValue(util.AppendDotFlatMapKeyFormatter) + provider, providerErr := util.GetYamlStringValue(flatMap, "application.provider") + if providerErr != nil { + fmt.Printf("Unable to read application.provider from params.yaml %v", providerErr.Error()) + return + } + if provider == nil { + fmt.Printf("application.provider is not set in params.yaml") + return + } + + if *provider == "microk8s" { + fmt.Printf("Unable to connect to cluster. Make sure you are running with \nKUBECONFIG=./kubeconfig opctl apply\nError: %v", err.Error()) + return + } + } + fmt.Println(err.Error()) return } diff --git a/cmd/apply.go b/cmd/apply.go index 3773789..170204f 100644 --- a/cmd/apply.go +++ b/cmd/apply.go @@ -75,17 +75,42 @@ var applyCmd = &cobra.Command{ resApp := "" errResApp := "" + resApp, errResApp, err = applyKubernetesFile(applicationKubernetesYamlFilePath) + if err != nil { + if strings.Contains(err.Error(), "connection refused") { + yamlFile, yamlErr := util.LoadDynamicYamlFromFile(config.Spec.Params) + if yamlErr != nil { + fmt.Printf("Error reading file '%v' %v", config.Spec.Params, yamlErr.Error()) + return + } + + flatMap := yamlFile.FlattenToKeyValue(util.AppendDotFlatMapKeyFormatter) + provider, providerErr := util.GetYamlStringValue(flatMap, "application.provider") + if providerErr != nil { + fmt.Printf("Unable to read application.provider from params.yaml %v", providerErr.Error()) + return + } + if provider == nil { + fmt.Printf("application.provider is not set in params.yaml") + return + } + + if *provider == "microk8s" { + fmt.Printf("Unable to connect to cluster. Make sure you are running with \nKUBECONFIG=./kubeconfig opctl apply\nError: %v", err.Error()) + return + } + } + + fmt.Printf("\nFailed: %v", err.Error()) + return + } log.Printf("res: %v", resApp) if errResApp != "" { log.Printf("err: %v", errResApp) } - if err != nil { - fmt.Printf("\nFailed: %v", err.Error()) - return - } //Once applied, verify the application is running before moving on with the rest //of the yaml. applicationRunning := false diff --git a/util/dynamic_yaml.go b/util/dynamic_yaml.go index 1500b1c..2d0346d 100644 --- a/util/dynamic_yaml.go +++ b/util/dynamic_yaml.go @@ -745,3 +745,22 @@ func NodeValueToActual(node *yaml.Node) (interface{}, error) { return value, nil } + +// GetYamlStringValue will attempt to get the key from the input mapping and return it as a lowercase string +// If the key does not exist, nil is returned, with no error +// If the value exists, but is not a string, an error is returned +func GetYamlStringValue(mapping map[string]interface{}, key string) (*string, error) { + value, ok := mapping[key] + if !ok { + return nil, nil + } + + valueString, okString := value.(string) + if !okString { + return nil, fmt.Errorf("value is not a string") + } + + result := strings.ToLower(valueString) + + return &result, nil +} \ No newline at end of file From 383da56de2cf4343e0b2c94bc0cf16a57e9bef8b Mon Sep 17 00:00:00 2001 From: Andrey Melnikov Date: Tue, 27 Apr 2021 11:28:47 -0700 Subject: [PATCH 2/6] fix: issue where error was not always "connection refused" --- cmd/app.go | 39 ++++++++++++++++++--------------------- cmd/apply.go | 38 ++++++++++++++++++-------------------- 2 files changed, 36 insertions(+), 41 deletions(-) diff --git a/cmd/app.go b/cmd/app.go index 20c1ee1..be23d1c 100644 --- a/cmd/app.go +++ b/cmd/app.go @@ -5,7 +5,6 @@ import ( opConfig "github.com/onepanelio/cli/config" "github.com/onepanelio/cli/util" "github.com/spf13/cobra" - "strings" ) var appCmd = &cobra.Command{ @@ -37,28 +36,26 @@ var statusCmd = &cobra.Command{ ready, err := util.DeploymentStatus(yamlFile) if err != nil { - if strings.Contains(err.Error(), "connection refused") { - yamlFile, yamlErr := util.LoadDynamicYamlFromFile(config.Spec.Params) - if yamlErr != nil { - fmt.Printf("Error reading file '%v' %v", config.Spec.Params, yamlErr.Error()) - return - } + yamlFile, yamlErr := util.LoadDynamicYamlFromFile(config.Spec.Params) + if yamlErr != nil { + fmt.Printf("Error reading file '%v' %v", config.Spec.Params, yamlErr.Error()) + return + } - flatMap := yamlFile.FlattenToKeyValue(util.AppendDotFlatMapKeyFormatter) - provider, providerErr := util.GetYamlStringValue(flatMap, "application.provider") - if providerErr != nil { - fmt.Printf("Unable to read application.provider from params.yaml %v", providerErr.Error()) - return - } - if provider == nil { - fmt.Printf("application.provider is not set in params.yaml") - return - } + flatMap := yamlFile.FlattenToKeyValue(util.AppendDotFlatMapKeyFormatter) + provider, providerErr := util.GetYamlStringValue(flatMap, "application.provider") + if providerErr != nil { + fmt.Printf("Unable to read application.provider from params.yaml %v", providerErr.Error()) + return + } + if provider == nil { + fmt.Printf("application.provider is not set in params.yaml") + return + } - if *provider == "microk8s" { - fmt.Printf("Unable to connect to cluster. Make sure you are running with \nKUBECONFIG=./kubeconfig opctl apply\nError: %v", err.Error()) - return - } + if *provider == "microk8s" { + fmt.Printf("Unable to connect to cluster. Make sure you are running with \nKUBECONFIG=./kubeconfig opctl apply\nError: %v", err.Error()) + return } fmt.Println(err.Error()) diff --git a/cmd/apply.go b/cmd/apply.go index 170204f..8283052 100644 --- a/cmd/apply.go +++ b/cmd/apply.go @@ -78,28 +78,26 @@ var applyCmd = &cobra.Command{ resApp, errResApp, err = applyKubernetesFile(applicationKubernetesYamlFilePath) if err != nil { - if strings.Contains(err.Error(), "connection refused") { - yamlFile, yamlErr := util.LoadDynamicYamlFromFile(config.Spec.Params) - if yamlErr != nil { - fmt.Printf("Error reading file '%v' %v", config.Spec.Params, yamlErr.Error()) - return - } + yamlFile, yamlErr := util.LoadDynamicYamlFromFile(config.Spec.Params) + if yamlErr != nil { + fmt.Printf("Error reading file '%v' %v", config.Spec.Params, yamlErr.Error()) + return + } - flatMap := yamlFile.FlattenToKeyValue(util.AppendDotFlatMapKeyFormatter) - provider, providerErr := util.GetYamlStringValue(flatMap, "application.provider") - if providerErr != nil { - fmt.Printf("Unable to read application.provider from params.yaml %v", providerErr.Error()) - return - } - if provider == nil { - fmt.Printf("application.provider is not set in params.yaml") - return - } + flatMap := yamlFile.FlattenToKeyValue(util.AppendDotFlatMapKeyFormatter) + provider, providerErr := util.GetYamlStringValue(flatMap, "application.provider") + if providerErr != nil { + fmt.Printf("Unable to read application.provider from params.yaml %v", providerErr.Error()) + return + } + if provider == nil { + fmt.Printf("application.provider is not set in params.yaml") + return + } - if *provider == "microk8s" { - fmt.Printf("Unable to connect to cluster. Make sure you are running with \nKUBECONFIG=./kubeconfig opctl apply\nError: %v", err.Error()) - return - } + if *provider == "microk8s" { + fmt.Printf("Unable to connect to cluster. Make sure you are running with \nKUBECONFIG=./kubeconfig opctl apply\nError: %v", err.Error()) + return } fmt.Printf("\nFailed: %v", err.Error()) From 43d99e327a0e107abca2f936ffba659b63ed7a98 Mon Sep 17 00:00:00 2001 From: Andrey Melnikov Date: Tue, 27 Apr 2021 11:36:31 -0700 Subject: [PATCH 3/6] fix: wrong command message --- cmd/app.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/app.go b/cmd/app.go index be23d1c..835d4da 100644 --- a/cmd/app.go +++ b/cmd/app.go @@ -54,7 +54,7 @@ var statusCmd = &cobra.Command{ } if *provider == "microk8s" { - fmt.Printf("Unable to connect to cluster. Make sure you are running with \nKUBECONFIG=./kubeconfig opctl apply\nError: %v", err.Error()) + fmt.Printf("Unable to connect to cluster. Make sure you are running with \nKUBECONFIG=./kubeconfig opctl app status\nError: %v", err.Error()) return } From b82f41751d68f3d779aa372c0fa1e6053a61946f Mon Sep 17 00:00:00 2001 From: Andrey Melnikov Date: Tue, 27 Apr 2021 11:55:16 -0700 Subject: [PATCH 4/6] feat: added microk8s check for auth token --- cmd/app.go | 1 - cmd/auth.go | 29 +++++++++++++++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/cmd/app.go b/cmd/app.go index 835d4da..b91a0b1 100644 --- a/cmd/app.go +++ b/cmd/app.go @@ -33,7 +33,6 @@ var statusCmd = &cobra.Command{ return } - ready, err := util.DeploymentStatus(yamlFile) if err != nil { yamlFile, yamlErr := util.LoadDynamicYamlFromFile(config.Spec.Params) diff --git a/cmd/auth.go b/cmd/auth.go index 71544fe..06df797 100644 --- a/cmd/auth.go +++ b/cmd/auth.go @@ -4,6 +4,7 @@ import ( "crypto/md5" "encoding/hex" "fmt" + opConfig "github.com/onepanelio/cli/config" "github.com/onepanelio/cli/util" "github.com/spf13/cobra" @@ -35,6 +36,34 @@ var tokenCmd = &cobra.Command{ } token, username, err := util.GetBearerToken(config, "", ServiceAccountName) if err != nil { + configFilePath := "config.yaml" + opConfig, opErr := opConfig.FromFile(configFilePath) + if opErr != nil { + fmt.Printf("Unable to read configuration file: %v", err.Error()) + return + } + yamlFile, yamlErr := util.LoadDynamicYamlFromFile(opConfig.Spec.Params) + if yamlErr != nil { + fmt.Printf("Error reading file '%v' %v", opConfig.Spec.Params, yamlErr.Error()) + return + } + + flatMap := yamlFile.FlattenToKeyValue(util.AppendDotFlatMapKeyFormatter) + provider, providerErr := util.GetYamlStringValue(flatMap, "application.provider") + if providerErr != nil { + fmt.Printf("Unable to read application.provider from params.yaml %v", providerErr.Error()) + return + } + if provider == nil { + fmt.Printf("application.provider is not set in params.yaml") + return + } + + if *provider == "microk8s" { + fmt.Printf("Unable to connect to cluster. Make sure you are running with \nKUBECONFIG=./kubeconfig opctl auth token\nError: %v", err.Error()) + return + } + fmt.Printf("Error encountered for user %s: %s\n", username, err.Error()) } From 38bebe68a7b0a609fb2e59f43a9e01cdbadd6d6b Mon Sep 17 00:00:00 2001 From: Andrey Melnikov Date: Tue, 27 Apr 2021 12:25:03 -0700 Subject: [PATCH 5/6] fix: double message for microk8s provider on app status --- util/kubectl.go | 1 + 1 file changed, 1 insertion(+) diff --git a/util/kubectl.go b/util/kubectl.go index 5a43847..7b24d21 100644 --- a/util/kubectl.go +++ b/util/kubectl.go @@ -256,6 +256,7 @@ func GetClusterIp(url string) { hostsPath = "C:\\Windows\\System32\\Drivers\\etc\\hosts" } + dnsRecordMessage = "local" fmt.Printf("\nIn your %v file, add %v and point it to %v\n", hostsPath, stdout, fqdn) } else { dnsRecordMessage = "an A" From 8ff71d6d24214ad4ba9905010fabc37e0d5e4769 Mon Sep 17 00:00:00 2001 From: Andrey Melnikov Date: Tue, 27 Apr 2021 12:49:48 -0700 Subject: [PATCH 6/6] fix: issue with getting token causing a panic instead of error message --- cmd/auth.go | 9 +++++++-- util/kubeconfig.go | 7 ++----- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/cmd/auth.go b/cmd/auth.go index 06df797..9c3fbbc 100644 --- a/cmd/auth.go +++ b/cmd/auth.go @@ -30,7 +30,12 @@ var tokenCmd = &cobra.Command{ Long: "Get a token for a given provider. Google Cloud Platform is different from minikube, for example.", Example: "auth token", Run: func(cmd *cobra.Command, args []string) { - config := util.NewConfig() + config, err := util.NewConfig() + if err != nil { + fmt.Printf("Error getting kubernetes configuration: %v", err.Error()) + return + } + if ServiceAccountName == "" { ServiceAccountName = "admin" } @@ -60,7 +65,7 @@ var tokenCmd = &cobra.Command{ } if *provider == "microk8s" { - fmt.Printf("Unable to connect to cluster. Make sure you are running with \nKUBECONFIG=./kubeconfig opctl auth token\nError: %v", err.Error()) + fmt.Printf("Make sure you are running with \nKUBECONFIG=./kubeconfig opctl auth token\nError: %v", err.Error()) return } diff --git a/util/kubeconfig.go b/util/kubeconfig.go index 59a2f82..57c40d3 100644 --- a/util/kubeconfig.go +++ b/util/kubeconfig.go @@ -16,12 +16,9 @@ import ( type Config = restclient.Config -func NewConfig() (config *Config) { - config, err := clientcmd.NewNonInteractiveDeferredLoadingClientConfig( +func NewConfig() (config *Config, err error) { + config, err = clientcmd.NewNonInteractiveDeferredLoadingClientConfig( clientcmd.NewDefaultClientConfigLoadingRules(), &clientcmd.ConfigOverrides{}).ClientConfig() - if err != nil { - panic(err) - } return }