Skip to content

Commit e397e50

Browse files
authored
Merge pull request #5033 from laurazard/hooks-error-message
hooks: pass command execution error to plugins
2 parents d8fc76e + 43cb06e commit e397e50

File tree

3 files changed

+21
-15
lines changed

3 files changed

+21
-15
lines changed

cli-plugins/manager/hooks.go

+14-9
Original file line numberDiff line numberDiff line change
@@ -18,19 +18,20 @@ type HookPluginData struct {
1818
// which is currently being invoked. If a hook for `docker context` is
1919
// configured and the user executes `docker context ls`, the plugin will
2020
// be invoked with `context`.
21-
RootCmd string
22-
Flags map[string]string
21+
RootCmd string
22+
Flags map[string]string
23+
CommandError string
2324
}
2425

2526
// RunCLICommandHooks is the entrypoint into the hooks execution flow after
2627
// a main CLI command was executed. It calls the hook subcommand for all
2728
// present CLI plugins that declare support for hooks in their metadata and
2829
// parses/prints their responses.
29-
func RunCLICommandHooks(dockerCli command.Cli, rootCmd, subCommand *cobra.Command) {
30+
func RunCLICommandHooks(dockerCli command.Cli, rootCmd, subCommand *cobra.Command, cmdErrorMessage string) {
3031
commandName := strings.TrimPrefix(subCommand.CommandPath(), rootCmd.Name()+" ")
3132
flags := getCommandFlags(subCommand)
3233

33-
runHooks(dockerCli, rootCmd, subCommand, commandName, flags)
34+
runHooks(dockerCli, rootCmd, subCommand, commandName, flags, cmdErrorMessage)
3435
}
3536

3637
// RunPluginHooks is the entrypoint for the hooks execution flow
@@ -39,16 +40,16 @@ func RunPluginHooks(dockerCli command.Cli, rootCmd, subCommand *cobra.Command, a
3940
commandName := strings.Join(args, " ")
4041
flags := getNaiveFlags(args)
4142

42-
runHooks(dockerCli, rootCmd, subCommand, commandName, flags)
43+
runHooks(dockerCli, rootCmd, subCommand, commandName, flags, "")
4344
}
4445

45-
func runHooks(dockerCli command.Cli, rootCmd, subCommand *cobra.Command, invokedCommand string, flags map[string]string) {
46-
nextSteps := invokeAndCollectHooks(dockerCli, rootCmd, subCommand, invokedCommand, flags)
46+
func runHooks(dockerCli command.Cli, rootCmd, subCommand *cobra.Command, invokedCommand string, flags map[string]string, cmdErrorMessage string) {
47+
nextSteps := invokeAndCollectHooks(dockerCli, rootCmd, subCommand, invokedCommand, flags, cmdErrorMessage)
4748

4849
hooks.PrintNextSteps(dockerCli.Err(), nextSteps)
4950
}
5051

51-
func invokeAndCollectHooks(dockerCli command.Cli, rootCmd, subCmd *cobra.Command, subCmdStr string, flags map[string]string) []string {
52+
func invokeAndCollectHooks(dockerCli command.Cli, rootCmd, subCmd *cobra.Command, subCmdStr string, flags map[string]string, cmdErrorMessage string) []string {
5253
pluginsCfg := dockerCli.ConfigFile().Plugins
5354
if pluginsCfg == nil {
5455
return nil
@@ -66,7 +67,11 @@ func invokeAndCollectHooks(dockerCli command.Cli, rootCmd, subCmd *cobra.Command
6667
continue
6768
}
6869

69-
hookReturn, err := p.RunHook(match, flags)
70+
hookReturn, err := p.RunHook(HookPluginData{
71+
RootCmd: match,
72+
Flags: flags,
73+
CommandError: cmdErrorMessage,
74+
})
7075
if err != nil {
7176
// skip misbehaving plugins, but don't halt execution
7277
continue

cli-plugins/manager/plugin.go

+2-5
Original file line numberDiff line numberDiff line change
@@ -105,11 +105,8 @@ func newPlugin(c Candidate, cmds []*cobra.Command) (Plugin, error) {
105105

106106
// RunHook executes the plugin's hooks command
107107
// and returns its unprocessed output.
108-
func (p *Plugin) RunHook(cmdName string, flags map[string]string) ([]byte, error) {
109-
hDataBytes, err := json.Marshal(HookPluginData{
110-
RootCmd: cmdName,
111-
Flags: flags,
112-
})
108+
func (p *Plugin) RunHook(hookData HookPluginData) ([]byte, error) {
109+
hDataBytes, err := json.Marshal(hookData)
113110
if err != nil {
114111
return nil, wrapAsPluginError(err, "failed to marshall hook data")
115112
}

cmd/docker/docker.go

+5-1
Original file line numberDiff line numberDiff line change
@@ -357,7 +357,11 @@ func runDocker(ctx context.Context, dockerCli *command.DockerCli) error {
357357
// If the command is being executed in an interactive terminal
358358
// and hook are enabled, run the plugin hooks.
359359
if dockerCli.HooksEnabled() && dockerCli.Out().IsTerminal() && subCommand != nil {
360-
pluginmanager.RunCLICommandHooks(dockerCli, cmd, subCommand)
360+
var errMessage string
361+
if err != nil {
362+
errMessage = err.Error()
363+
}
364+
pluginmanager.RunCLICommandHooks(dockerCli, cmd, subCommand, errMessage)
361365
}
362366

363367
return err

0 commit comments

Comments
 (0)