summaryrefslogtreecommitdiff
path: root/cmd/kpod/mount.go
diff options
context:
space:
mode:
authorMatthew Heon <matthew.heon@gmail.com>2017-11-01 11:24:59 -0400
committerMatthew Heon <matthew.heon@gmail.com>2017-11-01 11:24:59 -0400
commita031b83a09a8628435317a03f199cdc18b78262f (patch)
treebc017a96769ce6de33745b8b0b1304ccf38e9df0 /cmd/kpod/mount.go
parent2b74391cd5281f6fdf391ff8ad50fd1490f6bf89 (diff)
downloadpodman-a031b83a09a8628435317a03f199cdc18b78262f.tar.gz
podman-a031b83a09a8628435317a03f199cdc18b78262f.tar.bz2
podman-a031b83a09a8628435317a03f199cdc18b78262f.zip
Initial checkin from CRI-O repo
Signed-off-by: Matthew Heon <matthew.heon@gmail.com>
Diffstat (limited to 'cmd/kpod/mount.go')
-rw-r--r--cmd/kpod/mount.go121
1 files changed, 121 insertions, 0 deletions
diff --git a/cmd/kpod/mount.go b/cmd/kpod/mount.go
new file mode 100644
index 000000000..a711bedea
--- /dev/null
+++ b/cmd/kpod/mount.go
@@ -0,0 +1,121 @@
+package main
+
+import (
+ js "encoding/json"
+ "fmt"
+
+ of "github.com/kubernetes-incubator/cri-o/cmd/kpod/formats"
+ "github.com/pkg/errors"
+ "github.com/urfave/cli"
+)
+
+var (
+ mountDescription = `
+ kpod mount
+ Lists all mounted containers mount points
+
+ kpod mount CONTAINER-NAME-OR-ID
+ Mounts the specified container and outputs the mountpoint
+`
+
+ mountFlags = []cli.Flag{
+ cli.BoolFlag{
+ Name: "notruncate",
+ Usage: "do not truncate output",
+ },
+ cli.StringFlag{
+ Name: "label",
+ Usage: "SELinux label for the mount point",
+ },
+ cli.StringFlag{
+ Name: "format",
+ Usage: "Change the output format to Go template",
+ },
+ }
+ mountCommand = cli.Command{
+ Name: "mount",
+ Usage: "Mount a working container's root filesystem",
+ Description: mountDescription,
+ Action: mountCmd,
+ ArgsUsage: "[CONTAINER-NAME-OR-ID]",
+ Flags: mountFlags,
+ }
+)
+
+// MountOutputParams stores info about each layer
+type jsonMountPoint struct {
+ ID string `json:"id"`
+ Names []string `json:"names"`
+ MountPoint string `json:"mountpoint"`
+}
+
+func mountCmd(c *cli.Context) error {
+ formats := map[string]bool{
+ "": true,
+ of.JSONString: true,
+ }
+
+ args := c.Args()
+ json := c.String("format") == of.JSONString
+ if !formats[c.String("format")] {
+ return errors.Errorf("%q is not a supported format", c.String("format"))
+ }
+
+ if len(args) > 1 {
+ return errors.Errorf("too many arguments specified")
+ }
+ if err := validateFlags(c, mountFlags); err != nil {
+ return err
+ }
+ config, err := getConfig(c)
+ if err != nil {
+ return errors.Wrapf(err, "Could not get config")
+ }
+ store, err := getStore(config)
+ if err != nil {
+ return errors.Wrapf(err, "error getting store")
+ }
+ if len(args) == 1 {
+ if json {
+ return errors.Wrapf(err, "json option can not be used with a container id")
+ }
+ mountPoint, err := store.Mount(args[0], c.String("label"))
+ if err != nil {
+ return errors.Wrapf(err, "error finding container %q", args[0])
+ }
+ fmt.Printf("%s\n", mountPoint)
+ } else {
+ jsonMountPoints := []jsonMountPoint{}
+ containers, err2 := store.Containers()
+ if err2 != nil {
+ return errors.Wrapf(err2, "error reading list of all containers")
+ }
+ for _, container := range containers {
+ layer, err := store.Layer(container.LayerID)
+ if err != nil {
+ return errors.Wrapf(err, "error finding layer %q for container %q", container.LayerID, container.ID)
+ }
+ if layer.MountPoint == "" {
+ continue
+ }
+ if json {
+ jsonMountPoints = append(jsonMountPoints, jsonMountPoint{ID: container.ID, Names: container.Names, MountPoint: layer.MountPoint})
+ continue
+ }
+
+ if c.Bool("notruncate") {
+ fmt.Printf("%-64s %s\n", container.ID, layer.MountPoint)
+ } else {
+ fmt.Printf("%-12.12s %s\n", container.ID, layer.MountPoint)
+ }
+ }
+ if json {
+ data, err := js.MarshalIndent(jsonMountPoints, "", " ")
+ if err != nil {
+ return err
+ }
+ fmt.Printf("%s\n", data)
+ }
+ }
+ return nil
+}