k8s源码分析之kubectl主流程

826 阅读1分钟

cmd/kubectl/kubectl.go

func main() {
	...
	command := cmd.NewDefaultKubectlCommand()
    ...
   	if err := command.Execute(); err != nil {
		os.Exit(1)
	}
}

pkg/kubectl/cmd/cmd.go中

func NewDefaultKubectlCommand() *cobra.Command {
	return NewDefaultKubectlCommandWithArgs(NewDefaultPluginHandler(plugin.ValidPluginFilenamePrefixes), os.Args, os.Stdin, os.Stdout, os.Stderr)
}

func NewDefaultKubectlCommandWithArgs(pluginHandler PluginHandler, args []string, in io.Reader, out, errout io.Writer) *cobra.Command {
	cmd := NewKubectlCommand(in, out, errout)

	if pluginHandler == nil {
		return cmd
	}

	if len(args) > 1 {
		cmdPathPieces := args[1:]

		// only look for suitable extension executables if
		// the specified command does not already exist
		if _, _, err := cmd.Find(cmdPathPieces); err != nil {
			if err := HandlePluginCommand(pluginHandler, cmdPathPieces); err != nil {
				fmt.Fprintf(errout, "%v\n", err)
				os.Exit(1)
			}
		}
	}

	return cmd
}

func NewDefaultPluginHandler(validPrefixes []string) *DefaultPluginHandler {
	return &DefaultPluginHandler{
		ValidPrefixes: validPrefixes,
	}
}

// Lookup implements PluginHandler
func (h *DefaultPluginHandler) Lookup(filename string) (string, bool) {
	for _, prefix := range h.ValidPrefixes {
		path, err := exec.LookPath(fmt.Sprintf("%s-%s", prefix, filename))
		if err != nil || len(path) == 0 {
			continue
		}
		return path, true
	}

	return "", false
}

func NewKubectlCommand(in io.Reader, out, err io.Writer) *cobra.Command {
    ...
    cmds := &cobra.Command{
    	...
    }
	...
	ioStreams := genericclioptions.IOStreams{In: in, Out: out, ErrOut: err}
    ...
    groups := templates.CommandGroups{
    	...
    }
    ...
	groups.Add(cmds)
    ...
    return cmds
}

vendor/k8s.io/kubectl/pkg/util/templates/command_groups.go中

type CommandGroups []CommandGroup

func (g CommandGroups) Add(c *cobra.Command) {
	for _, group := range g {
		c.AddCommand(group.Commands...)
	}
}