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
}