func NewSkoopCmd()

in pkg/skoop/cmd/app.go [21:101]


func NewSkoopCmd() *cobra.Command {
	cmd := &cobra.Command{
		Use:  "skoop",
		Long: "Skoop is an one-shot kubernetes network diagnose tool.",
		PreRunE: func(_ *cobra.Command, _ []string) error {
			if context.SkoopContext.MiscConfig().Version {
				version.PrintVersion()
				os.Exit(0)
			}
			if err := context.SkoopContext.Validate(); err != nil {
				return err
			}
			if err := context.SkoopContext.BuildCluster(); err != nil {
				return err
			}
			return context.SkoopContext.BuildTask()
		},
		RunE: func(_ *cobra.Command, _ []string) error {
			prvd, err := provider.GetProvider(context.SkoopContext.ClusterConfig().CloudProvider)
			if err != nil {
				klog.Fatalf("error get service provider: %v", err)
			}

			network, err := prvd.CreateNetwork(context.SkoopContext)
			if err != nil {
				klog.Fatalf("error create network: %v", err)
			}

			globalSuspicion, packetPath, err := network.Diagnose(context.SkoopContext, context.SkoopContext.TaskConfig().SourceEndpoint, context.SkoopContext.TaskConfig().DstEndpoint)
			if err != nil {
				//TODO error的情况下,如果已经有部分结果,应该将结果输出
				klog.Fatalf("diagnose error: %v", err)
			}

			if context.SkoopContext.UIConfig().HTTP {
				klog.Fatalf("http server exited: %s", serveWebUI(globalSuspicion, packetPath))
			}

			if context.SkoopContext.UIConfig().Format != "" {
				switch context.SkoopContext.UIConfig().Format {
				case "svg", "d2":
					err = saveGraphFile(packetPath)
					if err != nil {
						klog.Fatalf("save graph file error: %v", err)
					}
				case "json":
					err = saveJSONFile(globalSuspicion, packetPath)
					if err != nil {
						klog.Fatalf("save json file error: %v", err)
					}
					return nil
				}
			} else {
				fmt.Printf("Packet path:\n%+v\n", packetPath.Paths())
			}

			suspicions := formatSuspicions(globalSuspicion, packetPath)
			if len(suspicions) != 0 {
				fmt.Printf("\n%s", suspicions)
			}
			return nil
		},
	}

	fs := cmd.Flags()
	fss := cliflag.NamedFlagSets{}
	context.SkoopContext.BindNamedFlags(&fss)
	logFs := flag.NewFlagSet("", flag.ExitOnError)
	klog.InitFlags(logFs)
	logPfs := fss.FlagSet("Log")
	logPfs.AddGoFlagSet(logFs)

	for _, f := range fss.FlagSets {
		fs.AddFlagSet(f)
	}

	cols, _, _ := term.TerminalSize(cmd.OutOrStdout())
	cliflag.SetUsageAndHelpFunc(cmd, fss, cols)

	return cmd
}