diff --git a/cli/apiserver/provider.go b/cli/apiserver/provider.go index e10c7b130..5b8ca44cf 100644 --- a/cli/apiserver/provider.go +++ b/cli/apiserver/provider.go @@ -5,6 +5,7 @@ import ( "bytes" "encoding/json" "fmt" + "github.com/up9inc/mizu/cli/config" "github.com/up9inc/mizu/cli/logger" "github.com/up9inc/mizu/cli/uiUtils" "github.com/up9inc/mizu/shared" @@ -18,18 +19,27 @@ import ( type apiServerProvider struct { url string isReady bool + retries int } -var Provider = apiServerProvider{} +var Provider = apiServerProvider{retries: config.GetIntEnvConfig(config.ApiServerRetries, 20)} -func (provider *apiServerProvider) InitAndTestConnection(url string, retries int) error { +func (provider *apiServerProvider) InitAndTestConnection(url string) error { healthUrl := fmt.Sprintf("%s/", url) - retriesLeft := retries + retriesLeft := provider.retries for retriesLeft > 0 { if response, err := http.Get(healthUrl); err != nil { logger.Log.Debugf("[ERROR] failed connecting to api server %v", err) } else if response.StatusCode != 200 { - logger.Log.Debugf("can't connect to api server yet, response status code %v", response.StatusCode) + responseBody := "" + data, readErr := ioutil.ReadAll(response.Body) + if readErr == nil { + responseBody = string(data) + } + + logger.Log.Debugf("can't connect to api server yet, response status code: %v, body: %v", response.StatusCode, responseBody) + + response.Body.Close() } else { logger.Log.Debugf("connection test to api server passed successfully") break @@ -40,7 +50,7 @@ func (provider *apiServerProvider) InitAndTestConnection(url string, retries int if retriesLeft == 0 { provider.isReady = false - return fmt.Errorf("couldn't reach the api server after %v retries", retries) + return fmt.Errorf("couldn't reach the api server after %v retries", provider.retries) } provider.url = url provider.isReady = true diff --git a/cli/cmd/common.go b/cli/cmd/common.go index 907663b2c..1f09c6ace 100644 --- a/cli/cmd/common.go +++ b/cli/cmd/common.go @@ -26,6 +26,8 @@ func startProxyReportErrorIfAny(kubernetesProvider *kubernetes.Provider, cancel "Try setting different port by using --%s", errormessage.FormatError(err), configStructs.GuiPortTapName)) cancel() } + + logger.Log.Debugf("proxy ended") } func waitForFinish(ctx context.Context, cancel context.CancelFunc) { diff --git a/cli/cmd/fetch.go b/cli/cmd/fetch.go index dfddc350d..15d124726 100644 --- a/cli/cmd/fetch.go +++ b/cli/cmd/fetch.go @@ -18,7 +18,7 @@ var fetchCmd = &cobra.Command{ RunE: func(cmd *cobra.Command, args []string) error { go telemetry.ReportRun("fetch", config.Config.Fetch) - if err := apiserver.Provider.InitAndTestConnection(GetApiServerUrl(), 1); err != nil { + if err := apiserver.Provider.InitAndTestConnection(GetApiServerUrl()); err != nil { logger.Log.Errorf(uiUtils.Error, "Couldn't connect to API server, make sure one running") return nil } diff --git a/cli/cmd/fetchRunner.go b/cli/cmd/fetchRunner.go index aeff496af..0b539244a 100644 --- a/cli/cmd/fetchRunner.go +++ b/cli/cmd/fetchRunner.go @@ -9,7 +9,7 @@ import ( ) func RunMizuFetch() { - if err := apiserver.Provider.InitAndTestConnection(GetApiServerUrl(), 5); err != nil { + if err := apiserver.Provider.InitAndTestConnection(GetApiServerUrl()); err != nil { logger.Log.Errorf(uiUtils.Error, "Couldn't connect to API server, check logs") } diff --git a/cli/cmd/tapRunner.go b/cli/cmd/tapRunner.go index 5c44b9348..b1ce78cb8 100644 --- a/cli/cmd/tapRunner.go +++ b/cli/cmd/tapRunner.go @@ -497,7 +497,7 @@ func watchApiServerPod(ctx context.Context, kubernetesProvider *kubernetes.Provi isPodReady = true go startProxyReportErrorIfAny(kubernetesProvider, cancel) - if err := apiserver.Provider.InitAndTestConnection(GetApiServerUrl(), 20); err != nil { + if err := apiserver.Provider.InitAndTestConnection(GetApiServerUrl()); err != nil { logger.Log.Errorf(uiUtils.Error, "Couldn't connect to API server, check logs") cancel() break diff --git a/cli/cmd/viewRunner.go b/cli/cmd/viewRunner.go index 4ef1d6dfa..69bd2a27c 100644 --- a/cli/cmd/viewRunner.go +++ b/cli/cmd/viewRunner.go @@ -43,7 +43,7 @@ func runMizuView() { logger.Log.Infof("Establishing connection to k8s cluster...") go startProxyReportErrorIfAny(kubernetesProvider, cancel) - if err := apiserver.Provider.InitAndTestConnection(GetApiServerUrl(), 10); err != nil { + if err := apiserver.Provider.InitAndTestConnection(GetApiServerUrl()); err != nil { logger.Log.Errorf(uiUtils.Error, "Couldn't connect to API server, check logs") return } diff --git a/cli/config/envConfig.go b/cli/config/envConfig.go new file mode 100644 index 000000000..78f91e00b --- /dev/null +++ b/cli/config/envConfig.go @@ -0,0 +1,24 @@ +package config + +import ( + "os" + "strconv" +) + +const ( + ApiServerRetries = "API_SERVER_RETRIES" +) + +func GetIntEnvConfig(key string, defaultValue int) int { + value := os.Getenv(key) + if value == "" { + return defaultValue + } + + intValue, err := strconv.Atoi(value) + if err != nil { + return defaultValue + } + + return intValue +} diff --git a/cli/kubernetes/provider.go b/cli/kubernetes/provider.go index 1603b1307..486bf1377 100644 --- a/cli/kubernetes/provider.go +++ b/cli/kubernetes/provider.go @@ -739,6 +739,16 @@ func (provider *Provider) GetPodLogs(namespace string, podName string, ctx conte return str, nil } +func (provider *Provider) GetNamespaceEvents(namespace string, ctx context.Context) (string, error) { + eventsOpts := metav1.ListOptions{} + eventList, err := provider.clientSet.CoreV1().Events(namespace).List(ctx, eventsOpts) + if err != nil { + return "", fmt.Errorf("error getting events on ns: %s, %w", namespace, err) + } + + return eventList.String(), nil +} + func getClientSet(config *restclient.Config) (*kubernetes.Clientset, error) { clientSet, err := kubernetes.NewForConfig(config) if err != nil { diff --git a/cli/kubernetes/proxy.go b/cli/kubernetes/proxy.go index 44397bdc4..8489f0b4a 100644 --- a/cli/kubernetes/proxy.go +++ b/cli/kubernetes/proxy.go @@ -39,6 +39,7 @@ func StartProxy(kubernetesProvider *Provider, mizuPort uint16, mizuNamespace str server := http.Server{ Handler: mux, } + return server.Serve(l) } diff --git a/cli/mizu/fsUtils/mizuLogsUtils.go b/cli/mizu/fsUtils/mizuLogsUtils.go index 8cfc9524d..54ab05d28 100644 --- a/cli/mizu/fsUtils/mizuLogsUtils.go +++ b/cli/mizu/fsUtils/mizuLogsUtils.go @@ -39,22 +39,39 @@ func DumpLogs(provider *kubernetes.Provider, ctx context.Context, filePath strin } else { logger.Log.Debugf("Successfully read log length %d for pod: %s.%s", len(logs), pod.Namespace, pod.Name) } + if err := AddStrToZip(zipWriter, logs, fmt.Sprintf("%s.%s.log", pod.Namespace, pod.Name)); err != nil { logger.Log.Errorf("Failed write logs, %v", err) } else { logger.Log.Debugf("Successfully added log length %d from pod: %s.%s", len(logs), pod.Namespace, pod.Name) } } + + events, err := provider.GetNamespaceEvents(config.Config.MizuResourcesNamespace, ctx) + if err != nil { + logger.Log.Debugf("Failed to get k8b events, %v", err) + } else { + logger.Log.Debugf("Successfully read events for k8b namespace: %s", config.Config.MizuResourcesNamespace) + } + + if err := AddStrToZip(zipWriter, events, fmt.Sprintf("%s_events.log", config.Config.MizuResourcesNamespace)); err != nil { + logger.Log.Debugf("Failed write logs, %v", err) + } else { + logger.Log.Debugf("Successfully added events for k8b namespace: %s", config.Config.MizuResourcesNamespace) + } + if err := AddFileToZip(zipWriter, config.Config.ConfigFilePath); err != nil { logger.Log.Debugf("Failed write file, %v", err) } else { logger.Log.Debugf("Successfully added file %s", config.Config.ConfigFilePath) } + if err := AddFileToZip(zipWriter, logger.GetLogFilePath()); err != nil { logger.Log.Debugf("Failed write file, %v", err) } else { logger.Log.Debugf("Successfully added file %s", logger.GetLogFilePath()) } + logger.Log.Infof("You can find the zip file with all logs in %s\n", filePath) return nil }