From 46c5e189370a0aa1246196b863475859fd9b869e Mon Sep 17 00:00:00 2001 From: "M. Mert Yildiran" Date: Wed, 28 Dec 2022 05:43:50 +0300 Subject: [PATCH] :zap: Parse flags into config splitting by hyphen character --- cmd/check/kubernetesApi.go | 2 +- cmd/check/kubernetesPermissions.go | 2 +- cmd/check/kubernetesResources.go | 18 ++++++------ cmd/cleanRunner.go | 2 +- cmd/common.go | 6 ++-- cmd/proxy.go | 4 +-- cmd/proxyRunner.go | 4 +-- cmd/tap.go | 4 +-- cmd/tapRunner.go | 30 ++++++++++---------- config/config.go | 8 +++--- config/configStruct.go | 37 +++++++++++++------------ config/configStructs/tapConfig.go | 23 +++++++-------- errormessage/errormessage.go | 4 +-- kubernetes/workerSyncer.go | 12 ++++---- kubeshark/fsUtils/kubesharkLogsUtils.go | 12 ++++---- 15 files changed, 86 insertions(+), 82 deletions(-) diff --git a/cmd/check/kubernetesApi.go b/cmd/check/kubernetesApi.go index cba841076..d4cc8ec12 100644 --- a/cmd/check/kubernetesApi.go +++ b/cmd/check/kubernetesApi.go @@ -10,7 +10,7 @@ import ( func KubernetesApi() (*kubernetes.Provider, *semver.SemVersion, bool) { log.Info().Str("procedure", "kubernetes-api").Msg("Checking:") - kubernetesProvider, err := kubernetes.NewProvider(config.Config.KubeConfigPath(), config.Config.KubeContext) + kubernetesProvider, err := kubernetes.NewProvider(config.Config.KubeConfigPath(), config.Config.Kube.Context) if err != nil { log.Error().Err(err).Msg("Can't initialize the client!") return nil, nil, false diff --git a/cmd/check/kubernetesPermissions.go b/cmd/check/kubernetesPermissions.go index 94d00c820..ec34c6b5d 100644 --- a/cmd/check/kubernetesPermissions.go +++ b/cmd/check/kubernetesPermissions.go @@ -37,7 +37,7 @@ func KubernetesPermissions(ctx context.Context, embedFS embed.FS, kubernetesProv switch resource := obj.(type) { case *rbac.Role: - return checkRulesPermissions(ctx, kubernetesProvider, resource.Rules, config.Config.ResourcesNamespace) + return checkRulesPermissions(ctx, kubernetesProvider, resource.Rules, config.Config.SelfNamespace) case *rbac.ClusterRole: return checkRulesPermissions(ctx, kubernetesProvider, resource.Rules, "") } diff --git a/cmd/check/kubernetesResources.go b/cmd/check/kubernetesResources.go index 5e2b85e45..7ef06808c 100644 --- a/cmd/check/kubernetesResources.go +++ b/cmd/check/kubernetesResources.go @@ -12,20 +12,20 @@ import ( func KubernetesResources(ctx context.Context, kubernetesProvider *kubernetes.Provider) bool { log.Info().Str("procedure", "k8s-components").Msg("Checking:") - exist, err := kubernetesProvider.DoesNamespaceExist(ctx, config.Config.ResourcesNamespace) - allResourcesExist := checkResourceExist(config.Config.ResourcesNamespace, "namespace", exist, err) + exist, err := kubernetesProvider.DoesNamespaceExist(ctx, config.Config.SelfNamespace) + allResourcesExist := checkResourceExist(config.Config.SelfNamespace, "namespace", exist, err) - exist, err = kubernetesProvider.DoesConfigMapExist(ctx, config.Config.ResourcesNamespace, kubernetes.ConfigMapName) + exist, err = kubernetesProvider.DoesConfigMapExist(ctx, config.Config.SelfNamespace, kubernetes.ConfigMapName) allResourcesExist = checkResourceExist(kubernetes.ConfigMapName, "config map", exist, err) && allResourcesExist - exist, err = kubernetesProvider.DoesServiceAccountExist(ctx, config.Config.ResourcesNamespace, kubernetes.ServiceAccountName) + exist, err = kubernetesProvider.DoesServiceAccountExist(ctx, config.Config.SelfNamespace, kubernetes.ServiceAccountName) allResourcesExist = checkResourceExist(kubernetes.ServiceAccountName, "service account", exist, err) && allResourcesExist if config.Config.IsNsRestrictedMode() { - exist, err = kubernetesProvider.DoesRoleExist(ctx, config.Config.ResourcesNamespace, kubernetes.RoleName) + exist, err = kubernetesProvider.DoesRoleExist(ctx, config.Config.SelfNamespace, kubernetes.RoleName) allResourcesExist = checkResourceExist(kubernetes.RoleName, "role", exist, err) && allResourcesExist - exist, err = kubernetesProvider.DoesRoleBindingExist(ctx, config.Config.ResourcesNamespace, kubernetes.RoleBindingName) + exist, err = kubernetesProvider.DoesRoleBindingExist(ctx, config.Config.SelfNamespace, kubernetes.RoleBindingName) allResourcesExist = checkResourceExist(kubernetes.RoleBindingName, "role binding", exist, err) && allResourcesExist } else { exist, err = kubernetesProvider.DoesClusterRoleExist(ctx, kubernetes.ClusterRoleName) @@ -35,7 +35,7 @@ func KubernetesResources(ctx context.Context, kubernetesProvider *kubernetes.Pro allResourcesExist = checkResourceExist(kubernetes.ClusterRoleBindingName, "cluster role binding", exist, err) && allResourcesExist } - exist, err = kubernetesProvider.DoesServiceExist(ctx, config.Config.ResourcesNamespace, kubernetes.HubServiceName) + exist, err = kubernetesProvider.DoesServiceExist(ctx, config.Config.SelfNamespace, kubernetes.HubServiceName) allResourcesExist = checkResourceExist(kubernetes.HubServiceName, "service", exist, err) && allResourcesExist allResourcesExist = checkPodResourcesExist(ctx, kubernetesProvider) && allResourcesExist @@ -44,7 +44,7 @@ func KubernetesResources(ctx context.Context, kubernetesProvider *kubernetes.Pro } func checkPodResourcesExist(ctx context.Context, kubernetesProvider *kubernetes.Provider) bool { - if pods, err := kubernetesProvider.ListPodsByAppLabel(ctx, config.Config.ResourcesNamespace, kubernetes.HubPodName); err != nil { + if pods, err := kubernetesProvider.ListPodsByAppLabel(ctx, config.Config.SelfNamespace, kubernetes.HubPodName); err != nil { log.Error(). Str("name", kubernetes.HubPodName). Err(err). @@ -66,7 +66,7 @@ func checkPodResourcesExist(ctx context.Context, kubernetesProvider *kubernetes. Str("name", kubernetes.HubPodName). Msg("Pod is running.") - if pods, err := kubernetesProvider.ListPodsByAppLabel(ctx, config.Config.ResourcesNamespace, kubernetes.WorkerPodName); err != nil { + if pods, err := kubernetesProvider.ListPodsByAppLabel(ctx, config.Config.SelfNamespace, kubernetes.WorkerPodName); err != nil { log.Error(). Str("name", kubernetes.WorkerPodName). Err(err). diff --git a/cmd/cleanRunner.go b/cmd/cleanRunner.go index f86067fe2..fa89d1d19 100644 --- a/cmd/cleanRunner.go +++ b/cmd/cleanRunner.go @@ -10,5 +10,5 @@ func performCleanCommand() { return } - finishKubesharkExecution(kubernetesProvider, config.Config.IsNsRestrictedMode(), config.Config.ResourcesNamespace) + finishKubesharkExecution(kubernetesProvider, config.Config.IsNsRestrictedMode(), config.Config.SelfNamespace) } diff --git a/cmd/common.go b/cmd/common.go index d5cc95496..6ba5361a3 100644 --- a/cmd/common.go +++ b/cmd/common.go @@ -21,7 +21,7 @@ import ( ) func startProxyReportErrorIfAny(kubernetesProvider *kubernetes.Provider, ctx context.Context, cancel context.CancelFunc, serviceName string, proxyPortLabel string, srcPort uint16, dstPort uint16, healthCheck string) { - httpServer, err := kubernetes.StartProxy(kubernetesProvider, config.Config.Tap.Proxy.Host, srcPort, config.Config.ResourcesNamespace, serviceName, cancel) + httpServer, err := kubernetes.StartProxy(kubernetesProvider, config.Config.Tap.Proxy.Host, srcPort, config.Config.SelfNamespace, serviceName, cancel) if err != nil { log.Error(). Err(errormessage.FormatError(err)). @@ -40,7 +40,7 @@ func startProxyReportErrorIfAny(kubernetesProvider *kubernetes.Provider, ctx con } podRegex, _ := regexp.Compile(kubernetes.HubPodName) - if _, err := kubernetes.NewPortForward(kubernetesProvider, config.Config.ResourcesNamespace, podRegex, srcPort, dstPort, ctx, cancel); err != nil { + if _, err := kubernetes.NewPortForward(kubernetesProvider, config.Config.SelfNamespace, podRegex, srcPort, dstPort, ctx, cancel); err != nil { log.Error(). Str("pod-regex", podRegex.String()). Err(errormessage.FormatError(err)). @@ -62,7 +62,7 @@ func startProxyReportErrorIfAny(kubernetesProvider *kubernetes.Provider, ctx con } func getKubernetesProviderForCli() (*kubernetes.Provider, error) { - kubernetesProvider, err := kubernetes.NewProvider(config.Config.KubeConfigPath(), config.Config.KubeContext) + kubernetesProvider, err := kubernetes.NewProvider(config.Config.KubeConfigPath(), config.Config.Kube.Context) if err != nil { handleKubernetesProviderError(err) return nil, err diff --git a/cmd/proxy.go b/cmd/proxy.go index 2114a0d85..47b4d3c2a 100644 --- a/cmd/proxy.go +++ b/cmd/proxy.go @@ -24,7 +24,7 @@ func init() { log.Debug().Err(err).Send() } - proxyCmd.Flags().Uint16(configStructs.ProxyPortFrontLabel, defaultTapConfig.Proxy.Front.SrcPort, "Provide a custom port for the front-end proxy/port-forward.") - proxyCmd.Flags().Uint16(configStructs.ProxyPortHubLabel, defaultTapConfig.Proxy.Hub.SrcPort, "Provide a custom port for the Hub proxy/port-forward.") + proxyCmd.Flags().Uint16(configStructs.ProxyFrontPortLabel, defaultTapConfig.Proxy.Front.SrcPort, "Provide a custom port for the front-end proxy/port-forward.") + proxyCmd.Flags().Uint16(configStructs.ProxyHubPortLabel, defaultTapConfig.Proxy.Hub.SrcPort, "Provide a custom port for the Hub proxy/port-forward.") proxyCmd.Flags().String(configStructs.ProxyHostLabel, defaultTapConfig.Proxy.Host, "Provide a custom host for the proxy/port-forward.") } diff --git a/cmd/proxyRunner.go b/cmd/proxyRunner.go index 05580e84b..ea835d67f 100644 --- a/cmd/proxyRunner.go +++ b/cmd/proxyRunner.go @@ -22,7 +22,7 @@ func runProxy() { ctx, cancel := context.WithCancel(context.Background()) defer cancel() - exists, err := kubernetesProvider.DoesServiceExist(ctx, config.Config.ResourcesNamespace, kubernetes.FrontServiceName) + exists, err := kubernetesProvider.DoesServiceExist(ctx, config.Config.SelfNamespace, kubernetes.FrontServiceName) if err != nil { log.Error(). Str("service", "kubeshark"). @@ -54,7 +54,7 @@ func runProxy() { return } log.Info().Msg("Establishing connection to K8s cluster...") - startProxyReportErrorIfAny(kubernetesProvider, ctx, cancel, kubernetes.FrontServiceName, configStructs.ProxyPortFrontLabel, config.Config.Tap.Proxy.Front.SrcPort, config.Config.Tap.Proxy.Front.DstPort, "") + startProxyReportErrorIfAny(kubernetesProvider, ctx, cancel, kubernetes.FrontServiceName, configStructs.ProxyFrontPortLabel, config.Config.Tap.Proxy.Front.SrcPort, config.Config.Tap.Proxy.Front.DstPort, "") connector := connect.NewConnector(url, connect.DefaultRetries, connect.DefaultTimeout) if err := connector.TestConnection(""); err != nil { diff --git a/cmd/tap.go b/cmd/tap.go index 1e9db3bea..3b20ed2a4 100644 --- a/cmd/tap.go +++ b/cmd/tap.go @@ -48,8 +48,8 @@ func init() { tapCmd.Flags().StringP(configStructs.DockerRegistryLabel, "r", defaultTapConfig.Docker.Registry, "The Docker registry that's hosting the images.") tapCmd.Flags().StringP(configStructs.DockerTagLabel, "t", defaultTapConfig.Docker.Tag, "The tag of the Docker images that are going to be pulled.") - tapCmd.Flags().Uint16(configStructs.ProxyPortFrontLabel, defaultTapConfig.Proxy.Front.SrcPort, "Provide a custom port for the front-end proxy/port-forward.") - tapCmd.Flags().Uint16(configStructs.ProxyPortHubLabel, defaultTapConfig.Proxy.Hub.SrcPort, "Provide a custom port for the Hub proxy/port-forward.") + tapCmd.Flags().Uint16(configStructs.ProxyFrontPortLabel, defaultTapConfig.Proxy.Front.SrcPort, "Provide a custom port for the front-end proxy/port-forward.") + tapCmd.Flags().Uint16(configStructs.ProxyHubPortLabel, defaultTapConfig.Proxy.Hub.SrcPort, "Provide a custom port for the Hub proxy/port-forward.") tapCmd.Flags().String(configStructs.ProxyHostLabel, defaultTapConfig.Proxy.Host, "Provide a custom host for the proxy/port-forward.") tapCmd.Flags().StringSliceP(configStructs.NamespacesLabel, "n", defaultTapConfig.Namespaces, "Namespaces selector.") tapCmd.Flags().BoolP(configStructs.AllNamespacesLabel, "A", defaultTapConfig.AllNamespaces, "Tap all namespaces.") diff --git a/cmd/tapRunner.go b/cmd/tapRunner.go index 392fbcc66..59e345c64 100644 --- a/cmd/tapRunner.go +++ b/cmd/tapRunner.go @@ -68,8 +68,8 @@ func tap() { } if config.Config.IsNsRestrictedMode() { - if len(state.targetNamespaces) != 1 || !utils.Contains(state.targetNamespaces, config.Config.ResourcesNamespace) { - log.Error().Msg(fmt.Sprintf("Kubeshark can't resolve IPs in other namespaces when running in namespace restricted mode. You can use the same namespace for --%s and --%s", configStructs.NamespacesLabel, config.ResourcesNamespaceConfigName)) + if len(state.targetNamespaces) != 1 || !utils.Contains(state.targetNamespaces, config.Config.SelfNamespace) { + log.Error().Msg(fmt.Sprintf("Kubeshark can't resolve IPs in other namespaces when running in namespace restricted mode. You can use the same namespace for --%s and --%s", configStructs.NamespacesLabel, config.SelfNamespaceConfigName)) return } } @@ -85,12 +85,12 @@ func tap() { } log.Info().Msg("Waiting for the creation of Kubeshark resources...") - if state.kubesharkServiceAccountExists, err = resources.CreateHubResources(ctx, kubernetesProvider, serializedKubesharkConfig, config.Config.IsNsRestrictedMode(), config.Config.ResourcesNamespace, config.Config.Tap.MaxEntriesDBSizeBytes(), config.Config.Tap.Resources.Hub, config.Config.ImagePullPolicy(), config.Config.Tap.Debug); err != nil { + if state.kubesharkServiceAccountExists, err = resources.CreateHubResources(ctx, kubernetesProvider, serializedKubesharkConfig, config.Config.IsNsRestrictedMode(), config.Config.SelfNamespace, config.Config.Tap.MaxEntriesDBSizeBytes(), config.Config.Tap.Resources.Hub, config.Config.ImagePullPolicy(), config.Config.Tap.Debug); err != nil { var statusError *k8serrors.StatusError if errors.As(err, &statusError) && (statusError.ErrStatus.Reason == metav1.StatusReasonAlreadyExists) { log.Warn().Msg("Kubeshark is already running in this namespace, change the `kubeshark-resources-namespace` configuration or run `kubeshark clean` to remove the currently running Kubeshark instance") } else { - defer resources.CleanUpKubesharkResources(ctx, cancel, kubernetesProvider, config.Config.IsNsRestrictedMode(), config.Config.ResourcesNamespace) + defer resources.CleanUpKubesharkResources(ctx, cancel, kubernetesProvider, config.Config.IsNsRestrictedMode(), config.Config.SelfNamespace) log.Error().Err(errormessage.FormatError(err)).Msg("Error creating resources!") } @@ -108,15 +108,15 @@ func tap() { } func finishTapExecution(kubernetesProvider *kubernetes.Provider) { - finishKubesharkExecution(kubernetesProvider, config.Config.IsNsRestrictedMode(), config.Config.ResourcesNamespace) + finishKubesharkExecution(kubernetesProvider, config.Config.IsNsRestrictedMode(), config.Config.SelfNamespace) } func getTapConfig() *models.Config { conf := models.Config{ MaxDBSizeBytes: config.Config.Tap.MaxEntriesDBSizeBytes(), - PullPolicy: config.Config.ImagePullPolicyStr, + PullPolicy: config.Config.Tap.Docker.ImagePullPolicy, WorkerResources: config.Config.Tap.Resources.Worker, - ResourcesNamespace: config.Config.ResourcesNamespace, + ResourcesNamespace: config.Config.SelfNamespace, DatabasePath: models.DataDirPath, } @@ -146,7 +146,7 @@ func startWorkerSyncer(ctx context.Context, cancel context.CancelFunc, provider workerSyncer, err := kubernetes.CreateAndStartWorkerSyncer(ctx, provider, kubernetes.WorkerSyncerConfig{ TargetNamespaces: targetNamespaces, PodFilterRegex: *config.Config.Tap.PodRegex(), - KubesharkResourcesNamespace: config.Config.ResourcesNamespace, + SelfNamespace: config.Config.SelfNamespace, WorkerResources: config.Config.Tap.Resources.Worker, ImagePullPolicy: config.Config.ImagePullPolicy(), KubesharkServiceAccountExists: state.kubesharkServiceAccountExists, @@ -215,7 +215,7 @@ func getK8sTapManagerErrorText(err kubernetes.K8sTapManagerError) string { func watchHubPod(ctx context.Context, kubernetesProvider *kubernetes.Provider, cancel context.CancelFunc) { podExactRegex := regexp.MustCompile(fmt.Sprintf("^%s$", kubernetes.HubPodName)) podWatchHelper := kubernetes.NewPodWatchHelper(kubernetesProvider, podExactRegex) - eventChan, errorChan := kubernetes.FilteredWatch(ctx, podWatchHelper, []string{config.Config.ResourcesNamespace}, podWatchHelper) + eventChan, errorChan := kubernetes.FilteredWatch(ctx, podWatchHelper, []string{config.Config.SelfNamespace}, podWatchHelper) isPodReady := false timeAfter := time.After(120 * time.Second) @@ -271,7 +271,7 @@ func watchHubPod(ctx context.Context, kubernetesProvider *kubernetes.Provider, c log.Error(). Str("pod", kubernetes.HubPodName). - Str("namespace", config.Config.ResourcesNamespace). + Str("namespace", config.Config.SelfNamespace). Err(err). Msg("Failed creating pod.") cancel() @@ -295,7 +295,7 @@ func watchHubPod(ctx context.Context, kubernetesProvider *kubernetes.Provider, c func watchFrontPod(ctx context.Context, kubernetesProvider *kubernetes.Provider, cancel context.CancelFunc) { podExactRegex := regexp.MustCompile(fmt.Sprintf("^%s$", kubernetes.FrontPodName)) podWatchHelper := kubernetes.NewPodWatchHelper(kubernetesProvider, podExactRegex) - eventChan, errorChan := kubernetes.FilteredWatch(ctx, podWatchHelper, []string{config.Config.ResourcesNamespace}, podWatchHelper) + eventChan, errorChan := kubernetes.FilteredWatch(ctx, podWatchHelper, []string{config.Config.SelfNamespace}, podWatchHelper) isPodReady := false timeAfter := time.After(120 * time.Second) @@ -350,7 +350,7 @@ func watchFrontPod(ctx context.Context, kubernetesProvider *kubernetes.Provider, log.Error(). Str("pod", kubernetes.FrontPodName). - Str("namespace", config.Config.ResourcesNamespace). + Str("namespace", config.Config.SelfNamespace). Err(err). Msg("Failed creating pod.") cancel() @@ -374,7 +374,7 @@ func watchFrontPod(ctx context.Context, kubernetesProvider *kubernetes.Provider, func watchHubEvents(ctx context.Context, kubernetesProvider *kubernetes.Provider, cancel context.CancelFunc) { podExactRegex := regexp.MustCompile(fmt.Sprintf("^%s", kubernetes.HubPodName)) eventWatchHelper := kubernetes.NewEventWatchHelper(kubernetesProvider, podExactRegex, "pod") - eventChan, errorChan := kubernetes.FilteredWatch(ctx, eventWatchHelper, []string{config.Config.ResourcesNamespace}, eventWatchHelper) + eventChan, errorChan := kubernetes.FilteredWatch(ctx, eventWatchHelper, []string{config.Config.SelfNamespace}, eventWatchHelper) for { select { case wEvent, ok := <-eventChan: @@ -441,7 +441,7 @@ func watchHubEvents(ctx context.Context, kubernetesProvider *kubernetes.Provider } func postHubStarted(ctx context.Context, kubernetesProvider *kubernetes.Provider, cancel context.CancelFunc) { - startProxyReportErrorIfAny(kubernetesProvider, ctx, cancel, kubernetes.HubServiceName, configStructs.ProxyPortFrontLabel, config.Config.Tap.Proxy.Hub.SrcPort, config.Config.Tap.Proxy.Hub.DstPort, "/echo") + startProxyReportErrorIfAny(kubernetesProvider, ctx, cancel, kubernetes.HubServiceName, configStructs.ProxyFrontPortLabel, config.Config.Tap.Proxy.Hub.SrcPort, config.Config.Tap.Proxy.Hub.DstPort, "/echo") if err := startWorkerSyncer(ctx, cancel, kubernetesProvider, state.targetNamespaces, state.startTime); err != nil { log.Error().Err(errormessage.FormatError(err)).Msg("Error starting worker syncer") @@ -453,7 +453,7 @@ func postHubStarted(ctx context.Context, kubernetesProvider *kubernetes.Provider } func postFrontStarted(ctx context.Context, kubernetesProvider *kubernetes.Provider, cancel context.CancelFunc) { - startProxyReportErrorIfAny(kubernetesProvider, ctx, cancel, kubernetes.FrontServiceName, configStructs.ProxyPortHubLabel, config.Config.Tap.Proxy.Front.SrcPort, config.Config.Tap.Proxy.Front.DstPort, "") + startProxyReportErrorIfAny(kubernetesProvider, ctx, cancel, kubernetes.FrontServiceName, configStructs.ProxyHubPortLabel, config.Config.Tap.Proxy.Front.SrcPort, config.Config.Tap.Proxy.Front.DstPort, "") url := kubernetes.GetLocalhostOnPort(config.Config.Tap.Proxy.Front.SrcPort) log.Info().Str("url", url).Msg(fmt.Sprintf(utils.Green, "Kubeshark is available at:")) diff --git a/config/config.go b/config/config.go index 505d73993..c96060532 100644 --- a/config/config.go +++ b/config/config.go @@ -123,12 +123,12 @@ func initFlag(f *pflag.Flag) { configElemValue := reflect.ValueOf(&Config).Elem() var flagPath []string - if utils.Contains([]string{ConfigFilePathCommandName}, f.Name) { - flagPath = []string{f.Name} - } else { - flagPath = []string{cmdName, f.Name} + if !utils.Contains([]string{ConfigFilePathCommandName}, f.Name) { + flagPath = append(flagPath, cmdName) } + flagPath = append(flagPath, strings.Split(f.Name, "-")...) + sliceValue, isSliceValue := f.Value.(pflag.SliceValue) if !isSliceValue { if err := mergeFlagValue(configElemValue, flagPath, strings.Join(flagPath, "."), f.Value.String()); err != nil { diff --git a/config/configStruct.go b/config/configStruct.go index cc740869b..7f26e58b0 100644 --- a/config/configStruct.go +++ b/config/configStruct.go @@ -12,26 +12,29 @@ import ( ) const ( - ResourcesNamespaceConfigName = "resources-namespace" - ConfigFilePathCommandName = "config-path" - KubeConfigPathConfigName = "kube-config-path" + SelfNamespaceConfigName = "selfnamespace" + ConfigFilePathCommandName = "configpath" + KubeConfigPathConfigName = "kube-configpath" ) func CreateDefaultConfig() ConfigStruct { return ConfigStruct{} } +type KubeConfig struct { + ConfigPathStr string `yaml:"configpath"` + Context string `yaml:"context"` +} + type ConfigStruct struct { - Tap configStructs.TapConfig `yaml:"tap"` - Logs configStructs.LogsConfig `yaml:"logs"` - Config configStructs.ConfigConfig `yaml:"config,omitempty"` - ImagePullPolicyStr string `yaml:"image-pull-policy" default:"Always"` - ResourcesNamespace string `yaml:"resources-namespace" default:"kubeshark"` - DumpLogs bool `yaml:"dump-logs" default:"false"` - KubeConfigPathStr string `yaml:"kube-config-path"` - KubeContext string `yaml:"kube-context"` - ConfigFilePath string `yaml:"config-path,omitempty" readonly:""` - HeadlessMode bool `yaml:"headless" default:"false"` + Tap configStructs.TapConfig `yaml:"tap"` + Logs configStructs.LogsConfig `yaml:"logs"` + Config configStructs.ConfigConfig `yaml:"config,omitempty"` + Kube KubeConfig `yaml:"kube"` + SelfNamespace string `yaml:"selfnamespace" default:"kubeshark"` + DumpLogs bool `yaml:"dumplogs" default:"false"` + ConfigFilePath string `yaml:"configpath" readonly:""` + HeadlessMode bool `yaml:"headless" default:"false"` } func (config *ConfigStruct) SetDefaults() { @@ -39,16 +42,16 @@ func (config *ConfigStruct) SetDefaults() { } func (config *ConfigStruct) ImagePullPolicy() v1.PullPolicy { - return v1.PullPolicy(config.ImagePullPolicyStr) + return v1.PullPolicy(config.Tap.Docker.ImagePullPolicy) } func (config *ConfigStruct) IsNsRestrictedMode() bool { - return config.ResourcesNamespace != "kubeshark" // Notice "kubeshark" string must match the default KubesharkResourcesNamespace + return config.SelfNamespace != "kubeshark" // Notice "kubeshark" string must match the default SelfNamespace } func (config *ConfigStruct) KubeConfigPath() string { - if config.KubeConfigPathStr != "" { - return config.KubeConfigPathStr + if config.Kube.ConfigPathStr != "" { + return config.Kube.ConfigPathStr } envKubeConfigPath := os.Getenv("KUBECONFIG") diff --git a/config/configStructs/tapConfig.go b/config/configStructs/tapConfig.go index c7a337421..b22c508f8 100644 --- a/config/configStructs/tapConfig.go +++ b/config/configStructs/tapConfig.go @@ -11,15 +11,15 @@ import ( const ( DockerRegistryLabel = "docker-registry" DockerTagLabel = "docker-tag" - ProxyPortFrontLabel = "proxy-port-front" - ProxyPortHubLabel = "proxy-port-hub" + ProxyFrontPortLabel = "proxy-front-port" + ProxyHubPortLabel = "proxy-hub-port" ProxyHostLabel = "proxy-host" NamespacesLabel = "namespaces" - AllNamespacesLabel = "all-namespaces" + AllNamespacesLabel = "allnamespaces" HumanMaxEntriesDBSizeLabel = "max-entries-db-size" - DryRunLabel = "dry-run" + DryRunLabel = "dryrun" PcapLabel = "pcap" - ServiceMeshLabel = "service-mesh" + ServiceMeshLabel = "servicemesh" TlsLabel = "tls" DebugLabel = "debug" ) @@ -47,8 +47,9 @@ type ProxyConfig struct { } type DockerConfig struct { - Registry string `yaml:"registry" default:"docker.io/kubeshark"` - Tag string `yaml:"tag" default:"latest"` + Registry string `yaml:"registry" default:"docker.io/kubeshark"` + Tag string `yaml:"tag" default:"latest"` + ImagePullPolicy string `yaml:"imagepullpolicy" default:"Always"` } type ResourcesConfig struct { @@ -61,14 +62,14 @@ type TapConfig struct { Proxy ProxyConfig `yaml:"proxy"` PodRegexStr string `yaml:"regex" default:".*"` Namespaces []string `yaml:"namespaces"` - AllNamespaces bool `yaml:"all-namespaces" default:"false"` + AllNamespaces bool `yaml:"allnamespaces" default:"false"` HumanMaxEntriesDBSize string `yaml:"max-entries-db-size" default:"200MB"` - DryRun bool `yaml:"dry-run" default:"false"` + DryRun bool `yaml:"dryrun" default:"false"` Pcap string `yaml:"pcap" default:""` Resources ResourcesConfig `yaml:"resources"` - ServiceMesh bool `yaml:"service-mesh" default:"true"` + ServiceMesh bool `yaml:"servicemesh" default:"true"` Tls bool `yaml:"tls" default:"true"` - PacketCapture string `yaml:"packet-capture" default:"libpcap"` + PacketCapture string `yaml:"packetcapture" default:"libpcap"` Debug bool `yaml:"debug" default:"false"` } diff --git a/errormessage/errormessage.go b/errormessage/errormessage.go index a18e15a3d..a904518d5 100644 --- a/errormessage/errormessage.go +++ b/errormessage/errormessage.go @@ -19,9 +19,9 @@ func FormatError(err error) error { "supply the required permission or control Kubeshark's access to namespaces by setting %s "+ "in the config file or setting the targetted namespace with --%s %s=", err, - config.ResourcesNamespaceConfigName, + config.SelfNamespaceConfigName, config.SetCommandName, - config.ResourcesNamespaceConfigName) + config.SelfNamespaceConfigName) } else if syntaxError, isSyntaxError := asRegexSyntaxError(err); isSyntaxError { errorNew = fmt.Errorf("regex %s is invalid: %w", syntaxError.Expr, err) } else { diff --git a/kubernetes/workerSyncer.go b/kubernetes/workerSyncer.go index 09cddb233..807f3da6f 100644 --- a/kubernetes/workerSyncer.go +++ b/kubernetes/workerSyncer.go @@ -38,7 +38,7 @@ type WorkerSyncer struct { type WorkerSyncerConfig struct { TargetNamespaces []string PodFilterRegex regexp.Regexp - KubesharkResourcesNamespace string + SelfNamespace string WorkerResources models.Resources ImagePullPolicy v1.PullPolicy KubesharkServiceAccountExists bool @@ -76,7 +76,7 @@ func CreateAndStartWorkerSyncer(ctx context.Context, kubernetesProvider *Provide func (workerSyncer *WorkerSyncer) watchWorkerPods() { kubesharkResourceRegex := regexp.MustCompile(fmt.Sprintf("^%s.*", WorkerPodName)) podWatchHelper := NewPodWatchHelper(workerSyncer.kubernetesProvider, kubesharkResourceRegex) - eventChan, errorChan := FilteredWatch(workerSyncer.context, podWatchHelper, []string{workerSyncer.config.KubesharkResourcesNamespace}, podWatchHelper) + eventChan, errorChan := FilteredWatch(workerSyncer.context, podWatchHelper, []string{workerSyncer.config.SelfNamespace}, podWatchHelper) for { select { @@ -120,7 +120,7 @@ func (workerSyncer *WorkerSyncer) watchWorkerPods() { func (workerSyncer *WorkerSyncer) watchWorkerEvents() { kubesharkResourceRegex := regexp.MustCompile(fmt.Sprintf("^%s.*", WorkerPodName)) eventWatchHelper := NewEventWatchHelper(workerSyncer.kubernetesProvider, kubesharkResourceRegex, "pod") - eventChan, errorChan := FilteredWatch(workerSyncer.context, eventWatchHelper, []string{workerSyncer.config.KubesharkResourcesNamespace}, eventWatchHelper) + eventChan, errorChan := FilteredWatch(workerSyncer.context, eventWatchHelper, []string{workerSyncer.config.SelfNamespace}, eventWatchHelper) for { select { @@ -149,7 +149,7 @@ func (workerSyncer *WorkerSyncer) watchWorkerEvents() { Str("note", event.Note). Msg("Watching events.") - pod, err1 := workerSyncer.kubernetesProvider.GetPod(workerSyncer.context, workerSyncer.config.KubesharkResourcesNamespace, event.Regarding.Name) + pod, err1 := workerSyncer.kubernetesProvider.GetPod(workerSyncer.context, workerSyncer.config.SelfNamespace, event.Regarding.Name) if err1 != nil { log.Error().Str("name", event.Regarding.Name).Msg("Couldn't get pod") continue @@ -354,7 +354,7 @@ func (workerSyncer *WorkerSyncer) updateWorkers() error { if err := workerSyncer.kubernetesProvider.ApplyWorkerDaemonSet( workerSyncer.context, - workerSyncer.config.KubesharkResourcesNamespace, + workerSyncer.config.SelfNamespace, WorkerDaemonSetName, image, WorkerPodName, @@ -372,7 +372,7 @@ func (workerSyncer *WorkerSyncer) updateWorkers() error { } else { if err := workerSyncer.kubernetesProvider.ResetWorkerDaemonSet( workerSyncer.context, - workerSyncer.config.KubesharkResourcesNamespace, + workerSyncer.config.SelfNamespace, WorkerDaemonSetName, image, WorkerPodName); err != nil { diff --git a/kubeshark/fsUtils/kubesharkLogsUtils.go b/kubeshark/fsUtils/kubesharkLogsUtils.go index e5a2c0bec..ea252275f 100644 --- a/kubeshark/fsUtils/kubesharkLogsUtils.go +++ b/kubeshark/fsUtils/kubesharkLogsUtils.go @@ -14,13 +14,13 @@ import ( func DumpLogs(ctx context.Context, provider *kubernetes.Provider, filePath string) error { podExactRegex := regexp.MustCompile("^" + kubernetes.KubesharkResourcesPrefix) - pods, err := provider.ListAllPodsMatchingRegex(ctx, podExactRegex, []string{config.Config.ResourcesNamespace}) + pods, err := provider.ListAllPodsMatchingRegex(ctx, podExactRegex, []string{config.Config.SelfNamespace}) if err != nil { return err } if len(pods) == 0 { - return fmt.Errorf("no kubeshark pods found in namespace %s", config.Config.ResourcesNamespace) + return fmt.Errorf("no kubeshark pods found in namespace %s", config.Config.SelfNamespace) } newZipFile, err := os.Create(filePath) @@ -59,17 +59,17 @@ func DumpLogs(ctx context.Context, provider *kubernetes.Provider, filePath strin } } - events, err := provider.GetNamespaceEvents(ctx, config.Config.ResourcesNamespace) + events, err := provider.GetNamespaceEvents(ctx, config.Config.SelfNamespace) if err != nil { log.Error().Err(err).Msg("Failed to get k8b events!") } else { - log.Debug().Str("namespace", config.Config.ResourcesNamespace).Msg("Successfully read events.") + log.Debug().Str("namespace", config.Config.SelfNamespace).Msg("Successfully read events.") } - if err := AddStrToZip(zipWriter, events, fmt.Sprintf("%s_events.log", config.Config.ResourcesNamespace)); err != nil { + if err := AddStrToZip(zipWriter, events, fmt.Sprintf("%s_events.log", config.Config.SelfNamespace)); err != nil { log.Error().Err(err).Msg("Failed write logs!") } else { - log.Debug().Str("namespace", config.Config.ResourcesNamespace).Msg("Successfully added events.") + log.Debug().Str("namespace", config.Config.SelfNamespace).Msg("Successfully added events.") } if err := AddFileToZip(zipWriter, config.Config.ConfigFilePath); err != nil {