diff options
author | haircommander <pehunt@redhat.com> | 2018-07-20 14:06:26 -0400 |
---|---|---|
committer | Atomic Bot <atomic-devel@projectatomic.io> | 2018-07-25 18:22:35 +0000 |
commit | 73e39452828c2715dc5943de605f7cd488db24cb (patch) | |
tree | 6bf1e3b44764dfbefa0440e05510f9bef2e4fa24 /cmd/podman/pod_kill.go | |
parent | 8ce0e0b2460220fccbb31fced940604b55d8a195 (diff) | |
download | podman-73e39452828c2715dc5943de605f7cd488db24cb.tar.gz podman-73e39452828c2715dc5943de605f7cd488db24cb.tar.bz2 podman-73e39452828c2715dc5943de605f7cd488db24cb.zip |
Add pod kill
With tests, man page, and completions.
Signed-off-by: haircommander <pehunt@redhat.com>
Closes: #1125
Approved by: rhatdan
Diffstat (limited to 'cmd/podman/pod_kill.go')
-rw-r--r-- | cmd/podman/pod_kill.go | 114 |
1 files changed, 114 insertions, 0 deletions
diff --git a/cmd/podman/pod_kill.go b/cmd/podman/pod_kill.go new file mode 100644 index 000000000..e233c76b1 --- /dev/null +++ b/cmd/podman/pod_kill.go @@ -0,0 +1,114 @@ +package main + +import ( + "fmt" + "syscall" + + "github.com/docker/docker/pkg/signal" + "github.com/pkg/errors" + "github.com/projectatomic/libpod/cmd/podman/libpodruntime" + "github.com/projectatomic/libpod/libpod" + "github.com/sirupsen/logrus" + "github.com/urfave/cli" +) + +var ( + podKillFlags = []cli.Flag{ + cli.BoolFlag{ + Name: "all, a", + Usage: "Kill all containers in all pods", + }, + cli.StringFlag{ + Name: "signal, s", + Usage: "Signal to send to the containers in the pod", + Value: "KILL", + }, + LatestFlag, + } + podKillDescription = "The main process of each container inside the specified pod will be sent SIGKILL, or any signal specified with option --signal." + podKillCommand = cli.Command{ + Name: "kill", + Usage: "Send the specified signal or SIGKILL to containers in pod", + Description: podKillDescription, + Flags: podKillFlags, + Action: podKillCmd, + ArgsUsage: "[POD_NAME_OR_ID]", + UseShortOptionHandling: true, + } +) + +// podKillCmd kills one or more pods with a signal +func podKillCmd(c *cli.Context) error { + if err := checkMutuallyExclusiveFlags(c); err != nil { + return err + } + + runtime, err := libpodruntime.GetRuntime(c) + if err != nil { + return errors.Wrapf(err, "could not get runtime") + } + defer runtime.Shutdown(false) + + args := c.Args() + var killSignal uint = uint(syscall.SIGTERM) + var lastError error + var pods []*libpod.Pod + + if c.String("signal") != "" { + // Check if the signalString provided by the user is valid + // Invalid signals will return err + sysSignal, err := signal.ParseSignal(c.String("signal")) + if err != nil { + return err + } + killSignal = uint(sysSignal) + } + + if c.Bool("all") { + pods, err = runtime.Pods() + if err != nil { + return errors.Wrapf(err, "unable to get pods") + } + } + if c.Bool("latest") { + pod, err := runtime.GetLatestPod() + if err != nil { + return errors.Wrapf(err, "unable to get latest pod") + } + pods = append(pods, pod) + } + for _, i := range args { + pod, err := runtime.LookupPod(i) + if err != nil { + logrus.Errorf("%q", lastError) + if lastError != nil { + logrus.Errorf("%q", lastError) + } + lastError = errors.Wrapf(err, "unable to find pods %s", i) + continue + } + pods = append(pods, pod) + } + + for _, pod := range pods { + ctr_errs, err := pod.Kill(killSignal) + if ctr_errs != nil { + for ctr, err := range ctr_errs { + if lastError != nil { + logrus.Errorf("%q", lastError) + } + lastError = errors.Wrapf(err, "unable to kill container %q in pod %q", ctr, pod.ID()) + } + continue + } + if err != nil { + if lastError != nil { + logrus.Errorf("%q", lastError) + } + lastError = errors.Wrapf(err, "unable to kill pod %q", pod.ID()) + continue + } + fmt.Println(pod.ID()) + } + return lastError +} |