in istioctl/cmd/root.go [142:322]
func GetRootCmd(args []string) *cobra.Command {
rootCmd := &cobra.Command{
Use: "istioctl",
Short: "Istio control interface.",
SilenceUsage: true,
DisableAutoGenTag: true,
Long: `Istio configuration command line utility for service operators to
debug and diagnose their Istio mesh.
`,
PersistentPreRunE: configureLogging,
}
rootCmd.SetArgs(args)
rootCmd.PersistentFlags().StringVarP(&kubeconfig, "kubeconfig", "c", "",
"Kubernetes configuration file")
rootCmd.PersistentFlags().StringVar(&configContext, "context", "",
"The name of the kubeconfig context to use")
rootCmd.PersistentFlags().StringVarP(&istioNamespace, FlagIstioNamespace, "i", viper.GetString(FlagIstioNamespace),
"Istio system namespace")
rootCmd.PersistentFlags().StringVarP(&namespace, FlagNamespace, "n", v1.NamespaceAll,
"Config namespace")
_ = rootCmd.RegisterFlagCompletionFunc(FlagIstioNamespace, validNamespaceArgs)
_ = rootCmd.RegisterFlagCompletionFunc(FlagNamespace, validNamespaceArgs)
// Attach the Istio logging options to the command.
loggingOptions.AttachCobraFlags(rootCmd)
hiddenFlags := []string{
"log_as_json", "log_rotate", "log_rotate_max_age", "log_rotate_max_backups",
"log_rotate_max_size", "log_stacktrace_level", "log_target", "log_caller", "log_output_level",
}
for _, opt := range hiddenFlags {
_ = rootCmd.PersistentFlags().MarkHidden(opt)
}
cmd.AddFlags(rootCmd)
kubeInjectCmd := injectCommand()
hideInheritedFlags(kubeInjectCmd, FlagNamespace)
rootCmd.AddCommand(kubeInjectCmd)
experimentalCmd := &cobra.Command{
Use: "experimental",
Aliases: []string{"x", "exp"},
Short: "Experimental commands that may be modified or deprecated",
}
xdsBasedTroubleshooting := []*cobra.Command{
xdsVersionCommand(),
xdsStatusCommand(),
}
debugBasedTroubleshooting := []*cobra.Command{
newVersionCommand(),
statusCommand(),
}
var debugCmdAttachmentPoint *cobra.Command
if viper.GetBool("PREFER-EXPERIMENTAL") {
legacyCmd := &cobra.Command{
Use: "legacy",
Short: "Legacy command variants",
}
rootCmd.AddCommand(legacyCmd)
for _, c := range xdsBasedTroubleshooting {
rootCmd.AddCommand(c)
}
debugCmdAttachmentPoint = legacyCmd
} else {
debugCmdAttachmentPoint = rootCmd
}
for _, c := range xdsBasedTroubleshooting {
experimentalCmd.AddCommand(c)
}
for _, c := range debugBasedTroubleshooting {
debugCmdAttachmentPoint.AddCommand(c)
}
rootCmd.AddCommand(experimentalCmd)
rootCmd.AddCommand(proxyConfig())
rootCmd.AddCommand(adminCmd())
experimentalCmd.AddCommand(injectorCommand())
rootCmd.AddCommand(install.NewVerifyCommand())
experimentalCmd.AddCommand(AuthZ())
rootCmd.AddCommand(seeExperimentalCmd("authz"))
experimentalCmd.AddCommand(uninjectCommand())
experimentalCmd.AddCommand(metricsCmd())
experimentalCmd.AddCommand(describe())
experimentalCmd.AddCommand(addToMeshCmd())
experimentalCmd.AddCommand(removeFromMeshCmd())
experimentalCmd.AddCommand(waitCmd())
experimentalCmd.AddCommand(mesh.UninstallCmd(loggingOptions))
experimentalCmd.AddCommand(configCmd())
experimentalCmd.AddCommand(workloadCommands())
experimentalCmd.AddCommand(revisionCommand())
experimentalCmd.AddCommand(debugCommand())
experimentalCmd.AddCommand(preCheck())
experimentalCmd.AddCommand(statsConfigCmd())
analyzeCmd := Analyze()
hideInheritedFlags(analyzeCmd, FlagIstioNamespace)
rootCmd.AddCommand(analyzeCmd)
dashboardCmd := dashboard()
hideInheritedFlags(dashboardCmd, FlagNamespace, FlagIstioNamespace)
rootCmd.AddCommand(dashboardCmd)
manifestCmd := mesh.ManifestCmd(loggingOptions)
hideInheritedFlags(manifestCmd, FlagNamespace, FlagIstioNamespace, FlagCharts)
rootCmd.AddCommand(manifestCmd)
operatorCmd := mesh.OperatorCmd()
hideInheritedFlags(operatorCmd, FlagNamespace, FlagIstioNamespace, FlagCharts)
rootCmd.AddCommand(operatorCmd)
installCmd := mesh.InstallCmd(loggingOptions)
hideInheritedFlags(installCmd, FlagNamespace, FlagIstioNamespace, FlagCharts)
rootCmd.AddCommand(installCmd)
profileCmd := mesh.ProfileCmd(loggingOptions)
hideInheritedFlags(profileCmd, FlagNamespace, FlagIstioNamespace, FlagCharts)
rootCmd.AddCommand(profileCmd)
upgradeCmd := mesh.UpgradeCmd(loggingOptions)
hideInheritedFlags(upgradeCmd, FlagNamespace, FlagIstioNamespace, FlagCharts)
rootCmd.AddCommand(upgradeCmd)
bugReportCmd := bugreport.Cmd(loggingOptions)
hideInheritedFlags(bugReportCmd, FlagNamespace, FlagIstioNamespace)
rootCmd.AddCommand(bugReportCmd)
tagCmd := tagCommand()
hideInheritedFlags(tagCommand(), FlagNamespace, FlagIstioNamespace, FlagCharts)
rootCmd.AddCommand(tagCmd)
remoteSecretCmd := multicluster.NewCreateRemoteSecretCommand()
remoteClustersCmd := clustersCommand()
// leave the multicluster commands in x for backwards compat
rootCmd.AddCommand(remoteSecretCmd)
rootCmd.AddCommand(remoteClustersCmd)
experimentalCmd.AddCommand(remoteSecretCmd)
experimentalCmd.AddCommand(remoteClustersCmd)
rootCmd.AddCommand(collateral.CobraCommand(rootCmd, &doc.GenManHeader{
Title: "Istio Control",
Section: "istioctl CLI",
Manual: "Istio Control",
}))
validateCmd := validate.NewValidateCommand(&istioNamespace, &namespace)
hideInheritedFlags(validateCmd, "kubeconfig")
rootCmd.AddCommand(validateCmd)
rootCmd.AddCommand(optionsCommand(rootCmd))
// BFS apply the flag error function to all subcommands
seenCommands := make(map[*cobra.Command]bool)
var commandStack []*cobra.Command
commandStack = append(commandStack, rootCmd)
for len(commandStack) > 0 {
n := len(commandStack) - 1
curCmd := commandStack[n]
commandStack = commandStack[:n]
seenCommands[curCmd] = true
for _, command := range curCmd.Commands() {
if !seenCommands[command] {
commandStack = append(commandStack, command)
}
}
curCmd.SetFlagErrorFunc(func(_ *cobra.Command, e error) error {
return CommandParseError{e}
})
}
return rootCmd
}