1 package main
2
3 import (
4 "fmt"
5 "os"
6 "os/signal"
7 "syscall"
8 "time"
9
10 "github.com/docker/cli/cli-plugins/manager"
11 "github.com/docker/cli/cli-plugins/plugin"
12 "github.com/docker/cli/cli/command"
13 "github.com/spf13/cobra"
14 )
15
16 func main() {
17 plugin.Run(RootCmd, manager.Metadata{
18 SchemaVersion: "0.1.0",
19 Vendor: "Docker Inc.",
20 Version: "test",
21 })
22 }
23
24 func RootCmd(dockerCli command.Cli) *cobra.Command {
25 cmd := cobra.Command{
26 Use: "presocket",
27 Short: "testing plugin that does not connect to the socket",
28
29
30
31 PersistentPreRunE: func(cmd *cobra.Command, args []string) error {
32 return nil
33 },
34 }
35
36 cmd.AddCommand(&cobra.Command{
37 Use: "test-no-socket",
38 Short: "test command that runs until it receives a SIGINT",
39 RunE: func(cmd *cobra.Command, args []string) error {
40 go func() {
41 <-cmd.Context().Done()
42 fmt.Fprintln(dockerCli.Out(), "context cancelled")
43 os.Exit(2)
44 }()
45 signalCh := make(chan os.Signal, 10)
46 signal.Notify(signalCh, syscall.SIGINT, syscall.SIGTERM)
47 go func() {
48 for range signalCh {
49 fmt.Fprintln(dockerCli.Out(), "received SIGINT")
50 }
51 }()
52 <-time.After(3 * time.Second)
53 fmt.Fprintln(dockerCli.Err(), "exit after 3 seconds")
54 return nil
55 },
56 })
57
58 cmd.AddCommand(&cobra.Command{
59 Use: "test-socket",
60 Short: "test command that runs until it receives a SIGINT",
61 PreRunE: func(cmd *cobra.Command, args []string) error {
62 return plugin.PersistentPreRunE(cmd, args)
63 },
64 RunE: func(cmd *cobra.Command, args []string) error {
65 go func() {
66 <-cmd.Context().Done()
67 fmt.Fprintln(dockerCli.Out(), "context cancelled")
68 os.Exit(2)
69 }()
70 signalCh := make(chan os.Signal, 10)
71 signal.Notify(signalCh, syscall.SIGINT, syscall.SIGTERM)
72 go func() {
73 for range signalCh {
74 fmt.Fprintln(dockerCli.Out(), "received SIGINT")
75 }
76 }()
77 <-time.After(3 * time.Second)
78 fmt.Fprintln(dockerCli.Err(), "exit after 3 seconds")
79 return nil
80 },
81 })
82
83 cmd.AddCommand(&cobra.Command{
84 Use: "test-socket-ignore-context",
85 Short: "test command that runs until it receives a SIGINT",
86 PreRunE: func(cmd *cobra.Command, args []string) error {
87 return plugin.PersistentPreRunE(cmd, args)
88 },
89 RunE: func(cmd *cobra.Command, args []string) error {
90 signalCh := make(chan os.Signal, 10)
91 signal.Notify(signalCh, syscall.SIGINT, syscall.SIGTERM)
92 go func() {
93 for range signalCh {
94 fmt.Fprintln(dockerCli.Out(), "received SIGINT")
95 }
96 }()
97 <-time.After(3 * time.Second)
98 fmt.Fprintln(dockerCli.Err(), "exit after 3 seconds")
99 return nil
100 },
101 })
102
103 cmd.AddCommand(&cobra.Command{
104 Use: "tty",
105 Short: "test command that attempts to read from the TTY",
106 RunE: func(cmd *cobra.Command, args []string) error {
107 done := make(chan struct{})
108 go func() {
109 b := make([]byte, 1)
110 _, _ = dockerCli.In().Read(b)
111 done <- struct{}{}
112 }()
113 select {
114 case <-done:
115 case <-time.After(2 * time.Second):
116 fmt.Fprint(dockerCli.Err(), "timeout after 2 seconds")
117 }
118 return nil
119 },
120 })
121
122 return &cmd
123 }
124
View as plain text