From c01ff7bec5bc08d831cb38b41d05e1ac0d0997c0 Mon Sep 17 00:00:00 2001 From: Alero Awani Date: Fri, 13 Sep 2024 00:46:18 +0100 Subject: [PATCH 1/3] Allow minify when meshery is installed in-cluster with minikube--author=Alero Awani Signed-off-by: Alero Awani --- utils/kubernetes/client.go | 49 ++++++++++++++++++++++++++++---------- 1 file changed, 36 insertions(+), 13 deletions(-) diff --git a/utils/kubernetes/client.go b/utils/kubernetes/client.go index 146da142..be95809d 100644 --- a/utils/kubernetes/client.go +++ b/utils/kubernetes/client.go @@ -32,40 +32,63 @@ func DetectKubeConfig(configfile []byte) (config *rest.Config, err error) { // Look for kubeconfig from the path mentioned in $KUBECONFIG kubeconfig := os.Getenv("KUBECONFIG") if kubeconfig != "" { - if config, err = clientcmd.BuildConfigFromFlags("", kubeconfig); err == nil { + cfgFile, err := processConfigFromFileLocation(kubeconfig) + if err != nil { + return nil, err + } + if config, err = clientcmd.RESTConfigFromKubeConfig(cfgFile); err == nil { return config, err } } // Look for kubeconfig at the default path path := filepath.Join(utils.GetHome(), ".kube", "config") - if config, err = clientcmd.BuildConfigFromFlags("", path); err == nil { + cfgFile, err := processConfigFromFileLocation(path) + if err != nil { + return nil, err + } + if config, err = clientcmd.RESTConfigFromKubeConfig(cfgFile); err == nil { return config, err } return } -func processConfig(configFile []byte) ([]byte, error) { - cfg, err := clientcmd.Load(configFile) - if err != nil { - return nil, ErrLoadConfig(err) +// processConfigInternal performs the common processing steps on the kubeconfig. +func processConfigInternal(cfg *clientcmdapi.Config) ([]byte, error) { + // Minify the kubeconfig + if err := clientcmdapi.MinifyConfig(cfg); err != nil { + return nil, ErrValidateConfig(err) } - err = clientcmdapi.MinifyConfig(cfg) - if err != nil { + // Flatten the kubeconfig + if err := clientcmdapi.FlattenConfig(cfg); err != nil { return nil, ErrValidateConfig(err) } - err = clientcmdapi.FlattenConfig(cfg) - if err != nil { + // Validate the kubeconfig + if err := clientcmd.Validate(*cfg); err != nil { return nil, ErrValidateConfig(err) } - err = clientcmd.Validate(*cfg) + // Write the processed kubeconfig to a byte slice + return clientcmd.Write(*cfg) +} + +// processConfigFromFileLocation processes the kubeconfig from a file location. +func processConfigFromFileLocation(filename string) ([]byte, error) { + cfg, err := clientcmd.LoadFromFile(filename) if err != nil { - return nil, ErrValidateConfig(err) + return nil, ErrLoadConfig(err) } + return processConfigInternal(cfg) +} - return clientcmd.Write(*cfg) +// processConfig processes the kubeconfig provided as a byte slice. +func processConfig(configFile []byte) ([]byte, error) { + cfg, err := clientcmd.Load(configFile) + if err != nil { + return nil, ErrLoadConfig(err) + } + return processConfigInternal(cfg) } From a6ad2c3e31bd888ddef0e302c912c9ffe6628dba Mon Sep 17 00:00:00 2001 From: Alero Awani Date: Sun, 15 Sep 2024 02:28:59 +0100 Subject: [PATCH 2/3] Create central function in meshkit for processing Kubeconfig files--author=Alero Awani Signed-off-by: Alero Awani --- utils/kubernetes/client.go | 69 +++++++++++++++++++++----------------- 1 file changed, 39 insertions(+), 30 deletions(-) diff --git a/utils/kubernetes/client.go b/utils/kubernetes/client.go index be95809d..9180254e 100644 --- a/utils/kubernetes/client.go +++ b/utils/kubernetes/client.go @@ -14,7 +14,8 @@ import ( func DetectKubeConfig(configfile []byte) (config *rest.Config, err error) { if len(configfile) > 0 { var cfgFile []byte - cfgFile, err = processConfig(configfile) + + _, cfgFile, err = ProcessConfig(configfile, "") if err != nil { return nil, err } @@ -32,7 +33,7 @@ func DetectKubeConfig(configfile []byte) (config *rest.Config, err error) { // Look for kubeconfig from the path mentioned in $KUBECONFIG kubeconfig := os.Getenv("KUBECONFIG") if kubeconfig != "" { - cfgFile, err := processConfigFromFileLocation(kubeconfig) + _, cfgFile, err := ProcessConfig(kubeconfig, "") if err != nil { return nil, err } @@ -43,8 +44,8 @@ func DetectKubeConfig(configfile []byte) (config *rest.Config, err error) { // Look for kubeconfig at the default path path := filepath.Join(utils.GetHome(), ".kube", "config") - cfgFile, err := processConfigFromFileLocation(path) - if err != nil { + _, cfgFile, err := ProcessConfig(path, "") + if err != nil{ return nil, err } if config, err = clientcmd.RESTConfigFromKubeConfig(cfgFile); err == nil { @@ -54,41 +55,49 @@ func DetectKubeConfig(configfile []byte) (config *rest.Config, err error) { return } -// processConfigInternal performs the common processing steps on the kubeconfig. -func processConfigInternal(cfg *clientcmdapi.Config) ([]byte, error) { - // Minify the kubeconfig - if err := clientcmdapi.MinifyConfig(cfg); err != nil { - return nil, ErrValidateConfig(err) +// ProcessConfig handles loading, validating, and optionally saving or returning a kubeconfig +func ProcessConfig(kubeConfig interface{}, outputPath string) (*clientcmdapi.Config, []byte, error) { + var config *clientcmdapi.Config + var err error + + // Load the Kubeconfig + switch v := kubeConfig.(type) { + case string: + config, err = clientcmd.LoadFromFile(v) + case []byte: + config, err = clientcmd.Load(v) + default: + return nil, nil, ErrLoadConfig(err) + } + if err != nil { + return nil, nil, err } - // Flatten the kubeconfig - if err := clientcmdapi.FlattenConfig(cfg); err != nil { - return nil, ErrValidateConfig(err) + // Validate and Process the Config + if err := clientcmdapi.MinifyConfig(config); err != nil { + return nil, nil, ErrValidateConfig(err) } - // Validate the kubeconfig - if err := clientcmd.Validate(*cfg); err != nil { - return nil, ErrValidateConfig(err) + if err := clientcmdapi.FlattenConfig(config); err != nil { + return nil, nil, ErrValidateConfig(err) } - // Write the processed kubeconfig to a byte slice - return clientcmd.Write(*cfg) -} + if err := clientcmd.Validate(*config); err != nil { + return nil, nil, ErrValidateConfig(err) + } -// processConfigFromFileLocation processes the kubeconfig from a file location. -func processConfigFromFileLocation(filename string) ([]byte, error) { - cfg, err := clientcmd.LoadFromFile(filename) + // Convert the config to []byte + configBytes, err := clientcmd.Write(*config) if err != nil { - return nil, ErrLoadConfig(err) + return nil, nil, err } - return processConfigInternal(cfg) -} -// processConfig processes the kubeconfig provided as a byte slice. -func processConfig(configFile []byte) ([]byte, error) { - cfg, err := clientcmd.Load(configFile) - if err != nil { - return nil, ErrLoadConfig(err) + //Save the Processed config to a file + if outputPath != ""{ + if err := clientcmd.WriteToFile(*config, outputPath); err != nil { + return nil, nil, err + } } - return processConfigInternal(cfg) + + return config, configBytes, nil } From 1f35774c98e7bdab667970164d1bd0941b33a599 Mon Sep 17 00:00:00 2001 From: Alero Awani Date: Fri, 20 Sep 2024 10:51:38 +0100 Subject: [PATCH 3/3] Use Meshkit error--author=Alero Awani Signed-off-by: Alero Awani --- utils/error.go | 7 ++++++- utils/kubernetes/client.go | 6 +++--- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/utils/error.go b/utils/error.go index 3981a282..27de0fb9 100644 --- a/utils/error.go +++ b/utils/error.go @@ -33,7 +33,7 @@ var ( ErrCueLookupCode = "meshkit-11179" ErrTypeCastCode = "meshkit-11180" ErrCreateFileCode = "meshkit-11181" - ErrCreateDirCode = "meshkit-11182" + ErrCreateDirCode = "meshkit-11182" // ErrDecodeYamlCode represents the error which is generated when yaml // decode process fails ErrDecodeYamlCode = "meshkit-11183" @@ -46,6 +46,7 @@ var ( ErrCopyFileCode = "replace_me" ErrCloseFileCode = "replace_me" ErrCompressToTarGZCode = "meshkit-11248" + ErrConvertToByteCode = "meshkit-11187" ) var ( ErrExtractType = errors.New( @@ -150,6 +151,10 @@ func ErrCreateDir(err error, filepath string) error { return errors.New(ErrCreateDirCode, errors.Alert, []string{fmt.Sprintf("error creating directory at %s", filepath)}, []string{err.Error()}, []string{"invalid path provided", "insufficient permissions"}, []string{"provide a valid path", "retry by using an absolute path", "check for sufficient permissions for the user"}) } +func ErrConvertToByte(err error) error { + return errors.New(ErrConvertToByteCode, errors.Alert, []string{("error converting data to []byte")}, []string{err.Error()}, []string{"Unsupported data types", "invalid configuration data", "failed serialization of data"}, []string{"check for any custom types in the data that might not be serializable", "Verify that the data type being passed is valid for conversion to []byte"}) +} + func ErrGettingLatestReleaseTag(err error) error { return errors.New( ErrGettingLatestReleaseTagCode, diff --git a/utils/kubernetes/client.go b/utils/kubernetes/client.go index 9180254e..be5f0e2e 100644 --- a/utils/kubernetes/client.go +++ b/utils/kubernetes/client.go @@ -70,7 +70,7 @@ func ProcessConfig(kubeConfig interface{}, outputPath string) (*clientcmdapi.Con return nil, nil, ErrLoadConfig(err) } if err != nil { - return nil, nil, err + return nil, nil, ErrLoadConfig(err) } // Validate and Process the Config @@ -89,13 +89,13 @@ func ProcessConfig(kubeConfig interface{}, outputPath string) (*clientcmdapi.Con // Convert the config to []byte configBytes, err := clientcmd.Write(*config) if err != nil { - return nil, nil, err + return nil, nil, utils.ErrConvertToByte(err) } //Save the Processed config to a file if outputPath != ""{ if err := clientcmd.WriteToFile(*config, outputPath); err != nil { - return nil, nil, err + return nil, nil, utils.ErrWriteFile(err, outputPath) } }