diff --git a/Makefile b/Makefile index 6658a7b33..0a9fc2d72 100644 --- a/Makefile +++ b/Makefile @@ -98,14 +98,14 @@ local-release: .PHONY: run-preflight run-preflight: preflight - ./bin/preflight run \ + ./bin/preflight \ --image=localhost:32000/troubleshoot:alpha \ --pullpolicy=Always \ ./config/samples/troubleshoot_v1beta1_preflight.yaml .PHONY: run-troubleshoot run-troubleshoot: troubleshoot - ./bin/troubleshoot run \ + ./bin/troubleshoot \ --image=localhost:32000/troubleshoot:alpha \ --pullpolicy=Always \ ./config/samples/troubleshoot_v1beta1_collector.yaml diff --git a/README.md b/README.md index 09f526f0e..f469eefe6 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ Preflight checks are an easy-to-run set of conformance tests that can be written To run a sample preflight check from a sample application, [install the preflight kubectl plugin](https://help.replicated.com/docs/troubleshoot/kubernetes/preflight/running-as-kubectl-plugin/) and run: ```shell -kubectl preflight https://git.io/preflight-checks +kubectl preflight https://preflight.replicated.com ``` For a full description of the supported preflight checks, visit the [docs](https://help.replicated.com/docs/troubleshoot/kubernetes/analysis/analysis-phase/). @@ -19,5 +19,5 @@ A support bundle is an archive that's created in-cluster, by collecting logs, cl To collect a sample support bundle, [install the troubleshoot kubectl plugin](/docs/troubleshoot/kubernetes/troubleshoot/running-as-kubectl-plugin/) and run: ```shell -kubectl troubleshoot https://git.io/support-bundle +kubectl troubleshoot https://troubleshoot.replicated.com ``` diff --git a/cmd/preflight/cli/root.go b/cmd/preflight/cli/root.go index c95bb28ce..b5fbcc458 100644 --- a/cmd/preflight/cli/root.go +++ b/cmd/preflight/cli/root.go @@ -3,25 +3,50 @@ package cli import ( "fmt" "os" + "path/filepath" "strings" + troubleshootv1beta1 "github.com/replicatedhq/troubleshoot/pkg/apis/troubleshoot/v1beta1" "github.com/spf13/cobra" "github.com/spf13/viper" ) func RootCmd() *cobra.Command { cmd := &cobra.Command{ - Use: "preflight", + Use: "preflight [url]", Short: "Run and retrieve preflight checks in a cluster", Long: `A preflight check is a set of validations that can and should be run to ensure that a cluster meets the requirements to run an application.`, - SilenceUsage: true, + PreRun: func(cmd *cobra.Command, args []string) { + viper.BindPFlags(cmd.Flags()) + }, + RunE: func(cmd *cobra.Command, args []string) error { + v := viper.GetViper() + + if len(args) == 0 { + return runPreflightsCRD(v) + } + + return runPreflightsNoCRD(v, args[0]) + }, } cobra.OnInitialize(initConfig) - cmd.AddCommand(Run()) - cmd.AddCommand(Server()) + cmd.Flags().Bool("interactive", true, "interactive preflights") + cmd.Flags().String("format", "human", "output format, one of human, json, yaml. only used when interactive is set to false") + + cmd.Flags().String("preflight", "", "name of the preflight to use") + cmd.Flags().String("namespace", "default", "namespace the preflight can be found in") + + cmd.Flags().String("kubecontext", filepath.Join(homeDir(), ".kube", "config"), "the kubecontext to use when connecting") + + cmd.Flags().String("image", "", "the full name of the preflight image to use") + cmd.Flags().String("pullpolicy", "", "the pull policy of the preflight image") + cmd.Flags().String("collector-image", "", "the full name of the collector image to use") + cmd.Flags().String("collector-pullpolicy", "", "the pull policy of the collector image") + + cmd.Flags().String("serviceaccount", "", "name of the service account to use. if not provided, one will be created") viper.SetEnvKeyReplacer(strings.NewReplacer("-", "_")) return cmd @@ -38,3 +63,16 @@ func initConfig() { viper.SetEnvPrefix("PREFLIGHT") viper.AutomaticEnv() } + +func ensureCollectorInList(list []*troubleshootv1beta1.Collect, collector troubleshootv1beta1.Collect) []*troubleshootv1beta1.Collect { + for _, inList := range list { + if collector.ClusterResources != nil && inList.ClusterResources != nil { + return list + } + if collector.ClusterInfo != nil && inList.ClusterInfo != nil { + return list + } + } + + return append(list, &collector) +} diff --git a/cmd/preflight/cli/run.go b/cmd/preflight/cli/run.go deleted file mode 100644 index a980de1d1..000000000 --- a/cmd/preflight/cli/run.go +++ /dev/null @@ -1,61 +0,0 @@ -package cli - -import ( - "path/filepath" - - troubleshootv1beta1 "github.com/replicatedhq/troubleshoot/pkg/apis/troubleshoot/v1beta1" - "github.com/spf13/cobra" - "github.com/spf13/viper" -) - -func Run() *cobra.Command { - cmd := &cobra.Command{ - Use: "run", - Short: "run a set of preflight checks in a cluster", - Long: `run preflight checks and return the results`, - PreRun: func(cmd *cobra.Command, args []string) { - viper.BindPFlags(cmd.Flags()) - }, - RunE: func(cmd *cobra.Command, args []string) error { - v := viper.GetViper() - - if len(args) == 0 { - return runPreflightsCRD(v) - } - - return runPreflightsNoCRD(v, args[0]) - }, - } - - cmd.Flags().Bool("interactive", true, "interactive preflights") - cmd.Flags().String("format", "human", "output format, one of human, json, yaml. only used when interactive is set to false") - - cmd.Flags().String("preflight", "", "name of the preflight to use") - cmd.Flags().String("namespace", "default", "namespace the preflight can be found in") - - cmd.Flags().String("kubecontext", filepath.Join(homeDir(), ".kube", "config"), "the kubecontext to use when connecting") - - cmd.Flags().String("image", "", "the full name of the preflight image to use") - cmd.Flags().String("pullpolicy", "", "the pull policy of the preflight image") - cmd.Flags().String("collector-image", "", "the full name of the collector image to use") - cmd.Flags().String("collector-pullpolicy", "", "the pull policy of the collector image") - - cmd.Flags().String("serviceaccount", "", "name of the service account to use. if not provided, one will be created") - - viper.BindPFlags(cmd.Flags()) - - return cmd -} - -func ensureCollectorInList(list []*troubleshootv1beta1.Collect, collector troubleshootv1beta1.Collect) []*troubleshootv1beta1.Collect { - for _, inList := range list { - if collector.ClusterResources != nil && inList.ClusterResources != nil { - return list - } - if collector.ClusterInfo != nil && inList.ClusterInfo != nil { - return list - } - } - - return append(list, &collector) -} diff --git a/cmd/preflight/cli/server.go b/cmd/preflight/cli/server.go deleted file mode 100644 index bb0f75e3e..000000000 --- a/cmd/preflight/cli/server.go +++ /dev/null @@ -1,43 +0,0 @@ -package cli - -import ( - "context" - "fmt" - "os" - "os/signal" - - "github.com/replicatedhq/troubleshoot/pkg/server" - "github.com/spf13/cobra" - "github.com/spf13/viper" -) - -func Server() *cobra.Command { - cmd := &cobra.Command{ - Use: "server", - Short: "run the http server", - Hidden: true, - Long: `...`, - PreRun: func(cmd *cobra.Command, args []string) { - viper.BindPFlag("port", cmd.Flags().Lookup("port")) - }, - RunE: func(cmd *cobra.Command, args []string) error { - v := viper.GetViper() - - server.ServePreflight(context.Background(), fmt.Sprintf(":%d", v.GetInt("port"))) - - c := make(chan os.Signal, 1) - signal.Notify(c, os.Interrupt) - - select { - case <-c: - return nil - } - }, - } - - cmd.Flags().Int("port", 8000, "port to listen on") - - viper.BindPFlags(cmd.Flags()) - - return cmd -} diff --git a/cmd/troubleshoot/cli/root.go b/cmd/troubleshoot/cli/root.go index e207b1e67..0115c56fd 100644 --- a/cmd/troubleshoot/cli/root.go +++ b/cmd/troubleshoot/cli/root.go @@ -3,25 +3,47 @@ package cli import ( "fmt" "os" + "path/filepath" "strings" + troubleshootv1beta1 "github.com/replicatedhq/troubleshoot/pkg/apis/troubleshoot/v1beta1" "github.com/spf13/cobra" "github.com/spf13/viper" ) func RootCmd() *cobra.Command { cmd := &cobra.Command{ - Use: "troubleshoot", + Use: "troubleshoot [url]", Short: "Generate and manage support bundles", Long: `A support bundle is an archive of files, output, metrics and state from a server that can be used to assist when troubleshooting a server.`, - SilenceUsage: true, + PreRun: func(cmd *cobra.Command, args []string) { + viper.BindPFlags(cmd.Flags()) + }, + RunE: func(cmd *cobra.Command, args []string) error { + v := viper.GetViper() + + if len(args) == 0 { + return runTroubleshootCRD(v) + } + + return runTroubleshootNoCRD(v, args[0]) + }, } cobra.OnInitialize(initConfig) - cmd.AddCommand(Run()) - cmd.AddCommand(Retrieve()) + cmd.Flags().String("collectors", "", "name of the collectors to use") + cmd.Flags().String("namespace", "default", "namespace the collectors can be found in") + + cmd.Flags().String("kubecontext", filepath.Join(homeDir(), ".kube", "config"), "the kubecontext to use when connecting") + + cmd.Flags().String("image", "", "the full name of the collector image to use") + cmd.Flags().String("pullpolicy", "", "the pull policy of the collector image") + cmd.Flags().Bool("redact", true, "enable/disable default redactions") + + cmd.Flags().String("serviceaccount", "", "name of the service account to use. if not provided, one will be created") + viper.BindPFlags(cmd.Flags()) viper.SetEnvKeyReplacer(strings.NewReplacer("-", "_")) return cmd @@ -38,3 +60,16 @@ func initConfig() { viper.SetEnvPrefix("TROUBLESHOOT") viper.AutomaticEnv() } + +func ensureCollectorInList(list []*troubleshootv1beta1.Collect, collector troubleshootv1beta1.Collect) []*troubleshootv1beta1.Collect { + for _, inList := range list { + if collector.ClusterResources != nil && inList.ClusterResources != nil { + return list + } + if collector.ClusterInfo != nil && inList.ClusterInfo != nil { + return list + } + } + + return append(list, &collector) +} diff --git a/cmd/troubleshoot/cli/run.go b/cmd/troubleshoot/cli/run.go deleted file mode 100644 index 4630697d6..000000000 --- a/cmd/troubleshoot/cli/run.go +++ /dev/null @@ -1,61 +0,0 @@ -package cli - -import ( - "path/filepath" - - troubleshootv1beta1 "github.com/replicatedhq/troubleshoot/pkg/apis/troubleshoot/v1beta1" - "github.com/spf13/cobra" - "github.com/spf13/viper" -) - -func Run() *cobra.Command { - cmd := &cobra.Command{ - Use: "run", - Short: "run a support bundle in a cluster", - Long: `create a new support bundle in a cluster - -For example: - -troubleshoot run --collectors application --wait - `, - PreRun: func(cmd *cobra.Command, args []string) { - viper.BindPFlags(cmd.Flags()) - }, - RunE: func(cmd *cobra.Command, args []string) error { - v := viper.GetViper() - - if len(args) == 0 { - return runTroubleshootCRD(v) - } - - return runTroubleshootNoCRD(v, args[0]) - }, - } - - cmd.Flags().String("collectors", "", "name of the collectors to use") - cmd.Flags().String("namespace", "default", "namespace the collectors can be found in") - - cmd.Flags().String("kubecontext", filepath.Join(homeDir(), ".kube", "config"), "the kubecontext to use when connecting") - - cmd.Flags().String("image", "", "the full name of the collector image to use") - cmd.Flags().String("pullpolicy", "", "the pull policy of the collector image") - cmd.Flags().Bool("redact", true, "enable/disable default redactions") - - cmd.Flags().String("serviceaccount", "", "name of the service account to use. if not provided, one will be created") - viper.BindPFlags(cmd.Flags()) - - return cmd -} - -func ensureCollectorInList(list []*troubleshootv1beta1.Collect, collector troubleshootv1beta1.Collect) []*troubleshootv1beta1.Collect { - for _, inList := range list { - if collector.ClusterResources != nil && inList.ClusterResources != nil { - return list - } - if collector.ClusterInfo != nil && inList.ClusterInfo != nil { - return list - } - } - - return append(list, &collector) -} diff --git a/examples/troubleshoot/sample-troubleshoot.yaml b/examples/troubleshoot/sample-troubleshoot.yaml index 8dbbf0c94..2379cee92 100644 --- a/examples/troubleshoot/sample-troubleshoot.yaml +++ b/examples/troubleshoot/sample-troubleshoot.yaml @@ -23,51 +23,9 @@ spec: command: ["ping"] args: ["www.google.com"] timeout: 5s - - exec: - collectorName: mysql-vars - selector: - - app=mysql - namespace: default - command: ["mysql"] - args: ["-ureplicated", "-ppassword", "-e", "show processlist"] - timeout: 60m - - exec: - collectorName: hosts - selector: - - app=graphql-api - namespace: default - command: ["cat"] - args: ["/etc/hosts"] - timeout: 60m - - exec: - collectorName: broken - selector: - - app=graphql-api - namespace: default - command: ["cat"] - args: ["/etc/hostdasddsda"] - timeout: 60m - http: collectorName: test-get get: url: https://api.staging.replicated.com/market/v1/echo/ip insecureSkipVerify: false headers: {} - - http: - collectorName: test-post - post: - url: http://httpbin.org/headers - insecureSkipVerify: false - headers: - X-Custom-Header: "post-request" - - http: - collectorName: test-put - put: - url: http://httpbin.org/anything - insecureSkipVerify: false - headers: - X-Custom-Header: "put-request" - - http: - collectorName: test-broken - put: - url: "" diff --git a/go.mod b/go.mod index 171f5d26c..d4d3b0414 100644 --- a/go.mod +++ b/go.mod @@ -27,7 +27,6 @@ require ( github.com/opencontainers/go-digest v1.0.0-rc1 // indirect github.com/pierrec/lz4 v2.0.5+incompatible // indirect github.com/pkg/errors v0.8.1 - github.com/replicatedcom/support-bundle v0.27.1 // indirect github.com/sergi/go-diff v1.0.0 // indirect github.com/spf13/cobra v0.0.3 github.com/spf13/viper v1.4.0 diff --git a/go.sum b/go.sum index ef928416c..eaa4f67d0 100644 --- a/go.sum +++ b/go.sum @@ -308,7 +308,6 @@ github.com/prometheus/procfs v0.0.3 h1:CTwfnzjQ+8dS6MhHHu4YswVAD99sL2wjPqP+VkURm github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= github.com/remyoudompheng/bigfft v0.0.0-20170806203942-52369c62f446/go.mod h1:uYEyJGbgTkfkS4+E/PavXkNJcbFIpEtjt2B0KDQ5+9M= -github.com/replicatedcom/support-bundle v0.27.1/go.mod h1:oOJp4t6vM75MBxkBcsGAuwEWRIhq+7wSI05qU/fajPY= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.2.2 h1:J7U/N7eRtzjhs26d6GqMh2HBuXP8/Z64Densiiieafo=