diff options
Diffstat (limited to 'cmd/podmanV2')
68 files changed, 0 insertions, 4834 deletions
diff --git a/cmd/podmanV2/Makefile b/cmd/podmanV2/Makefile deleted file mode 100644 index f2f7bd73c..000000000 --- a/cmd/podmanV2/Makefile +++ /dev/null @@ -1,2 +0,0 @@ -all: - GO111MODULE=off go build -tags 'ABISupport systemd' diff --git a/cmd/podmanV2/README.md b/cmd/podmanV2/README.md deleted file mode 100644 index a17e6f850..000000000 --- a/cmd/podmanV2/README.md +++ /dev/null @@ -1,113 +0,0 @@ -# Adding a podman V2 commands - -## Build podman V2 - -```shell script -$ cd $GOPATH/src/github.com/containers/libpod/cmd/podmanV2 -``` -If you wish to include the libpod library in your program, -```shell script -$ go build -tags 'ABISupport' . -``` -The `--remote` flag may be used to connect to the Podman service using the API. -Otherwise, direct calls will be made to the Libpod library. -```shell script -$ go build -tags '!ABISupport' . -``` -The Libpod library is not linked into the executable. -All calls are made via the API and `--remote=False` is an error condition. - -## Adding a new command `podman manifests` -```shell script -$ mkdir -p $GOPATH/src/github.com/containers/libpod/cmd/podmanV2/manifests -``` -Create the file ```$GOPATH/src/github.com/containers/libpod/cmd/podmanV2/manifests/manifest.go``` -```go -package manifests - -import ( - "github.com/containers/libpod/cmd/podmanV2/registry" - "github.com/containers/libpod/pkg/domain/entities" - "github.com/spf13/cobra" -) - -var ( - // podman _manifests_ - manifestCmd = &cobra.Command{ - Use: "manifest", - Short: "Manage manifests", - Long: "Manage manifests", - Example: "podman manifests IMAGE", - TraverseChildren: true, - PersistentPreRunE: preRunE, - RunE: registry.SubCommandExists, // Report error if there is no sub command given - } -) -func init() { - // Subscribe command to podman - registry.Commands = append(registry.Commands, registry.CliCommand{ - // _podman manifest_ will support both ABIMode and TunnelMode - Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode}, - // The definition for this command - Command: manifestCmd, - }) - // Setup cobra templates, sub commands will inherit - manifestCmd.SetHelpTemplate(registry.HelpTemplate()) - manifestCmd.SetUsageTemplate(registry.UsageTemplate()) -} - -// preRunE populates the image engine for sub commands -func preRunE(cmd *cobra.Command, args []string) error { - _, err := registry.NewImageEngine(cmd, args) - return err -} -``` -To "wire" in the `manifest` command, edit the file ```$GOPATH/src/github.com/containers/libpod/cmd/podmanV2/main.go``` to add: -```go -package main - -import _ "github.com/containers/libpod/cmd/podmanV2/manifests" -``` - -## Adding a new sub command `podman manifests list` -Create the file ```$GOPATH/src/github.com/containers/libpod/cmd/podmanV2/manifests/inspect.go``` -```go -package manifests - -import ( - "github.com/containers/libpod/cmd/podmanV2/registry" - "github.com/containers/libpod/pkg/domain/entities" - "github.com/spf13/cobra" -) - -var ( - // podman manifests _inspect_ - inspectCmd = &cobra.Command{ - Use: "inspect IMAGE", - Short: "Display manifest from image", - Long: "Displays the low-level information on a manifest identified by image name or ID", - RunE: inspect, - Example: "podman manifest DEADBEEF", - } -) - -func init() { - // Subscribe inspect sub command to manifest command - registry.Commands = append(registry.Commands, registry.CliCommand{ - // _podman manifest inspect_ will support both ABIMode and TunnelMode - Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode}, - // The definition for this command - Command: inspectCmd, - Parent: manifestCmd, - }) - - // This is where you would configure the cobra flags using inspectCmd.Flags() -} - -// Business logic: cmd is inspectCmd, args is the positional arguments from os.Args -func inspect(cmd *cobra.Command, args []string) error { - // Business logic using registry.ImageEngine - // Do not pull from libpod directly use the domain objects and types - return nil -} -``` diff --git a/cmd/podmanV2/common/inspect.go b/cmd/podmanV2/common/inspect.go deleted file mode 100644 index dfc6fe679..000000000 --- a/cmd/podmanV2/common/inspect.go +++ /dev/null @@ -1,18 +0,0 @@ -package common - -import ( - "github.com/containers/libpod/pkg/domain/entities" - "github.com/spf13/cobra" -) - -// AddInspectFlagSet takes a command and adds the inspect flags and returns an InspectOptions object -// Since this cannot live in `package main` it lives here until a better home is found -func AddInspectFlagSet(cmd *cobra.Command) *entities.InspectOptions { - opts := entities.InspectOptions{} - - flags := cmd.Flags() - flags.BoolVarP(&opts.Size, "size", "s", false, "Display total file size") - flags.StringVarP(&opts.Format, "format", "f", "", "Change the output format to a Go template") - - return &opts -} diff --git a/cmd/podmanV2/common/netflags.go b/cmd/podmanV2/common/netflags.go deleted file mode 100644 index 758f155c8..000000000 --- a/cmd/podmanV2/common/netflags.go +++ /dev/null @@ -1,108 +0,0 @@ -package common - -import ( - "net" - - "github.com/containers/libpod/pkg/domain/entities" - "github.com/containers/libpod/pkg/rootless" - "github.com/spf13/cobra" - "github.com/spf13/pflag" -) - -func getDefaultNetwork() string { - if rootless.IsRootless() { - return "slirp4netns" - } - return "bridge" -} - -func GetNetFlags() *pflag.FlagSet { - netFlags := pflag.FlagSet{} - netFlags.StringSlice( - "add-host", []string{}, - "Add a custom host-to-IP mapping (host:ip) (default [])", - ) - netFlags.StringSlice( - "dns", []string{}, - "Set custom DNS servers", - ) - netFlags.StringSlice( - "dns-opt", []string{}, - "Set custom DNS options", - ) - netFlags.StringSlice( - "dns-search", []string{}, - "Set custom DNS search domains", - ) - netFlags.String( - "ip", "", - "Specify a static IPv4 address for the container", - ) - netFlags.String( - "mac-address", "", - "Container MAC address (e.g. 92:d0:c6:0a:29:33)", - ) - netFlags.String( - "network", getDefaultNetwork(), - "Connect a container to a network", - ) - netFlags.StringSliceP( - "publish", "p", []string{}, - "Publish a container's port, or a range of ports, to the host (default [])", - ) - netFlags.Bool( - "no-hosts", false, - "Do not create /etc/hosts within the container, instead use the version from the image", - ) - return &netFlags -} - -func NetFlagsToNetOptions(cmd *cobra.Command) (*entities.NetOptions, error) { - var ( - err error - ) - opts := entities.NetOptions{} - opts.AddHosts, err = cmd.Flags().GetStringSlice("add-host") - if err != nil { - return nil, err - } - servers, err := cmd.Flags().GetStringSlice("dns") - if err != nil { - return nil, err - } - for _, d := range servers { - if d == "none" { - opts.DNSHost = true - break - } - opts.DNSServers = append(opts.DNSServers, net.ParseIP(d)) - } - opts.DNSSearch, err = cmd.Flags().GetStringSlice("dns-search") - if err != nil { - return nil, err - } - - m, err := cmd.Flags().GetString("mac-address") - if err != nil { - return nil, err - } - if len(m) > 0 { - mac, err := net.ParseMAC(m) - if err != nil { - return nil, err - } - opts.StaticMAC = &mac - } - inputPorts, err := cmd.Flags().GetStringSlice("publish") - if err != nil { - return nil, err - } - if len(inputPorts) > 0 { - opts.PublishPorts, err = createPortBindings(inputPorts) - if err != nil { - return nil, err - } - } - opts.NoHosts, err = cmd.Flags().GetBool("no-hosts") - return &opts, err -} diff --git a/cmd/podmanV2/common/types.go b/cmd/podmanV2/common/types.go deleted file mode 100644 index 2427ae975..000000000 --- a/cmd/podmanV2/common/types.go +++ /dev/null @@ -1,3 +0,0 @@ -package common - -var DefaultKernelNamespaces = "cgroup,ipc,net,uts" diff --git a/cmd/podmanV2/common/util.go b/cmd/podmanV2/common/util.go deleted file mode 100644 index 47bbe12fa..000000000 --- a/cmd/podmanV2/common/util.go +++ /dev/null @@ -1,43 +0,0 @@ -package common - -import ( - "strconv" - - "github.com/cri-o/ocicni/pkg/ocicni" - "github.com/docker/go-connections/nat" - "github.com/pkg/errors" -) - -// createPortBindings iterates ports mappings and exposed ports into a format CNI understands -func createPortBindings(ports []string) ([]ocicni.PortMapping, error) { - // TODO wants someone to rewrite this code in the future - var portBindings []ocicni.PortMapping - // The conversion from []string to natBindings is temporary while mheon reworks the port - // deduplication code. Eventually that step will not be required. - _, natBindings, err := nat.ParsePortSpecs(ports) - if err != nil { - return nil, err - } - for containerPb, hostPb := range natBindings { - var pm ocicni.PortMapping - pm.ContainerPort = int32(containerPb.Int()) - for _, i := range hostPb { - var hostPort int - var err error - pm.HostIP = i.HostIP - if i.HostPort == "" { - hostPort = containerPb.Int() - } else { - hostPort, err = strconv.Atoi(i.HostPort) - if err != nil { - return nil, errors.Wrapf(err, "unable to convert host port to integer") - } - } - - pm.HostPort = int32(hostPort) - pm.Protocol = containerPb.Proto() - portBindings = append(portBindings, pm) - } - } - return portBindings, nil -} diff --git a/cmd/podmanV2/containers/commit.go b/cmd/podmanV2/containers/commit.go deleted file mode 100644 index 28eb42f33..000000000 --- a/cmd/podmanV2/containers/commit.go +++ /dev/null @@ -1,79 +0,0 @@ -package containers - -import ( - "context" - "fmt" - "io/ioutil" - "os" - "strings" - - "github.com/containers/libpod/cmd/podmanV2/registry" - "github.com/containers/libpod/pkg/domain/entities" - "github.com/pkg/errors" - "github.com/spf13/cobra" -) - -var ( - commitDescription = `Create an image from a container's changes. Optionally tag the image created, set the author with the --author flag, set the commit message with the --message flag, and make changes to the instructions with the --change flag.` - - commitCommand = &cobra.Command{ - Use: "commit [flags] CONTAINER [IMAGE]", - Short: "Create new image based on the changed container", - Long: commitDescription, - RunE: commit, - PreRunE: preRunE, - Args: cobra.MinimumNArgs(1), - Example: `podman commit -q --message "committing container to image" reverent_golick image-committed - podman commit -q --author "firstName lastName" reverent_golick image-committed - podman commit -q --pause=false containerID image-committed - podman commit containerID`, - } - - // ChangeCmds is the list of valid Changes commands to passed to the Commit call - ChangeCmds = []string{"CMD", "ENTRYPOINT", "ENV", "EXPOSE", "LABEL", "ONBUILD", "STOPSIGNAL", "USER", "VOLUME", "WORKDIR"} -) - -var ( - commitOptions = entities.CommitOptions{ - ImageName: "", - } - iidFile string -) - -func init() { - registry.Commands = append(registry.Commands, registry.CliCommand{ - Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode}, - Command: commitCommand, - }) - flags := commitCommand.Flags() - flags.StringArrayVarP(&commitOptions.Changes, "change", "c", []string{}, "Apply the following possible instructions to the created image (default []): "+strings.Join(ChangeCmds, " | ")) - flags.StringVarP(&commitOptions.Format, "format", "f", "oci", "`Format` of the image manifest and metadata") - flags.StringVarP(&iidFile, "iidfile", "", "", "`file` to write the image ID to") - flags.StringVarP(&commitOptions.Message, "message", "m", "", "Set commit message for imported image") - flags.StringVarP(&commitOptions.Author, "author", "a", "", "Set the author for the image committed") - flags.BoolVarP(&commitOptions.Pause, "pause", "p", false, "Pause container during commit") - flags.BoolVarP(&commitOptions.Quiet, "quiet", "q", false, "Suppress output") - flags.BoolVar(&commitOptions.IncludeVolumes, "include-volumes", false, "Include container volumes as image volumes") - -} -func commit(cmd *cobra.Command, args []string) error { - container := args[0] - if len(args) > 1 { - commitOptions.ImageName = args[1] - } - if !commitOptions.Quiet { - commitOptions.Writer = os.Stderr - } - - response, err := registry.ContainerEngine().ContainerCommit(context.Background(), container, commitOptions) - if err != nil { - return err - } - if len(iidFile) > 0 { - if err = ioutil.WriteFile(iidFile, []byte(response.Id), 0644); err != nil { - return errors.Wrapf(err, "failed to write image ID to file %q", iidFile) - } - } - fmt.Println(response.Id) - return nil -} diff --git a/cmd/podmanV2/containers/container.go b/cmd/podmanV2/containers/container.go deleted file mode 100644 index b922eea05..000000000 --- a/cmd/podmanV2/containers/container.go +++ /dev/null @@ -1,48 +0,0 @@ -package containers - -import ( - "os" - - "github.com/containers/common/pkg/config" - "github.com/containers/libpod/cmd/podmanV2/registry" - "github.com/containers/libpod/pkg/domain/entities" - "github.com/sirupsen/logrus" - "github.com/spf13/cobra" -) - -var ( - // Command: podman _container_ - containerCmd = &cobra.Command{ - Use: "container", - Short: "Manage containers", - Long: "Manage containers", - TraverseChildren: true, - PersistentPreRunE: preRunE, - RunE: registry.SubCommandExists, - } - - defaultContainerConfig = getDefaultContainerConfig() -) - -func init() { - registry.Commands = append(registry.Commands, registry.CliCommand{ - Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode}, - Command: containerCmd, - }) - containerCmd.SetHelpTemplate(registry.HelpTemplate()) - containerCmd.SetUsageTemplate(registry.UsageTemplate()) -} - -func preRunE(cmd *cobra.Command, args []string) error { - _, err := registry.NewContainerEngine(cmd, args) - return err -} - -func getDefaultContainerConfig() *config.Config { - defaultContainerConfig, err := config.Default() - if err != nil { - logrus.Error(err) - os.Exit(1) - } - return defaultContainerConfig -} diff --git a/cmd/podmanV2/containers/exists.go b/cmd/podmanV2/containers/exists.go deleted file mode 100644 index 22c798fcd..000000000 --- a/cmd/podmanV2/containers/exists.go +++ /dev/null @@ -1,43 +0,0 @@ -package containers - -import ( - "context" - "os" - - "github.com/containers/libpod/cmd/podmanV2/registry" - "github.com/containers/libpod/pkg/domain/entities" - "github.com/spf13/cobra" -) - -var ( - containerExistsDescription = `If the named container exists in local storage, podman container exists exits with 0, otherwise the exit code will be 1.` - - existsCommand = &cobra.Command{ - Use: "exists CONTAINER", - Short: "Check if a container exists in local storage", - Long: containerExistsDescription, - Example: `podman container exists containerID - podman container exists myctr || podman run --name myctr [etc...]`, - RunE: exists, - Args: cobra.ExactArgs(1), - } -) - -func init() { - registry.Commands = append(registry.Commands, registry.CliCommand{ - Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode}, - Command: existsCommand, - Parent: containerCmd, - }) -} - -func exists(cmd *cobra.Command, args []string) error { - response, err := registry.ContainerEngine().ContainerExists(context.Background(), args[0]) - if err != nil { - return err - } - if !response.Value { - os.Exit(1) - } - return nil -} diff --git a/cmd/podmanV2/containers/export.go b/cmd/podmanV2/containers/export.go deleted file mode 100644 index b93b60878..000000000 --- a/cmd/podmanV2/containers/export.go +++ /dev/null @@ -1,57 +0,0 @@ -package containers - -import ( - "context" - "os" - - "github.com/containers/libpod/cmd/podmanV2/parse" - "github.com/containers/libpod/cmd/podmanV2/registry" - "github.com/containers/libpod/pkg/domain/entities" - "github.com/pkg/errors" - "github.com/spf13/cobra" - "golang.org/x/crypto/ssh/terminal" -) - -var ( - exportDescription = "Exports container's filesystem contents as a tar archive" + - " and saves it on the local machine." - - exportCommand = &cobra.Command{ - Use: "export [flags] CONTAINER", - Short: "Export container's filesystem contents as a tar archive", - Long: exportDescription, - PersistentPreRunE: preRunE, - RunE: export, - Args: cobra.ExactArgs(1), - Example: `podman export ctrID > myCtr.tar - podman export --output="myCtr.tar" ctrID`, - } -) - -var ( - exportOpts entities.ContainerExportOptions -) - -func init() { - registry.Commands = append(registry.Commands, registry.CliCommand{ - Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode}, - Command: exportCommand, - }) - exportCommand.SetHelpTemplate(registry.HelpTemplate()) - exportCommand.SetUsageTemplate(registry.UsageTemplate()) - flags := exportCommand.Flags() - flags.StringVarP(&exportOpts.Output, "output", "o", "", "Write to a specified file (default: stdout, which must be redirected)") -} - -func export(cmd *cobra.Command, args []string) error { - if len(exportOpts.Output) == 0 { - file := os.Stdout - if terminal.IsTerminal(int(file.Fd())) { - return errors.Errorf("refusing to export to terminal. Use -o flag or redirect") - } - exportOpts.Output = "/dev/stdout" - } else if err := parse.ValidateFileName(exportOpts.Output); err != nil { - return err - } - return registry.ContainerEngine().ContainerExport(context.Background(), args[0], exportOpts) -} diff --git a/cmd/podmanV2/containers/inspect.go b/cmd/podmanV2/containers/inspect.go deleted file mode 100644 index 3147426cb..000000000 --- a/cmd/podmanV2/containers/inspect.go +++ /dev/null @@ -1,79 +0,0 @@ -package containers - -import ( - "context" - "fmt" - "os" - "strings" - "text/template" - - "github.com/containers/libpod/cmd/podmanV2/common" - "github.com/containers/libpod/cmd/podmanV2/registry" - - "github.com/containers/libpod/pkg/domain/entities" - json "github.com/json-iterator/go" - "github.com/spf13/cobra" -) - -var ( - // podman container _inspect_ - inspectCmd = &cobra.Command{ - Use: "inspect [flags] CONTAINER", - Short: "Display the configuration of a container", - Long: `Displays the low-level information on a container identified by name or ID.`, - PreRunE: preRunE, - RunE: inspect, - Example: `podman container inspect myCtr - podman container inspect -l --format '{{.Id}} {{.Config.Labels}}'`, - } - inspectOpts *entities.InspectOptions -) - -func init() { - registry.Commands = append(registry.Commands, registry.CliCommand{ - Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode}, - Command: inspectCmd, - Parent: containerCmd, - }) - inspectOpts = common.AddInspectFlagSet(inspectCmd) - flags := inspectCmd.Flags() - - if !registry.IsRemote() { - flags.BoolVarP(&inspectOpts.Latest, "latest", "l", false, "Act on the latest container podman is aware of") - } - -} - -func inspect(cmd *cobra.Command, args []string) error { - responses, err := registry.ContainerEngine().ContainerInspect(context.Background(), args, *inspectOpts) - if err != nil { - return err - } - if inspectOpts.Format == "" { - b, err := json.MarshalIndent(responses, "", " ") - if err != nil { - return err - } - fmt.Println(string(b)) - return nil - } - format := inspectOpts.Format - if !strings.HasSuffix(format, "\n") { - format += "\n" - } - tmpl, err := template.New("inspect").Parse(format) - if err != nil { - return err - } - for _, i := range responses { - if err := tmpl.Execute(os.Stdout, i); err != nil { - return err - } - } - return nil -} - -func Inspect(cmd *cobra.Command, args []string, options *entities.InspectOptions) error { - inspectOpts = options - return inspect(cmd, args) -} diff --git a/cmd/podmanV2/containers/kill.go b/cmd/podmanV2/containers/kill.go deleted file mode 100644 index 6e6debfec..000000000 --- a/cmd/podmanV2/containers/kill.go +++ /dev/null @@ -1,72 +0,0 @@ -package containers - -import ( - "context" - "fmt" - - "github.com/containers/libpod/cmd/podmanV2/parse" - "github.com/containers/libpod/cmd/podmanV2/registry" - "github.com/containers/libpod/cmd/podmanV2/utils" - "github.com/containers/libpod/pkg/domain/entities" - "github.com/containers/libpod/pkg/signal" - "github.com/spf13/cobra" -) - -var ( - killDescription = "The main process inside each container specified will be sent SIGKILL, or any signal specified with option --signal." - killCommand = &cobra.Command{ - Use: "kill [flags] CONTAINER [CONTAINER...]", - Short: "Kill one or more running containers with a specific signal", - Long: killDescription, - RunE: kill, - PersistentPreRunE: preRunE, - Args: func(cmd *cobra.Command, args []string) error { - return parse.CheckAllLatestAndCIDFile(cmd, args, false, false) - }, - Example: `podman kill mywebserver - podman kill 860a4b23 - podman kill --signal TERM ctrID`, - } -) - -var ( - killOptions = entities.KillOptions{} -) - -func init() { - registry.Commands = append(registry.Commands, registry.CliCommand{ - Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode}, - Command: killCommand, - }) - flags := killCommand.Flags() - flags.BoolVarP(&killOptions.All, "all", "a", false, "Signal all running containers") - flags.StringVarP(&killOptions.Signal, "signal", "s", "KILL", "Signal to send to the container") - flags.BoolVarP(&killOptions.Latest, "latest", "l", false, "Act on the latest container podman is aware of") - if registry.IsRemote() { - _ = flags.MarkHidden("latest") - } -} - -func kill(cmd *cobra.Command, args []string) error { - var ( - err error - errs utils.OutputErrors - ) - // Check if the signalString provided by the user is valid - // Invalid signals will return err - if _, err = signal.ParseSignalNameOrNumber(killOptions.Signal); err != nil { - return err - } - responses, err := registry.ContainerEngine().ContainerKill(context.Background(), args, killOptions) - if err != nil { - return err - } - for _, r := range responses { - if r.Err == nil { - fmt.Println(r.Id) - } else { - errs = append(errs, r.Err) - } - } - return errs.PrintErrors() -} diff --git a/cmd/podmanV2/containers/list.go b/cmd/podmanV2/containers/list.go deleted file mode 100644 index 630d9bbc7..000000000 --- a/cmd/podmanV2/containers/list.go +++ /dev/null @@ -1,34 +0,0 @@ -package containers - -import ( - "github.com/containers/libpod/cmd/podmanV2/registry" - "github.com/containers/libpod/pkg/domain/entities" - "github.com/spf13/cobra" -) - -var ( - // podman container _list_ - listCmd = &cobra.Command{ - Use: "list", - Aliases: []string{"ls"}, - Args: cobra.NoArgs, - Short: "List containers", - Long: "Prints out information about the containers", - RunE: containers, - Example: `podman container list -a - podman container list -a --format "{{.ID}} {{.Image}} {{.Labels}} {{.Mounts}}" - podman container list --size --sort names`, - } -) - -func init() { - registry.Commands = append(registry.Commands, registry.CliCommand{ - Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode}, - Command: listCmd, - Parent: containerCmd, - }) -} - -func containers(cmd *cobra.Command, args []string) error { - return nil -} diff --git a/cmd/podmanV2/containers/pause.go b/cmd/podmanV2/containers/pause.go deleted file mode 100644 index a9b91b68f..000000000 --- a/cmd/podmanV2/containers/pause.go +++ /dev/null @@ -1,64 +0,0 @@ -package containers - -import ( - "context" - "fmt" - - "github.com/containers/libpod/cmd/podmanV2/registry" - "github.com/containers/libpod/cmd/podmanV2/utils" - "github.com/containers/libpod/pkg/domain/entities" - "github.com/containers/libpod/pkg/rootless" - "github.com/pkg/errors" - "github.com/spf13/cobra" -) - -var ( - pauseDescription = `Pauses one or more running containers. The container name or ID can be used.` - pauseCommand = &cobra.Command{ - Use: "pause [flags] CONTAINER [CONTAINER...]", - Short: "Pause all the processes in one or more containers", - Long: pauseDescription, - RunE: pause, - PersistentPreRunE: preRunE, - Example: `podman pause mywebserver - podman pause 860a4b23 - podman pause -a`, - } - - pauseOpts = entities.PauseUnPauseOptions{} -) - -func init() { - registry.Commands = append(registry.Commands, registry.CliCommand{ - Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode}, - Command: pauseCommand, - }) - flags := pauseCommand.Flags() - flags.BoolVarP(&pauseOpts.All, "all", "a", false, "Pause all running containers") - pauseCommand.SetHelpTemplate(registry.HelpTemplate()) - pauseCommand.SetUsageTemplate(registry.UsageTemplate()) -} - -func pause(cmd *cobra.Command, args []string) error { - var ( - errs utils.OutputErrors - ) - if rootless.IsRootless() && !registry.IsRemote() { - return errors.New("pause is not supported for rootless containers") - } - if len(args) < 1 && !pauseOpts.All { - return errors.Errorf("you must provide at least one container name or id") - } - responses, err := registry.ContainerEngine().ContainerPause(context.Background(), args, pauseOpts) - if err != nil { - return err - } - for _, r := range responses { - if r.Err == nil { - fmt.Println(r.Id) - } else { - errs = append(errs, r.Err) - } - } - return errs.PrintErrors() -} diff --git a/cmd/podmanV2/containers/ps.go b/cmd/podmanV2/containers/ps.go deleted file mode 100644 index ce3d66c51..000000000 --- a/cmd/podmanV2/containers/ps.go +++ /dev/null @@ -1,29 +0,0 @@ -package containers - -import ( - "strings" - - "github.com/containers/libpod/cmd/podmanV2/registry" - "github.com/containers/libpod/pkg/domain/entities" - "github.com/spf13/cobra" -) - -var ( - // podman _ps_ - psCmd = &cobra.Command{ - Use: "ps", - Args: cobra.NoArgs, - Short: listCmd.Short, - Long: listCmd.Long, - PersistentPreRunE: preRunE, - RunE: containers, - Example: strings.Replace(listCmd.Example, "container list", "ps", -1), - } -) - -func init() { - registry.Commands = append(registry.Commands, registry.CliCommand{ - Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode}, - Command: psCmd, - }) -} diff --git a/cmd/podmanV2/containers/restart.go b/cmd/podmanV2/containers/restart.go deleted file mode 100644 index 5f1d3fe51..000000000 --- a/cmd/podmanV2/containers/restart.go +++ /dev/null @@ -1,80 +0,0 @@ -package containers - -import ( - "context" - "fmt" - - "github.com/containers/libpod/cmd/podmanV2/parse" - "github.com/containers/libpod/cmd/podmanV2/registry" - "github.com/containers/libpod/cmd/podmanV2/utils" - "github.com/containers/libpod/libpod/define" - "github.com/containers/libpod/pkg/domain/entities" - "github.com/pkg/errors" - "github.com/spf13/cobra" -) - -var ( - restartDescription = fmt.Sprintf(`Restarts one or more running containers. The container ID or name can be used. - - A timeout before forcibly stopping can be set, but defaults to %d seconds.`, defaultContainerConfig.Engine.StopTimeout) - - restartCommand = &cobra.Command{ - Use: "restart [flags] CONTAINER [CONTAINER...]", - Short: "Restart one or more containers", - Long: restartDescription, - RunE: restart, - PersistentPreRunE: preRunE, - Args: func(cmd *cobra.Command, args []string) error { - return parse.CheckAllLatestAndCIDFile(cmd, args, false, false) - }, - Example: `podman restart ctrID - podman restart --latest - podman restart ctrID1 ctrID2`, - } -) - -var ( - restartOptions = entities.RestartOptions{} - restartTimeout uint -) - -func init() { - registry.Commands = append(registry.Commands, registry.CliCommand{ - Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode}, - Command: restartCommand, - }) - flags := restartCommand.Flags() - flags.BoolVarP(&restartOptions.All, "all", "a", false, "Restart all non-running containers") - flags.BoolVarP(&restartOptions.Latest, "latest", "l", false, "Act on the latest container podman is aware of") - flags.BoolVar(&restartOptions.Running, "running", false, "Restart only running containers when --all is used") - flags.UintVarP(&restartTimeout, "time", "t", defaultContainerConfig.Engine.StopTimeout, "Seconds to wait for stop before killing the container") - if registry.IsRemote() { - _ = flags.MarkHidden("latest") - } - flags.SetNormalizeFunc(utils.AliasFlags) -} - -func restart(cmd *cobra.Command, args []string) error { - var ( - errs utils.OutputErrors - ) - if len(args) < 1 && !restartOptions.Latest && !restartOptions.All { - return errors.Wrapf(define.ErrInvalidArg, "you must provide at least one container name or ID") - } - - if cmd.Flag("time").Changed { - restartOptions.Timeout = &restartTimeout - } - responses, err := registry.ContainerEngine().ContainerRestart(context.Background(), args, restartOptions) - if err != nil { - return err - } - for _, r := range responses { - if r.Err == nil { - fmt.Println(r.Id) - } else { - errs = append(errs, r.Err) - } - } - return errs.PrintErrors() -} diff --git a/cmd/podmanV2/containers/rm.go b/cmd/podmanV2/containers/rm.go deleted file mode 100644 index 75655e4cd..000000000 --- a/cmd/podmanV2/containers/rm.go +++ /dev/null @@ -1,94 +0,0 @@ -package containers - -import ( - "context" - "fmt" - - "github.com/containers/libpod/cmd/podmanV2/parse" - "github.com/containers/libpod/cmd/podmanV2/registry" - "github.com/containers/libpod/cmd/podmanV2/utils" - "github.com/containers/libpod/libpod/define" - "github.com/containers/libpod/pkg/domain/entities" - "github.com/pkg/errors" - "github.com/sirupsen/logrus" - "github.com/spf13/cobra" -) - -var ( - rmDescription = `Removes one or more containers from the host. The container name or ID can be used. - - Command does not remove images. Running or unusable containers will not be removed without the -f option.` - rmCommand = &cobra.Command{ - Use: "rm [flags] CONTAINER [CONTAINER...]", - Short: "Remove one or more containers", - Long: rmDescription, - RunE: rm, - PersistentPreRunE: preRunE, - Args: func(cmd *cobra.Command, args []string) error { - return parse.CheckAllLatestAndCIDFile(cmd, args, false, true) - }, - Example: `podman rm imageID - podman rm mywebserver myflaskserver 860a4b23 - podman rm --force --all - podman rm -f c684f0d469f2`, - } -) - -var ( - rmOptions = entities.RmOptions{} -) - -func init() { - registry.Commands = append(registry.Commands, registry.CliCommand{ - Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode}, - Command: rmCommand, - }) - flags := rmCommand.Flags() - flags.BoolVarP(&rmOptions.All, "all", "a", false, "Remove all containers") - flags.BoolVarP(&rmOptions.Ignore, "ignore", "i", false, "Ignore errors when a specified container is missing") - flags.BoolVarP(&rmOptions.Force, "force", "f", false, "Force removal of a running or unusable container. The default is false") - flags.BoolVarP(&rmOptions.Latest, "latest", "l", false, "Act on the latest container podman is aware of") - flags.BoolVar(&rmOptions.Storage, "storage", false, "Remove container from storage library") - flags.BoolVarP(&rmOptions.Volumes, "volumes", "v", false, "Remove anonymous volumes associated with the container") - flags.StringArrayVarP(&rmOptions.CIDFiles, "cidfile", "", nil, "Read the container ID from the file") - if registry.IsRemote() { - _ = flags.MarkHidden("latest") - _ = flags.MarkHidden("ignore") - _ = flags.MarkHidden("cidfile") - _ = flags.MarkHidden("storage") - } - -} - -func rm(cmd *cobra.Command, args []string) error { - var ( - errs utils.OutputErrors - ) - // Storage conflicts with --all/--latest/--volumes/--cidfile/--ignore - if rmOptions.Storage { - if rmOptions.All || rmOptions.Ignore || rmOptions.Latest || rmOptions.Volumes || rmOptions.CIDFiles != nil { - return errors.Errorf("--storage conflicts with --volumes, --all, --latest, --ignore and --cidfile") - } - } - responses, err := registry.ContainerEngine().ContainerRm(context.Background(), args, rmOptions) - if err != nil { - // TODO exitcode is a global main variable to track exit codes. - // we need this enabled - //if len(c.InputArgs) < 2 { - // exitCode = setExitCode(err) - //} - return err - } - for _, r := range responses { - if r.Err != nil { - // TODO this will not work with the remote client - if errors.Cause(err) == define.ErrWillDeadlock { - logrus.Errorf("Potential deadlock detected - please run 'podman system renumber' to resolve") - } - errs = append(errs, r.Err) - } else { - fmt.Println(r.Id) - } - } - return errs.PrintErrors() -} diff --git a/cmd/podmanV2/containers/stop.go b/cmd/podmanV2/containers/stop.go deleted file mode 100644 index d6f31352f..000000000 --- a/cmd/podmanV2/containers/stop.go +++ /dev/null @@ -1,83 +0,0 @@ -package containers - -import ( - "context" - "fmt" - - "github.com/containers/libpod/cmd/podmanV2/parse" - "github.com/containers/libpod/cmd/podmanV2/registry" - "github.com/containers/libpod/cmd/podmanV2/utils" - "github.com/containers/libpod/pkg/domain/entities" - "github.com/spf13/cobra" -) - -var ( - stopDescription = fmt.Sprintf(`Stops one or more running containers. The container name or ID can be used. - - A timeout to forcibly stop the container can also be set but defaults to %d seconds otherwise.`, defaultContainerConfig.Engine.StopTimeout) - stopCommand = &cobra.Command{ - Use: "stop [flags] CONTAINER [CONTAINER...]", - Short: "Stop one or more containers", - Long: stopDescription, - RunE: stop, - PersistentPreRunE: preRunE, - Args: func(cmd *cobra.Command, args []string) error { - return parse.CheckAllLatestAndCIDFile(cmd, args, false, true) - }, - Example: `podman stop ctrID - podman stop --latest - podman stop --time 2 mywebserver 6e534f14da9d`, - } -) - -var ( - stopOptions = entities.StopOptions{} - stopTimeout uint -) - -func init() { - registry.Commands = append(registry.Commands, registry.CliCommand{ - Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode}, - Command: stopCommand, - }) - flags := stopCommand.Flags() - flags.BoolVarP(&stopOptions.All, "all", "a", false, "Stop all running containers") - flags.BoolVarP(&stopOptions.Ignore, "ignore", "i", false, "Ignore errors when a specified container is missing") - flags.StringArrayVarP(&stopOptions.CIDFiles, "cidfile", "", nil, "Read the container ID from the file") - flags.BoolVarP(&stopOptions.Latest, "latest", "l", false, "Act on the latest container podman is aware of") - flags.UintVarP(&stopTimeout, "time", "t", defaultContainerConfig.Engine.StopTimeout, "Seconds to wait for stop before killing the container") - if registry.EngineOptions.EngineMode == entities.ABIMode { - _ = flags.MarkHidden("latest") - _ = flags.MarkHidden("cidfile") - _ = flags.MarkHidden("ignore") - } - flags.SetNormalizeFunc(utils.AliasFlags) -} - -func stop(cmd *cobra.Command, args []string) error { - var ( - errs utils.OutputErrors - ) - stopOptions.Timeout = defaultContainerConfig.Engine.StopTimeout - if cmd.Flag("time").Changed { - stopOptions.Timeout = stopTimeout - } - - // TODO How do we access global attributes? - //if c.Bool("trace") { - // span, _ := opentracing.StartSpanFromContext(Ctx, "stopCmd") - // defer span.Finish() - //} - responses, err := registry.ContainerEngine().ContainerStop(context.Background(), args, stopOptions) - if err != nil { - return err - } - for _, r := range responses { - if r.Err == nil { - fmt.Println(r.Id) - } else { - errs = append(errs, r.Err) - } - } - return errs.PrintErrors() -} diff --git a/cmd/podmanV2/containers/top.go b/cmd/podmanV2/containers/top.go deleted file mode 100644 index a86c12e2a..000000000 --- a/cmd/podmanV2/containers/top.go +++ /dev/null @@ -1,91 +0,0 @@ -package containers - -import ( - "context" - "fmt" - "os" - "strings" - "text/tabwriter" - - "github.com/containers/libpod/cmd/podmanV2/registry" - "github.com/containers/libpod/pkg/domain/entities" - "github.com/containers/psgo" - "github.com/pkg/errors" - "github.com/spf13/cobra" -) - -var ( - topDescription = fmt.Sprintf(`Similar to system "top" command. - - Specify format descriptors to alter the output. - - Running "podman top -l pid pcpu seccomp" will print the process ID, the CPU percentage and the seccomp mode of each process of the latest container. - Format Descriptors: - %s`, strings.Join(psgo.ListDescriptors(), ",")) - - topOptions = entities.TopOptions{} - - topCommand = &cobra.Command{ - Use: "top [flags] CONTAINER [FORMAT-DESCRIPTORS|ARGS]", - Short: "Display the running processes of a container", - Long: topDescription, - PersistentPreRunE: preRunE, - RunE: top, - Args: cobra.ArbitraryArgs, - Example: `podman top ctrID -podman top --latest -podman top ctrID pid seccomp args %C -podman top ctrID -eo user,pid,comm`, - } -) - -func init() { - registry.Commands = append(registry.Commands, registry.CliCommand{ - Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode}, - Command: topCommand, - }) - - topCommand.SetHelpTemplate(registry.HelpTemplate()) - topCommand.SetUsageTemplate(registry.UsageTemplate()) - - flags := topCommand.Flags() - flags.SetInterspersed(false) - flags.BoolVar(&topOptions.ListDescriptors, "list-descriptors", false, "") - flags.BoolVarP(&topOptions.Latest, "latest", "l", false, "Act on the latest container podman is aware of") - - _ = flags.MarkHidden("list-descriptors") // meant only for bash completion - if registry.IsRemote() { - _ = flags.MarkHidden("latest") - } -} - -func top(cmd *cobra.Command, args []string) error { - if topOptions.ListDescriptors { - fmt.Println(strings.Join(psgo.ListDescriptors(), "\n")) - return nil - } - - if len(args) < 1 && !topOptions.Latest { - return errors.Errorf("you must provide the name or id of a running container") - } - - if topOptions.Latest { - topOptions.Descriptors = args - } else { - topOptions.NameOrID = args[0] - topOptions.Descriptors = args[1:] - } - - topResponse, err := registry.ContainerEngine().ContainerTop(context.Background(), topOptions) - if err != nil { - return err - } - - w := tabwriter.NewWriter(os.Stdout, 5, 1, 3, ' ', 0) - for _, proc := range topResponse.Value { - if _, err := fmt.Fprintln(w, proc); err != nil { - return err - } - } - return w.Flush() -} diff --git a/cmd/podmanV2/containers/unpause.go b/cmd/podmanV2/containers/unpause.go deleted file mode 100644 index 6a3179f10..000000000 --- a/cmd/podmanV2/containers/unpause.go +++ /dev/null @@ -1,61 +0,0 @@ -package containers - -import ( - "context" - "fmt" - - "github.com/containers/libpod/cmd/podmanV2/registry" - "github.com/containers/libpod/cmd/podmanV2/utils" - "github.com/containers/libpod/pkg/domain/entities" - "github.com/containers/libpod/pkg/rootless" - "github.com/pkg/errors" - "github.com/spf13/cobra" -) - -var ( - unpauseDescription = `Unpauses one or more previously paused containers. The container name or ID can be used.` - unpauseCommand = &cobra.Command{ - Use: "unpause [flags] CONTAINER [CONTAINER...]", - Short: "Unpause the processes in one or more containers", - Long: unpauseDescription, - RunE: unpause, - PersistentPreRunE: preRunE, - Example: `podman unpause ctrID - podman unpause --all`, - } - unPauseOptions = entities.PauseUnPauseOptions{} -) - -func init() { - registry.Commands = append(registry.Commands, registry.CliCommand{ - Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode}, - Command: unpauseCommand, - Parent: containerCmd, - }) - flags := unpauseCommand.Flags() - flags.BoolVarP(&unPauseOptions.All, "all", "a", false, "Pause all running containers") -} - -func unpause(cmd *cobra.Command, args []string) error { - var ( - errs utils.OutputErrors - ) - if rootless.IsRootless() && !registry.IsRemote() { - return errors.New("unpause is not supported for rootless containers") - } - if len(args) < 1 && !unPauseOptions.All { - return errors.Errorf("you must provide at least one container name or id") - } - responses, err := registry.ContainerEngine().ContainerUnpause(context.Background(), args, unPauseOptions) - if err != nil { - return err - } - for _, r := range responses { - if r.Err == nil { - fmt.Println(r.Id) - } else { - errs = append(errs, r.Err) - } - } - return errs.PrintErrors() -} diff --git a/cmd/podmanV2/containers/utils.go b/cmd/podmanV2/containers/utils.go deleted file mode 100644 index 0c09d3e40..000000000 --- a/cmd/podmanV2/containers/utils.go +++ /dev/null @@ -1 +0,0 @@ -package containers diff --git a/cmd/podmanV2/containers/wait.go b/cmd/podmanV2/containers/wait.go deleted file mode 100644 index bf3c86200..000000000 --- a/cmd/podmanV2/containers/wait.go +++ /dev/null @@ -1,82 +0,0 @@ -package containers - -import ( - "context" - "fmt" - "time" - - "github.com/containers/libpod/cmd/podmanV2/parse" - "github.com/containers/libpod/cmd/podmanV2/registry" - "github.com/containers/libpod/cmd/podmanV2/utils" - "github.com/containers/libpod/libpod/define" - "github.com/containers/libpod/pkg/domain/entities" - "github.com/pkg/errors" - "github.com/spf13/cobra" -) - -var ( - waitDescription = `Block until one or more containers stop and then print their exit codes. -` - waitCommand = &cobra.Command{ - Use: "wait [flags] CONTAINER [CONTAINER...]", - Short: "Block on one or more containers", - Long: waitDescription, - RunE: wait, - PersistentPreRunE: preRunE, - Args: func(cmd *cobra.Command, args []string) error { - return parse.CheckAllLatestAndCIDFile(cmd, args, false, false) - }, - Example: `podman wait --latest - podman wait --interval 5000 ctrID - podman wait ctrID1 ctrID2`, - } -) - -var ( - waitOptions = entities.WaitOptions{} - waitCondition string -) - -func init() { - registry.Commands = append(registry.Commands, registry.CliCommand{ - Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode}, - Command: waitCommand, - }) - - flags := waitCommand.Flags() - flags.DurationVarP(&waitOptions.Interval, "interval", "i", time.Duration(250), "Milliseconds to wait before polling for completion") - flags.BoolVarP(&waitOptions.Latest, "latest", "l", false, "Act on the latest container podman is aware of") - flags.StringVar(&waitCondition, "condition", "stopped", "Condition to wait on") - if registry.EngineOptions.EngineMode == entities.ABIMode { - // TODO: This is the same as V1. We could skip creating the flag altogether in V2... - _ = flags.MarkHidden("latest") - } -} - -func wait(cmd *cobra.Command, args []string) error { - var ( - err error - errs utils.OutputErrors - ) - if waitOptions.Interval == 0 { - return errors.New("interval must be greater then 0") - } - - waitOptions.Condition, err = define.StringToContainerStatus(waitCondition) - if err != nil { - return err - } - - responses, err := registry.ContainerEngine().ContainerWait(context.Background(), args, waitOptions) - if err != nil { - return err - } - for _, r := range responses { - if r.Error == nil { - fmt.Println(r.Id) - } else { - errs = append(errs, r.Error) - } - } - return errs.PrintErrors() -} diff --git a/cmd/podmanV2/healthcheck/healthcheck.go b/cmd/podmanV2/healthcheck/healthcheck.go deleted file mode 100644 index 2af398ff0..000000000 --- a/cmd/podmanV2/healthcheck/healthcheck.go +++ /dev/null @@ -1,33 +0,0 @@ -package healthcheck - -import ( - "github.com/containers/libpod/cmd/podmanV2/registry" - "github.com/containers/libpod/pkg/domain/entities" - "github.com/spf13/cobra" -) - -var ( - // Command: healthcheck - healthCmd = &cobra.Command{ - Use: "healthcheck", - Short: "Manage Healthcheck", - Long: "Manage Healthcheck", - TraverseChildren: true, - PersistentPreRunE: preRunE, - RunE: registry.SubCommandExists, - } -) - -func init() { - registry.Commands = append(registry.Commands, registry.CliCommand{ - Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode}, - Command: healthCmd, - }) - healthCmd.SetHelpTemplate(registry.HelpTemplate()) - healthCmd.SetUsageTemplate(registry.UsageTemplate()) -} - -func preRunE(cmd *cobra.Command, args []string) error { - _, err := registry.NewContainerEngine(cmd, args) - return err -} diff --git a/cmd/podmanV2/healthcheck/run.go b/cmd/podmanV2/healthcheck/run.go deleted file mode 100644 index bb2962eaf..000000000 --- a/cmd/podmanV2/healthcheck/run.go +++ /dev/null @@ -1,42 +0,0 @@ -package healthcheck - -import ( - "context" - "fmt" - - "github.com/containers/libpod/cmd/podmanV2/registry" - "github.com/containers/libpod/pkg/domain/entities" - "github.com/spf13/cobra" -) - -var ( - healthcheckRunDescription = "run the health check of a container" - healthcheckrunCommand = &cobra.Command{ - Use: "run [flags] CONTAINER", - Short: "run the health check of a container", - Long: healthcheckRunDescription, - Example: `podman healthcheck run mywebapp`, - RunE: run, - Args: cobra.ExactArgs(1), - } -) - -func init() { - registry.Commands = append(registry.Commands, registry.CliCommand{ - Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode}, - Command: healthcheckrunCommand, - Parent: healthCmd, - }) -} - -func run(cmd *cobra.Command, args []string) error { - response, err := registry.ContainerEngine().HealthCheckRun(context.Background(), args[0], entities.HealthCheckOptions{}) - if err != nil { - return err - } - if response.Status == "unhealthy" { - registry.SetExitCode(1) - } - fmt.Println(response.Status) - return err -} diff --git a/cmd/podmanV2/images/exists.go b/cmd/podmanV2/images/exists.go deleted file mode 100644 index d35d6825e..000000000 --- a/cmd/podmanV2/images/exists.go +++ /dev/null @@ -1,40 +0,0 @@ -package images - -import ( - "os" - - "github.com/containers/libpod/cmd/podmanV2/registry" - "github.com/containers/libpod/pkg/domain/entities" - "github.com/spf13/cobra" -) - -var ( - existsCmd = &cobra.Command{ - Use: "exists IMAGE", - Short: "Check if an image exists in local storage", - Long: `If the named image exists in local storage, podman image exists exits with 0, otherwise the exit code will be 1.`, - Args: cobra.ExactArgs(1), - RunE: exists, - Example: `podman image exists ID - podman image exists IMAGE && podman pull IMAGE`, - } -) - -func init() { - registry.Commands = append(registry.Commands, registry.CliCommand{ - Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode}, - Command: existsCmd, - Parent: imageCmd, - }) -} - -func exists(cmd *cobra.Command, args []string) error { - found, err := registry.ImageEngine().Exists(registry.GetContext(), args[0]) - if err != nil { - return err - } - if !found.Value { - os.Exit(1) - } - return nil -} diff --git a/cmd/podmanV2/images/history.go b/cmd/podmanV2/images/history.go deleted file mode 100644 index f6f15e2f2..000000000 --- a/cmd/podmanV2/images/history.go +++ /dev/null @@ -1,123 +0,0 @@ -package images - -import ( - "context" - "fmt" - "os" - "strings" - "text/tabwriter" - "text/template" - "time" - - "github.com/containers/libpod/cmd/podmanV2/registry" - "github.com/containers/libpod/cmd/podmanV2/report" - "github.com/containers/libpod/pkg/domain/entities" - jsoniter "github.com/json-iterator/go" - "github.com/pkg/errors" - "github.com/spf13/cobra" -) - -var ( - long = `Displays the history of an image. - - The information can be printed out in an easy to read, or user specified format, and can be truncated.` - - // podman _history_ - historyCmd = &cobra.Command{ - Use: "history [flags] IMAGE", - Short: "Show history of a specified image", - Long: long, - Example: "podman history quay.io/fedora/fedora", - Args: cobra.ExactArgs(1), - PersistentPreRunE: preRunE, - RunE: history, - } - - opts = struct { - human bool - noTrunc bool - quiet bool - format string - }{} -) - -func init() { - registry.Commands = append(registry.Commands, registry.CliCommand{ - Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode}, - Command: historyCmd, - }) - - historyCmd.SetHelpTemplate(registry.HelpTemplate()) - historyCmd.SetUsageTemplate(registry.UsageTemplate()) - - flags := historyCmd.Flags() - flags.StringVar(&opts.format, "format", "", "Change the output to JSON or a Go template") - flags.BoolVarP(&opts.human, "human", "H", false, "Display sizes and dates in human readable format") - flags.BoolVar(&opts.noTrunc, "no-trunc", false, "Do not truncate the output") - flags.BoolVar(&opts.noTrunc, "notruncate", false, "Do not truncate the output") - flags.BoolVarP(&opts.quiet, "quiet", "q", false, "Display the numeric IDs only") -} - -func history(cmd *cobra.Command, args []string) error { - results, err := registry.ImageEngine().History(context.Background(), args[0], entities.ImageHistoryOptions{}) - if err != nil { - return err - } - - if opts.format == "json" { - var err error - if len(results.Layers) == 0 { - _, err = fmt.Fprintf(os.Stdout, "[]\n") - } else { - // ah-hoc change to "Created": type and format - type layer struct { - entities.ImageHistoryLayer - Created string `json:"Created"` - } - - layers := make([]layer, len(results.Layers)) - for i, l := range results.Layers { - layers[i].ImageHistoryLayer = l - layers[i].Created = time.Unix(l.Created, 0).Format(time.RFC3339) - } - json := jsoniter.ConfigCompatibleWithStandardLibrary - enc := json.NewEncoder(os.Stdout) - err = enc.Encode(layers) - } - return err - } - - // Defaults - hdr := "ID\tCREATED\tCREATED BY\tSIZE\tCOMMENT\n" - row := "{{slice .ID 0 12}}\t{{humanDuration .Created}}\t{{ellipsis .CreatedBy 45}}\t{{.Size}}\t{{.Comment}}\n" - - if len(opts.format) > 0 { - hdr = "" - row = opts.format - if !strings.HasSuffix(opts.format, "\n") { - row += "\n" - } - } else { - switch { - case opts.human: - row = "{{slice .ID 0 12}}\t{{humanDuration .Created}}\t{{ellipsis .CreatedBy 45}}\t{{humanSize .Size}}\t{{.Comment}}\n" - case opts.noTrunc: - row = "{{.ID}}\t{{humanDuration .Created}}\t{{.CreatedBy}}\t{{humanSize .Size}}\t{{.Comment}}\n" - case opts.quiet: - hdr = "" - row = "{{.ID}}\n" - } - } - format := hdr + "{{range . }}" + row + "{{end}}" - - tmpl := template.Must(template.New("report").Funcs(report.PodmanTemplateFuncs()).Parse(format)) - w := tabwriter.NewWriter(os.Stdout, 8, 2, 2, ' ', 0) - - _, _ = w.Write(report.ReportHeader("id", "created", "created by", "size", "comment")) - err = tmpl.Execute(w, results.Layers) - if err != nil { - fmt.Fprintln(os.Stderr, errors.Wrapf(err, "Failed to print report")) - } - w.Flush() - return nil -} diff --git a/cmd/podmanV2/images/image.go b/cmd/podmanV2/images/image.go deleted file mode 100644 index 9fc7b21d1..000000000 --- a/cmd/podmanV2/images/image.go +++ /dev/null @@ -1,35 +0,0 @@ -package images - -import ( - "github.com/containers/libpod/cmd/podmanV2/registry" - "github.com/containers/libpod/pkg/domain/entities" - "github.com/spf13/cobra" -) - -var ( - // Command: podman _image_ - imageCmd = &cobra.Command{ - Use: "image", - Short: "Manage images", - Long: "Manage images", - TraverseChildren: true, - PersistentPreRunE: preRunE, - RunE: registry.SubCommandExists, - } -) - -func init() { - registry.Commands = append(registry.Commands, registry.CliCommand{ - Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode}, - Command: imageCmd, - }) - imageCmd.SetHelpTemplate(registry.HelpTemplate()) - imageCmd.SetUsageTemplate(registry.UsageTemplate()) -} - -func preRunE(cmd *cobra.Command, args []string) error { - if _, err := registry.NewImageEngine(cmd, args); err != nil { - return err - } - return nil -} diff --git a/cmd/podmanV2/images/images.go b/cmd/podmanV2/images/images.go deleted file mode 100644 index d00f0996e..000000000 --- a/cmd/podmanV2/images/images.go +++ /dev/null @@ -1,33 +0,0 @@ -package images - -import ( - "strings" - - "github.com/containers/libpod/cmd/podmanV2/registry" - "github.com/containers/libpod/pkg/domain/entities" - "github.com/spf13/cobra" -) - -var ( - // podman _images_ Alias for podman image _list_ - imagesCmd = &cobra.Command{ - Use: strings.Replace(listCmd.Use, "list", "images", 1), - Args: listCmd.Args, - Short: listCmd.Short, - Long: listCmd.Long, - PreRunE: preRunE, - RunE: listCmd.RunE, - Example: strings.Replace(listCmd.Example, "podman image list", "podman images", -1), - } -) - -func init() { - registry.Commands = append(registry.Commands, registry.CliCommand{ - Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode}, - Command: imagesCmd, - }) - imagesCmd.SetHelpTemplate(registry.HelpTemplate()) - imagesCmd.SetUsageTemplate(registry.UsageTemplate()) - - imageListFlagSet(imagesCmd.Flags()) -} diff --git a/cmd/podmanV2/images/import.go b/cmd/podmanV2/images/import.go deleted file mode 100644 index 09a15585f..000000000 --- a/cmd/podmanV2/images/import.go +++ /dev/null @@ -1,87 +0,0 @@ -package images - -import ( - "context" - "fmt" - - "github.com/containers/libpod/cmd/podmanV2/parse" - "github.com/containers/libpod/cmd/podmanV2/registry" - "github.com/containers/libpod/pkg/domain/entities" - "github.com/hashicorp/go-multierror" - "github.com/pkg/errors" - "github.com/spf13/cobra" -) - -var ( - importDescription = `Create a container image from the contents of the specified tarball (.tar, .tar.gz, .tgz, .bzip, .tar.xz, .txz). - - Note remote tar balls can be specified, via web address. - Optionally tag the image. You can specify the instructions using the --change option.` - importCommand = &cobra.Command{ - Use: "import [flags] PATH [REFERENCE]", - Short: "Import a tarball to create a filesystem image", - Long: importDescription, - RunE: importCon, - PersistentPreRunE: preRunE, - Example: `podman import http://example.com/ctr.tar url-image - cat ctr.tar | podman -q import --message "importing the ctr.tar tarball" - image-imported - cat ctr.tar | podman import -`, - } -) - -var ( - importOpts entities.ImageImportOptions -) - -func init() { - registry.Commands = append(registry.Commands, registry.CliCommand{ - Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode}, - Command: importCommand, - }) - - importCommand.SetHelpTemplate(registry.HelpTemplate()) - importCommand.SetUsageTemplate(registry.UsageTemplate()) - flags := importCommand.Flags() - flags.StringArrayVarP(&importOpts.Changes, "change", "c", []string{}, "Apply the following possible instructions to the created image (default []): CMD | ENTRYPOINT | ENV | EXPOSE | LABEL | STOPSIGNAL | USER | VOLUME | WORKDIR") - flags.StringVarP(&importOpts.Message, "message", "m", "", "Set commit message for imported image") - flags.BoolVarP(&importOpts.Quiet, "quiet", "q", false, "Suppress output") -} - -func importCon(cmd *cobra.Command, args []string) error { - var ( - source string - reference string - ) - switch len(args) { - case 0: - return errors.Errorf("need to give the path to the tarball, or must specify a tarball of '-' for stdin") - case 1: - source = args[0] - case 2: - source = args[0] - // TODO when save is merged, we need to process reference - // like it is done in there or we end up with docker.io prepends - // instead of the localhost ones - reference = args[1] - default: - return errors.Errorf("too many arguments. Usage TARBALL [REFERENCE]") - } - errFileName := parse.ValidateFileName(source) - errURL := parse.ValidURL(source) - if errURL == nil { - importOpts.SourceIsURL = true - } - if errFileName != nil && errURL != nil { - return multierror.Append(errFileName, errURL) - } - - importOpts.Source = source - importOpts.Reference = reference - - response, err := registry.ImageEngine().Import(context.Background(), importOpts) - if err != nil { - return err - } - fmt.Println(response.Id) - return nil -} diff --git a/cmd/podmanV2/images/inspect.go b/cmd/podmanV2/images/inspect.go deleted file mode 100644 index d7f6b0ee1..000000000 --- a/cmd/podmanV2/images/inspect.go +++ /dev/null @@ -1,109 +0,0 @@ -package images - -import ( - "context" - "encoding/json" - "fmt" - "os" - "strings" - "text/tabwriter" - "text/template" - - "github.com/containers/buildah/pkg/formats" - "github.com/containers/libpod/cmd/podmanV2/common" - "github.com/containers/libpod/cmd/podmanV2/registry" - "github.com/containers/libpod/pkg/domain/entities" - "github.com/pkg/errors" - "github.com/spf13/cobra" -) - -var ( - // Command: podman image _inspect_ - inspectCmd = &cobra.Command{ - Use: "inspect [flags] IMAGE", - Short: "Display the configuration of an image", - Long: `Displays the low-level information on an image identified by name or ID.`, - RunE: inspect, - Example: `podman image inspect alpine`, - } - inspectOpts *entities.InspectOptions -) - -func init() { - registry.Commands = append(registry.Commands, registry.CliCommand{ - Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode}, - Command: inspectCmd, - Parent: imageCmd, - }) - inspectOpts = common.AddInspectFlagSet(inspectCmd) -} - -func inspect(cmd *cobra.Command, args []string) error { - latestContainer := inspectOpts.Latest - - if len(args) == 0 && !latestContainer { - return errors.Errorf("container or image name must be specified: podman inspect [options [...]] name") - } - - if len(args) > 0 && latestContainer { - return errors.Errorf("you cannot provide additional arguments with --latest") - } - - results, err := registry.ImageEngine().Inspect(context.Background(), args, *inspectOpts) - if err != nil { - return err - } - - if len(results.Images) > 0 { - if inspectOpts.Format == "" { - buf, err := json.MarshalIndent(results.Images, "", " ") - if err != nil { - return err - } - fmt.Println(string(buf)) - - for id, e := range results.Errors { - fmt.Fprintf(os.Stderr, "%s: %s\n", id, e.Error()) - } - return nil - } - - row := inspectFormat(inspectOpts.Format) - format := "{{range . }}" + row + "{{end}}" - tmpl, err := template.New("inspect").Parse(format) - if err != nil { - return err - } - - w := tabwriter.NewWriter(os.Stdout, 8, 2, 2, ' ', 0) - defer func() { _ = w.Flush() }() - err = tmpl.Execute(w, results) - if err != nil { - return err - } - } - - for id, e := range results.Errors { - fmt.Fprintf(os.Stderr, "%s: %s\n", id, e.Error()) - } - return nil -} - -func inspectFormat(row string) string { - r := strings.NewReplacer("{{.Id}}", formats.IDString, - ".Src", ".Source", - ".Dst", ".Destination", - ".ImageID", ".Image", - ) - row = r.Replace(row) - - if !strings.HasSuffix(row, "\n") { - row += "\n" - } - return row -} - -func Inspect(cmd *cobra.Command, args []string, options *entities.InspectOptions) error { - inspectOpts = options - return inspect(cmd, args) -} diff --git a/cmd/podmanV2/images/list.go b/cmd/podmanV2/images/list.go deleted file mode 100644 index 2d6cb3596..000000000 --- a/cmd/podmanV2/images/list.go +++ /dev/null @@ -1,243 +0,0 @@ -package images - -import ( - "errors" - "fmt" - "os" - "sort" - "strings" - "text/tabwriter" - "text/template" - "time" - - "github.com/containers/libpod/cmd/podmanV2/registry" - "github.com/containers/libpod/cmd/podmanV2/report" - "github.com/containers/libpod/pkg/domain/entities" - jsoniter "github.com/json-iterator/go" - "github.com/spf13/cobra" - "github.com/spf13/pflag" -) - -type listFlagType struct { - format string - history bool - noHeading bool - noTrunc bool - quiet bool - sort string - readOnly bool - digests bool -} - -var ( - // Command: podman image _list_ - listCmd = &cobra.Command{ - Use: "list [flag] [IMAGE]", - Aliases: []string{"ls"}, - Args: cobra.MaximumNArgs(1), - Short: "List images in local storage", - Long: "Lists images previously pulled to the system or created on the system.", - RunE: images, - Example: `podman image list --format json - podman image list --sort repository --format "table {{.ID}} {{.Repository}} {{.Tag}}" - podman image list --filter dangling=true`, - } - - // Options to pull data - listOptions = entities.ImageListOptions{} - - // Options for presenting data - listFlag = listFlagType{} - - sortFields = entities.NewStringSet( - "created", - "id", - "repository", - "size", - "tag") -) - -func init() { - registry.Commands = append(registry.Commands, registry.CliCommand{ - Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode}, - Command: listCmd, - Parent: imageCmd, - }) - imageListFlagSet(listCmd.Flags()) -} - -func imageListFlagSet(flags *pflag.FlagSet) { - flags.BoolVarP(&listOptions.All, "all", "a", false, "Show all images (default hides intermediate images)") - flags.StringSliceVarP(&listOptions.Filter, "filter", "f", []string{}, "Filter output based on conditions provided (default [])") - flags.StringVar(&listFlag.format, "format", "", "Change the output format to JSON or a Go template") - flags.BoolVar(&listFlag.digests, "digests", false, "Show digests") - flags.BoolVarP(&listFlag.noHeading, "noheading", "n", false, "Do not print column headings") - flags.BoolVar(&listFlag.noTrunc, "no-trunc", false, "Do not truncate output") - flags.BoolVar(&listFlag.noTrunc, "notruncate", false, "Do not truncate output") - flags.BoolVarP(&listFlag.quiet, "quiet", "q", false, "Display only image IDs") - flags.StringVar(&listFlag.sort, "sort", "created", "Sort by "+sortFields.String()) - flags.BoolVarP(&listFlag.history, "history", "", false, "Display the image name history") -} - -func images(cmd *cobra.Command, args []string) error { - if len(listOptions.Filter) > 0 && len(args) > 0 { - return errors.New("cannot specify an image and a filter(s)") - } - - if len(listOptions.Filter) < 1 && len(args) > 0 { - listOptions.Filter = append(listOptions.Filter, "reference="+args[0]) - } - - if cmd.Flag("sort").Changed && !sortFields.Contains(listFlag.sort) { - return fmt.Errorf("\"%s\" is not a valid field for sorting. Choose from: %s", - listFlag.sort, sortFields.String()) - } - - summaries, err := registry.ImageEngine().List(registry.GetContext(), listOptions) - if err != nil { - return err - } - - imageS := summaries - sort.Slice(imageS, sortFunc(listFlag.sort, imageS)) - - if cmd.Flag("format").Changed && listFlag.format == "json" { - return writeJSON(imageS) - } else { - return writeTemplate(imageS, err) - } -} - -func writeJSON(imageS []*entities.ImageSummary) error { - type image struct { - entities.ImageSummary - Created string - } - - imgs := make([]image, 0, len(imageS)) - for _, e := range imageS { - var h image - h.ImageSummary = *e - h.Created = time.Unix(e.Created, 0).Format(time.RFC3339) - h.RepoTags = nil - - imgs = append(imgs, h) - } - - json := jsoniter.ConfigCompatibleWithStandardLibrary - enc := json.NewEncoder(os.Stdout) - return enc.Encode(imgs) -} - -func writeTemplate(imageS []*entities.ImageSummary, err error) error { - type image struct { - entities.ImageSummary - Repository string `json:"repository,omitempty"` - Tag string `json:"tag,omitempty"` - } - - imgs := make([]image, 0, len(imageS)) - for _, e := range imageS { - for _, tag := range e.RepoTags { - var h image - h.ImageSummary = *e - h.Repository, h.Tag = tokenRepoTag(tag) - imgs = append(imgs, h) - } - if e.IsReadOnly() { - listFlag.readOnly = true - } - } - - hdr, row := imageListFormat(listFlag) - format := hdr + "{{range . }}" + row + "{{end}}" - - tmpl := template.Must(template.New("list").Funcs(report.PodmanTemplateFuncs()).Parse(format)) - w := tabwriter.NewWriter(os.Stdout, 8, 2, 2, ' ', 0) - defer w.Flush() - return tmpl.Execute(w, imgs) -} - -func tokenRepoTag(tag string) (string, string) { - tokens := strings.SplitN(tag, ":", 2) - switch len(tokens) { - case 0: - return tag, "" - case 1: - return tokens[0], "" - case 2: - return tokens[0], tokens[1] - default: - return "<N/A>", "" - } -} - -func sortFunc(key string, data []*entities.ImageSummary) func(i, j int) bool { - switch key { - case "id": - return func(i, j int) bool { - return data[i].ID < data[j].ID - } - case "repository": - return func(i, j int) bool { - return data[i].RepoTags[0] < data[j].RepoTags[0] - } - case "size": - return func(i, j int) bool { - return data[i].Size < data[j].Size - } - case "tag": - return func(i, j int) bool { - return data[i].RepoTags[0] < data[j].RepoTags[0] - } - default: - // case "created": - return func(i, j int) bool { - return data[i].Created >= data[j].Created - } - } -} - -func imageListFormat(flags listFlagType) (string, string) { - if flags.quiet { - return "", "{{slice .ID 0 12}}\n" - } - - // Defaults - hdr := "REPOSITORY\tTAG" - row := "{{.Repository}}\t{{if .Tag}}{{.Tag}}{{else}}<none>{{end}}" - - if flags.digests { - hdr += "\tDIGEST" - row += "\t{{.Digest}}" - } - - hdr += "\tIMAGE ID" - if flags.noTrunc { - row += "\tsha256:{{.ID}}" - } else { - row += "\t{{slice .ID 0 12}}" - } - - hdr += "\tCREATED\tSIZE" - row += "\t{{humanDuration .Created}}\t{{humanSize .Size}}" - - if flags.history { - hdr += "\tHISTORY" - row += "\t{{if .History}}{{join .History \", \"}}{{else}}<none>{{end}}" - } - - if flags.readOnly { - hdr += "\tReadOnly" - row += "\t{{.ReadOnly}}" - } - - if flags.noHeading { - hdr = "" - } else { - hdr += "\n" - } - - row += "\n" - return hdr, row -} diff --git a/cmd/podmanV2/images/load.go b/cmd/podmanV2/images/load.go deleted file mode 100644 index f60dc4908..000000000 --- a/cmd/podmanV2/images/load.go +++ /dev/null @@ -1,61 +0,0 @@ -package images - -import ( - "context" - "fmt" - - "github.com/containers/libpod/cmd/podmanV2/registry" - "github.com/containers/libpod/libpod/image" - "github.com/containers/libpod/pkg/domain/entities" - "github.com/spf13/cobra" -) - -var ( - loadDescription = "Loads an image from a locally stored archive (tar file) into container storage." - loadCommand = &cobra.Command{ - Use: "load [flags] [NAME[:TAG]]", - Short: "Load an image from container archive", - Long: loadDescription, - RunE: load, - Args: cobra.MaximumNArgs(1), - PersistentPreRunE: preRunE, - } -) - -var ( - loadOpts entities.ImageLoadOptions -) - -func init() { - registry.Commands = append(registry.Commands, registry.CliCommand{ - Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode}, - Command: loadCommand, - }) - - loadCommand.SetHelpTemplate(registry.HelpTemplate()) - loadCommand.SetUsageTemplate(registry.UsageTemplate()) - flags := loadCommand.Flags() - flags.StringVarP(&loadOpts.Input, "input", "i", "", "Read from specified archive file (default: stdin)") - flags.BoolVarP(&loadOpts.Quiet, "quiet", "q", false, "Suppress the output") - flags.StringVar(&loadOpts.SignaturePolicy, "signature-policy", "", "Pathname of signature policy file") - if registry.IsRemote() { - _ = flags.MarkHidden("signature-policy") - } - -} - -func load(cmd *cobra.Command, args []string) error { - if len(args) > 0 { - repo, err := image.NormalizedTag(args[0]) - if err != nil { - return err - } - loadOpts.Name = repo.Name() - } - response, err := registry.ImageEngine().Load(context.Background(), loadOpts) - if err != nil { - return err - } - fmt.Println("Loaded image: " + response.Name) - return nil -} diff --git a/cmd/podmanV2/images/prune.go b/cmd/podmanV2/images/prune.go deleted file mode 100644 index 6577c458e..000000000 --- a/cmd/podmanV2/images/prune.go +++ /dev/null @@ -1,86 +0,0 @@ -package images - -import ( - "bufio" - "fmt" - "os" - "strings" - - "github.com/containers/libpod/cmd/podmanV2/registry" - "github.com/containers/libpod/pkg/domain/entities" - "github.com/pkg/errors" - "github.com/spf13/cobra" -) - -var ( - pruneDescription = `Removes all unnamed images from local storage. - - If an image is not being used by a container, it will be removed from the system.` - pruneCmd = &cobra.Command{ - Use: "prune", - Args: cobra.NoArgs, - Short: "Remove unused images", - Long: pruneDescription, - RunE: prune, - Example: `podman image prune`, - } - - pruneOpts = entities.ImagePruneOptions{} - force bool - filter = []string{} -) - -func init() { - registry.Commands = append(registry.Commands, registry.CliCommand{ - Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode}, - Command: pruneCmd, - Parent: imageCmd, - }) - - flags := pruneCmd.Flags() - flags.BoolVarP(&pruneOpts.All, "all", "a", false, "Remove all unused images, not just dangling ones") - flags.BoolVarP(&force, "force", "f", false, "Do not prompt for confirmation") - flags.StringArrayVar(&filter, "filter", []string{}, "Provide filter values (e.g. 'label=<key>=<value>')") - -} - -func prune(cmd *cobra.Command, args []string) error { - if !force { - reader := bufio.NewReader(os.Stdin) - fmt.Printf(` -WARNING! This will remove all dangling images. -Are you sure you want to continue? [y/N] `) - answer, err := reader.ReadString('\n') - if err != nil { - return errors.Wrapf(err, "error reading input") - } - if strings.ToLower(answer)[0] != 'y' { - return nil - } - } - - // TODO Remove once filter refactor is finished and url.Values rules :) - for _, f := range filter { - t := strings.SplitN(f, "=", 2) - pruneOpts.Filters.Add(t[0], t[1]) - } - - results, err := registry.ImageEngine().Prune(registry.GetContext(), pruneOpts) - if err != nil { - return err - } - - for _, i := range results.Report.Id { - fmt.Println(i) - } - - for _, e := range results.Report.Err { - fmt.Fprint(os.Stderr, e.Error()+"\n") - } - - if results.Size > 0 { - fmt.Fprintf(os.Stdout, "Size: %d\n", results.Size) - } - - return nil -} diff --git a/cmd/podmanV2/images/pull.go b/cmd/podmanV2/images/pull.go deleted file mode 100644 index c7e325409..000000000 --- a/cmd/podmanV2/images/pull.go +++ /dev/null @@ -1,140 +0,0 @@ -package images - -import ( - "fmt" - - buildahcli "github.com/containers/buildah/pkg/cli" - "github.com/containers/image/v5/types" - "github.com/containers/libpod/cmd/podmanV2/registry" - "github.com/containers/libpod/pkg/domain/entities" - "github.com/opentracing/opentracing-go" - "github.com/pkg/errors" - "github.com/spf13/cobra" - "github.com/spf13/pflag" -) - -// pullOptionsWrapper wraps entities.ImagePullOptions and prevents leaking -// CLI-only fields into the API types. -type pullOptionsWrapper struct { - entities.ImagePullOptions - TLSVerifyCLI bool // CLI only -} - -var ( - pullOptions = pullOptionsWrapper{} - pullDescription = `Pulls an image from a registry and stores it locally. - - An image can be pulled by tag or digest. If a tag is not specified, the image with the 'latest' tag is pulled.` - - // Command: podman pull - pullCmd = &cobra.Command{ - Use: "pull [flags] IMAGE", - Short: "Pull an image from a registry", - Long: pullDescription, - PreRunE: preRunE, - RunE: imagePull, - Example: `podman pull imageName - podman pull fedora:latest`, - } - - // Command: podman image pull - // It's basically a clone of `pullCmd` with the exception of being a - // child of the images command. - imagesPullCmd = &cobra.Command{ - Use: pullCmd.Use, - Short: pullCmd.Short, - Long: pullCmd.Long, - PreRunE: pullCmd.PreRunE, - RunE: pullCmd.RunE, - Example: `podman image pull imageName - podman image pull fedora:latest`, - } -) - -func init() { - // pull - registry.Commands = append(registry.Commands, registry.CliCommand{ - Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode}, - Command: pullCmd, - }) - - pullCmd.SetHelpTemplate(registry.HelpTemplate()) - pullCmd.SetUsageTemplate(registry.UsageTemplate()) - - flags := pullCmd.Flags() - pullFlags(flags) - - // images pull - registry.Commands = append(registry.Commands, registry.CliCommand{ - Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode}, - Command: imagesPullCmd, - Parent: imageCmd, - }) - - imagesPullCmd.SetHelpTemplate(registry.HelpTemplate()) - imagesPullCmd.SetUsageTemplate(registry.UsageTemplate()) - imagesPullFlags := imagesPullCmd.Flags() - pullFlags(imagesPullFlags) -} - -// pullFlags set the flags for the pull command. -func pullFlags(flags *pflag.FlagSet) { - flags.BoolVar(&pullOptions.AllTags, "all-tags", false, "All tagged images in the repository will be pulled") - flags.StringVar(&pullOptions.Authfile, "authfile", buildahcli.GetDefaultAuthFile(), "Path of the authentication file. Use REGISTRY_AUTH_FILE environment variable to override") - flags.StringVar(&pullOptions.CertDir, "cert-dir", "", "`Pathname` of a directory containing TLS certificates and keys") - flags.StringVar(&pullOptions.Credentials, "creds", "", "`Credentials` (USERNAME:PASSWORD) to use for authenticating to a registry") - flags.StringVar(&pullOptions.OverrideArch, "override-arch", "", "Use `ARCH` instead of the architecture of the machine for choosing images") - flags.StringVar(&pullOptions.OverrideOS, "override-os", "", "Use `OS` instead of the running OS for choosing images") - flags.BoolVarP(&pullOptions.Quiet, "quiet", "q", false, "Suppress output information when pulling images") - flags.StringVar(&pullOptions.SignaturePolicy, "signature-policy", "", "`Pathname` of signature policy file (not usually used)") - flags.BoolVar(&pullOptions.TLSVerifyCLI, "tls-verify", true, "Require HTTPS and verify certificates when contacting registries") - - if registry.IsRemote() { - _ = flags.MarkHidden("authfile") - _ = flags.MarkHidden("cert-dir") - _ = flags.MarkHidden("signature-policy") - _ = flags.MarkHidden("tls-verify") - } -} - -// imagePull is implement the command for pulling images. -func imagePull(cmd *cobra.Command, args []string) error { - // Sanity check input. - if len(args) == 0 { - return errors.Errorf("an image name must be specified") - } - if len(args) > 1 { - return errors.Errorf("too many arguments. Requires exactly 1") - } - - // Start tracing if requested. - if cmd.Flags().Changed("trace") { - span, _ := opentracing.StartSpanFromContext(registry.GetContext(), "pullCmd") - defer span.Finish() - } - - pullOptsAPI := pullOptions.ImagePullOptions - // TLS verification in c/image is controlled via a `types.OptionalBool` - // which allows for distinguishing among set-true, set-false, unspecified - // which is important to implement a sane way of dealing with defaults of - // boolean CLI flags. - if cmd.Flags().Changed("tls-verify") { - pullOptsAPI.TLSVerify = types.NewOptionalBool(pullOptions.TLSVerifyCLI) - } - - // Let's do all the remaining Yoga in the API to prevent us from - // scattering logic across (too) many parts of the code. - pullReport, err := registry.ImageEngine().Pull(registry.GetContext(), args[0], pullOptsAPI) - if err != nil { - return err - } - - if len(pullReport.Images) > 1 { - fmt.Println("Pulled Images:") - } - for _, img := range pullReport.Images { - fmt.Println(img) - } - - return nil -} diff --git a/cmd/podmanV2/images/rm.go b/cmd/podmanV2/images/rm.go deleted file mode 100644 index bb5880de3..000000000 --- a/cmd/podmanV2/images/rm.go +++ /dev/null @@ -1,70 +0,0 @@ -package images - -import ( - "fmt" - "os" - - "github.com/containers/libpod/cmd/podmanV2/registry" - "github.com/containers/libpod/pkg/domain/entities" - "github.com/pkg/errors" - "github.com/spf13/cobra" -) - -var ( - rmDescription = "Removes one or more previously pulled or locally created images." - rmCmd = &cobra.Command{ - Use: "rm [flags] IMAGE [IMAGE...]", - Short: "Removes one or more images from local storage", - Long: rmDescription, - PreRunE: preRunE, - RunE: rm, - Example: `podman image rm imageID - podman image rm --force alpine - podman image rm c4dfb1609ee2 93fd78260bd1 c0ed59d05ff7`, - } - - imageOpts = entities.ImageDeleteOptions{} -) - -func init() { - registry.Commands = append(registry.Commands, registry.CliCommand{ - Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode}, - Command: rmCmd, - Parent: imageCmd, - }) - - flags := rmCmd.Flags() - flags.BoolVarP(&imageOpts.All, "all", "a", false, "Remove all images") - flags.BoolVarP(&imageOpts.Force, "force", "f", false, "Force Removal of the image") -} - -func rm(cmd *cobra.Command, args []string) error { - - if len(args) < 1 && !imageOpts.All { - return errors.Errorf("image name or ID must be specified") - } - if len(args) > 0 && imageOpts.All { - return errors.Errorf("when using the --all switch, you may not pass any images names or IDs") - } - - report, err := registry.ImageEngine().Delete(registry.GetContext(), args, imageOpts) - if err != nil { - switch { - case report != nil && report.ImageNotFound != nil: - fmt.Fprintln(os.Stderr, err.Error()) - registry.SetExitCode(2) - case report != nil && report.ImageInUse != nil: - fmt.Fprintln(os.Stderr, err.Error()) - default: - return err - } - } - - for _, u := range report.Untagged { - fmt.Println("Untagged: " + u) - } - for _, d := range report.Deleted { - fmt.Println("Deleted: " + d) - } - return nil -} diff --git a/cmd/podmanV2/images/rmi.go b/cmd/podmanV2/images/rmi.go deleted file mode 100644 index 7f9297bc9..000000000 --- a/cmd/podmanV2/images/rmi.go +++ /dev/null @@ -1,30 +0,0 @@ -package images - -import ( - "strings" - - "github.com/containers/libpod/cmd/podmanV2/registry" - "github.com/containers/libpod/pkg/domain/entities" - "github.com/spf13/cobra" -) - -var ( - rmiCmd = &cobra.Command{ - Use: strings.Replace(rmCmd.Use, "rm ", "rmi ", 1), - Args: rmCmd.Args, - Short: rmCmd.Short, - Long: rmCmd.Long, - PreRunE: rmCmd.PreRunE, - RunE: rmCmd.RunE, - Example: strings.Replace(rmCmd.Example, "podman image rm", "podman rmi", -1), - } -) - -func init() { - registry.Commands = append(registry.Commands, registry.CliCommand{ - Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode}, - Command: rmiCmd, - }) - rmiCmd.SetHelpTemplate(registry.HelpTemplate()) - rmiCmd.SetUsageTemplate(registry.UsageTemplate()) -} diff --git a/cmd/podmanV2/images/tag.go b/cmd/podmanV2/images/tag.go deleted file mode 100644 index f66fe7857..000000000 --- a/cmd/podmanV2/images/tag.go +++ /dev/null @@ -1,34 +0,0 @@ -package images - -import ( - "github.com/containers/libpod/cmd/podmanV2/registry" - "github.com/containers/libpod/pkg/domain/entities" - "github.com/spf13/cobra" -) - -var ( - tagDescription = "Adds one or more additional names to locally-stored image." - tagCommand = &cobra.Command{ - Use: "tag [flags] IMAGE TARGET_NAME [TARGET_NAME...]", - Short: "Add an additional name to a local image", - Long: tagDescription, - RunE: tag, - Args: cobra.MinimumNArgs(2), - Example: `podman tag 0e3bbc2 fedora:latest - podman tag imageID:latest myNewImage:newTag - podman tag httpd myregistryhost:5000/fedora/httpd:v2`, - } -) - -func init() { - registry.Commands = append(registry.Commands, registry.CliCommand{ - Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode}, - Command: tagCommand, - }) - tagCommand.SetHelpTemplate(registry.HelpTemplate()) - tagCommand.SetUsageTemplate(registry.UsageTemplate()) -} - -func tag(cmd *cobra.Command, args []string) error { - return registry.ImageEngine().Tag(registry.GetContext(), args[0], args[1:], entities.ImageTagOptions{}) -} diff --git a/cmd/podmanV2/images/untag.go b/cmd/podmanV2/images/untag.go deleted file mode 100644 index c84827bb3..000000000 --- a/cmd/podmanV2/images/untag.go +++ /dev/null @@ -1,33 +0,0 @@ -package images - -import ( - "github.com/containers/libpod/cmd/podmanV2/registry" - "github.com/containers/libpod/pkg/domain/entities" - "github.com/spf13/cobra" -) - -var ( - untagCommand = &cobra.Command{ - Use: "untag [flags] IMAGE [NAME...]", - Short: "Remove a name from a local image", - Long: "Removes one or more names from a locally-stored image.", - RunE: untag, - Args: cobra.MinimumNArgs(1), - Example: `podman untag 0e3bbc2 - podman untag imageID:latest otherImageName:latest - podman untag httpd myregistryhost:5000/fedora/httpd:v2`, - } -) - -func init() { - registry.Commands = append(registry.Commands, registry.CliCommand{ - Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode}, - Command: untagCommand, - }) - untagCommand.SetHelpTemplate(registry.HelpTemplate()) - untagCommand.SetUsageTemplate(registry.UsageTemplate()) -} - -func untag(cmd *cobra.Command, args []string) error { - return registry.ImageEngine().Untag(registry.GetContext(), args[0], args[1:], entities.ImageUntagOptions{}) -} diff --git a/cmd/podmanV2/inspect.go b/cmd/podmanV2/inspect.go deleted file mode 100644 index 4975cf632..000000000 --- a/cmd/podmanV2/inspect.go +++ /dev/null @@ -1,62 +0,0 @@ -package main - -import ( - "context" - "fmt" - - "github.com/containers/libpod/cmd/podmanV2/common" - "github.com/containers/libpod/cmd/podmanV2/containers" - "github.com/containers/libpod/cmd/podmanV2/images" - "github.com/containers/libpod/cmd/podmanV2/registry" - "github.com/containers/libpod/pkg/domain/entities" - "github.com/spf13/cobra" -) - -// Inspect is one of the out layer commands in that it operates on images/containers/... - -var ( - inspectOpts *entities.InspectOptions - - // Command: podman _inspect_ Object_ID - inspectCmd = &cobra.Command{ - Use: "inspect [flags] {CONTAINER_ID | IMAGE_ID}", - Args: cobra.ExactArgs(1), - Short: "Display the configuration of object denoted by ID", - Long: "Displays the low-level information on an object identified by name or ID", - TraverseChildren: true, - RunE: inspect, - } -) - -func init() { - registry.Commands = append(registry.Commands, registry.CliCommand{ - Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode}, - Command: inspectCmd, - }) - inspectOpts = common.AddInspectFlagSet(inspectCmd) -} - -func inspect(cmd *cobra.Command, args []string) error { - ie, err := registry.NewImageEngine(cmd, args) - if err != nil { - return err - } - - if found, err := ie.Exists(context.Background(), args[0]); err != nil { - return err - } else if found.Value { - return images.Inspect(cmd, args, inspectOpts) - } - - ce, err := registry.NewContainerEngine(cmd, args) - if err != nil { - return err - } - - if found, err := ce.ContainerExists(context.Background(), args[0]); err != nil { - return err - } else if found.Value { - return containers.Inspect(cmd, args, inspectOpts) - } - return fmt.Errorf("%s not found on system", args[0]) -} diff --git a/cmd/podmanV2/main.go b/cmd/podmanV2/main.go deleted file mode 100644 index 6781a7f06..000000000 --- a/cmd/podmanV2/main.go +++ /dev/null @@ -1,86 +0,0 @@ -package main - -import ( - "os" - "reflect" - "runtime" - "strings" - - _ "github.com/containers/libpod/cmd/podmanV2/containers" - _ "github.com/containers/libpod/cmd/podmanV2/healthcheck" - _ "github.com/containers/libpod/cmd/podmanV2/images" - _ "github.com/containers/libpod/cmd/podmanV2/networks" - _ "github.com/containers/libpod/cmd/podmanV2/pods" - "github.com/containers/libpod/cmd/podmanV2/registry" - _ "github.com/containers/libpod/cmd/podmanV2/volumes" - "github.com/containers/libpod/libpod" - "github.com/containers/libpod/pkg/domain/entities" - "github.com/containers/storage/pkg/reexec" - "github.com/sirupsen/logrus" -) - -func init() { - if err := libpod.SetXdgDirs(); err != nil { - logrus.Errorf(err.Error()) - os.Exit(1) - } - - switch runtime.GOOS { - case "darwin": - fallthrough - case "windows": - registry.EngineOptions.EngineMode = entities.TunnelMode - case "linux": - registry.EngineOptions.EngineMode = entities.ABIMode - default: - logrus.Errorf("%s is not a supported OS", runtime.GOOS) - os.Exit(1) - } - - // TODO: Is there a Cobra way to "peek" at os.Args? - for _, v := range os.Args { - if strings.HasPrefix(v, "--remote") { - registry.EngineOptions.EngineMode = entities.TunnelMode - } - } -} - -func main() { - if reexec.Init() { - // We were invoked with a different argv[0] indicating that we - // had a specific job to do as a subprocess, and it's done. - return - } - for _, c := range registry.Commands { - if Contains(registry.EngineOptions.EngineMode, c.Mode) { - parent := rootCmd - if c.Parent != nil { - parent = c.Parent - } - parent.AddCommand(c.Command) - } - } - - Execute() - os.Exit(0) -} - -func Contains(item interface{}, slice interface{}) bool { - s := reflect.ValueOf(slice) - - switch s.Kind() { - case reflect.Array: - fallthrough - case reflect.Slice: - break - default: - return false - } - - for i := 0; i < s.Len(); i++ { - if s.Index(i).Interface() == item { - return true - } - } - return false -} diff --git a/cmd/podmanV2/networks/network.go b/cmd/podmanV2/networks/network.go deleted file mode 100644 index fc92d2321..000000000 --- a/cmd/podmanV2/networks/network.go +++ /dev/null @@ -1,33 +0,0 @@ -package images - -import ( - "github.com/containers/libpod/cmd/podmanV2/registry" - "github.com/containers/libpod/pkg/domain/entities" - "github.com/spf13/cobra" -) - -var ( - // Command: podman _network_ - cmd = &cobra.Command{ - Use: "network", - Short: "Manage networks", - Long: "Manage networks", - TraverseChildren: true, - PersistentPreRunE: preRunE, - RunE: registry.SubCommandExists, - } -) - -func init() { - registry.Commands = append(registry.Commands, registry.CliCommand{ - Mode: []entities.EngineMode{entities.ABIMode}, - Command: cmd, - }) - cmd.SetHelpTemplate(registry.HelpTemplate()) - cmd.SetUsageTemplate(registry.UsageTemplate()) -} - -func preRunE(cmd *cobra.Command, args []string) error { - _, err := registry.NewContainerEngine(cmd, args) - return err -} diff --git a/cmd/podmanV2/parse/parse.go b/cmd/podmanV2/parse/parse.go deleted file mode 100644 index 10d2146fa..000000000 --- a/cmd/podmanV2/parse/parse.go +++ /dev/null @@ -1,233 +0,0 @@ -//nolint -// most of these validate and parse functions have been taken from projectatomic/docker -// and modified for cri-o -package parse - -import ( - "bufio" - "fmt" - "net" - "net/url" - "os" - "regexp" - "strings" - - "github.com/pkg/errors" - "github.com/spf13/cobra" -) - -const ( - Protocol_TCP Protocol = 0 - Protocol_UDP Protocol = 1 -) - -type Protocol int32 - -// PortMapping specifies the port mapping configurations of a sandbox. -type PortMapping struct { - // Protocol of the port mapping. - Protocol Protocol `protobuf:"varint,1,opt,name=protocol,proto3,enum=runtime.Protocol" json:"protocol,omitempty"` - // Port number within the container. Default: 0 (not specified). - ContainerPort int32 `protobuf:"varint,2,opt,name=container_port,json=containerPort,proto3" json:"container_port,omitempty"` - // Port number on the host. Default: 0 (not specified). - HostPort int32 `protobuf:"varint,3,opt,name=host_port,json=hostPort,proto3" json:"host_port,omitempty"` - // Host IP. - HostIp string `protobuf:"bytes,4,opt,name=host_ip,json=hostIp,proto3" json:"host_ip,omitempty"` -} - -// Note: for flags that are in the form <number><unit>, use the RAMInBytes function -// from the units package in docker/go-units/size.go - -var ( - whiteSpaces = " \t" - alphaRegexp = regexp.MustCompile(`[a-zA-Z]`) - domainRegexp = regexp.MustCompile(`^(:?(:?[a-zA-Z0-9]|(:?[a-zA-Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9]))(:?\.(:?[a-zA-Z0-9]|(:?[a-zA-Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9])))*)\.?\s*$`) -) - -// validateExtraHost validates that the specified string is a valid extrahost and returns it. -// ExtraHost is in the form of name:ip where the ip has to be a valid ip (ipv4 or ipv6). -// for add-host flag -func ValidateExtraHost(val string) (string, error) { //nolint - // allow for IPv6 addresses in extra hosts by only splitting on first ":" - arr := strings.SplitN(val, ":", 2) - if len(arr) != 2 || len(arr[0]) == 0 { - return "", fmt.Errorf("bad format for add-host: %q", val) - } - if _, err := validateIPAddress(arr[1]); err != nil { - return "", fmt.Errorf("invalid IP address in add-host: %q", arr[1]) - } - return val, nil -} - -// validateIPAddress validates an Ip address. -// for dns, ip, and ip6 flags also -func validateIPAddress(val string) (string, error) { - var ip = net.ParseIP(strings.TrimSpace(val)) - if ip != nil { - return ip.String(), nil - } - return "", fmt.Errorf("%s is not an ip address", val) -} - -func ValidateDomain(val string) (string, error) { - if alphaRegexp.FindString(val) == "" { - return "", fmt.Errorf("%s is not a valid domain", val) - } - ns := domainRegexp.FindSubmatch([]byte(val)) - if len(ns) > 0 && len(ns[1]) < 255 { - return string(ns[1]), nil - } - return "", fmt.Errorf("%s is not a valid domain", val) -} - -// GetAllLabels retrieves all labels given a potential label file and a number -// of labels provided from the command line. -func GetAllLabels(labelFile, inputLabels []string) (map[string]string, error) { - labels := make(map[string]string) - for _, file := range labelFile { - // Use of parseEnvFile still seems safe, as it's missing the - // extra parsing logic of parseEnv. - // There's an argument that we SHOULD be doing that parsing for - // all environment variables, even those sourced from files, but - // that would require a substantial rework. - if err := parseEnvFile(labels, file); err != nil { - // FIXME: parseEnvFile is using parseEnv, so we need to add extra - // logic for labels. - return nil, err - } - } - for _, label := range inputLabels { - split := strings.SplitN(label, "=", 2) - if split[0] == "" { - return nil, errors.Errorf("invalid label format: %q", label) - } - value := "" - if len(split) > 1 { - value = split[1] - } - labels[split[0]] = value - } - return labels, nil -} - -func parseEnv(env map[string]string, line string) error { - data := strings.SplitN(line, "=", 2) - - // catch invalid variables such as "=" or "=A" - if data[0] == "" { - return errors.Errorf("invalid environment variable: %q", line) - } - - // trim the front of a variable, but nothing else - name := strings.TrimLeft(data[0], whiteSpaces) - if strings.ContainsAny(name, whiteSpaces) { - return errors.Errorf("name %q has white spaces, poorly formatted name", name) - } - - if len(data) > 1 { - env[name] = data[1] - } else { - if strings.HasSuffix(name, "*") { - name = strings.TrimSuffix(name, "*") - for _, e := range os.Environ() { - part := strings.SplitN(e, "=", 2) - if len(part) < 2 { - continue - } - if strings.HasPrefix(part[0], name) { - env[part[0]] = part[1] - } - } - } else { - // if only a pass-through variable is given, clean it up. - if val, ok := os.LookupEnv(name); ok { - env[name] = val - } - } - } - return nil -} - -// parseEnvFile reads a file with environment variables enumerated by lines -func parseEnvFile(env map[string]string, filename string) error { - fh, err := os.Open(filename) - if err != nil { - return err - } - defer fh.Close() - - scanner := bufio.NewScanner(fh) - for scanner.Scan() { - // trim the line from all leading whitespace first - line := strings.TrimLeft(scanner.Text(), whiteSpaces) - // line is not empty, and not starting with '#' - if len(line) > 0 && !strings.HasPrefix(line, "#") { - if err := parseEnv(env, line); err != nil { - return err - } - } - } - return scanner.Err() -} - -// ValidateFileName returns an error if filename contains ":" -// as it is currently not supported -func ValidateFileName(filename string) error { - if strings.Contains(filename, ":") { - return errors.Errorf("invalid filename (should not contain ':') %q", filename) - } - return nil -} - -// ValidURL checks a string urlStr is a url or not -func ValidURL(urlStr string) error { - _, err := url.ParseRequestURI(urlStr) - if err != nil { - return errors.Wrapf(err, "invalid url path: %q", urlStr) - } - return nil -} - -// checkAllLatestAndCIDFile checks that --all and --latest are used correctly. -// If cidfile is set, also check for the --cidfile flag. -func CheckAllLatestAndCIDFile(c *cobra.Command, args []string, ignoreArgLen bool, cidfile bool) error { - argLen := len(args) - if c.Flags().Lookup("all") == nil || c.Flags().Lookup("latest") == nil { - if !cidfile { - return errors.New("unable to lookup values for 'latest' or 'all'") - } else if c.Flags().Lookup("cidfile") == nil { - return errors.New("unable to lookup values for 'latest', 'all' or 'cidfile'") - } - } - - specifiedAll, _ := c.Flags().GetBool("all") - specifiedLatest, _ := c.Flags().GetBool("latest") - specifiedCIDFile := false - if cid, _ := c.Flags().GetStringArray("cidfile"); len(cid) > 0 { - specifiedCIDFile = true - } - - if specifiedCIDFile && (specifiedAll || specifiedLatest) { - return errors.Errorf("--all, --latest and --cidfile cannot be used together") - } else if specifiedAll && specifiedLatest { - return errors.Errorf("--all and --latest cannot be used together") - } - - if ignoreArgLen { - return nil - } - if (argLen > 0) && (specifiedAll || specifiedLatest) { - return errors.Errorf("no arguments are needed with --all or --latest") - } else if cidfile && (argLen > 0) && (specifiedAll || specifiedLatest || specifiedCIDFile) { - return errors.Errorf("no arguments are needed with --all, --latest or --cidfile") - } - - if specifiedCIDFile { - return nil - } - - if argLen < 1 && !specifiedAll && !specifiedLatest && !specifiedCIDFile { - return errors.Errorf("you must provide at least one name or id") - } - return nil -} diff --git a/cmd/podmanV2/parse/parse_test.go b/cmd/podmanV2/parse/parse_test.go deleted file mode 100644 index a6ddc2be9..000000000 --- a/cmd/podmanV2/parse/parse_test.go +++ /dev/null @@ -1,152 +0,0 @@ -//nolint -// most of these validate and parse functions have been taken from projectatomic/docker -// and modified for cri-o -package parse - -import ( - "io/ioutil" - "os" - "testing" - - "github.com/stretchr/testify/assert" -) - -var ( - Var1 = []string{"ONE=1", "TWO=2"} -) - -func createTmpFile(content []byte) (string, error) { - tmpfile, err := ioutil.TempFile(os.TempDir(), "unittest") - if err != nil { - return "", err - } - - if _, err := tmpfile.Write(content); err != nil { - return "", err - - } - if err := tmpfile.Close(); err != nil { - return "", err - } - return tmpfile.Name(), nil -} - -func TestValidateExtraHost(t *testing.T) { - type args struct { - val string - } - tests := []struct { - name string - args args - want string - wantErr bool - }{ - //2001:0db8:85a3:0000:0000:8a2e:0370:7334 - {name: "good-ipv4", args: args{val: "foobar:192.168.1.1"}, want: "foobar:192.168.1.1", wantErr: false}, - {name: "bad-ipv4", args: args{val: "foobar:999.999.999.99"}, want: "", wantErr: true}, - {name: "bad-ipv4", args: args{val: "foobar:999.999.999"}, want: "", wantErr: true}, - {name: "noname-ipv4", args: args{val: "192.168.1.1"}, want: "", wantErr: true}, - {name: "noname-ipv4", args: args{val: ":192.168.1.1"}, want: "", wantErr: true}, - {name: "noip", args: args{val: "foobar:"}, want: "", wantErr: true}, - {name: "noip", args: args{val: "foobar"}, want: "", wantErr: true}, - {name: "good-ipv6", args: args{val: "foobar:2001:0db8:85a3:0000:0000:8a2e:0370:7334"}, want: "foobar:2001:0db8:85a3:0000:0000:8a2e:0370:7334", wantErr: false}, - {name: "bad-ipv6", args: args{val: "foobar:0db8:85a3:0000:0000:8a2e:0370:7334"}, want: "", wantErr: true}, - {name: "bad-ipv6", args: args{val: "foobar:0db8:85a3:0000:0000:8a2e:0370:7334.0000.0000.000"}, want: "", wantErr: true}, - {name: "noname-ipv6", args: args{val: "2001:0db8:85a3:0000:0000:8a2e:0370:7334"}, want: "", wantErr: true}, - {name: "noname-ipv6", args: args{val: ":2001:0db8:85a3:0000:0000:8a2e:0370:7334"}, want: "", wantErr: true}, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - got, err := ValidateExtraHost(tt.args.val) - if (err != nil) != tt.wantErr { - t.Errorf("ValidateExtraHost() error = %v, wantErr %v", err, tt.wantErr) - return - } - if got != tt.want { - t.Errorf("ValidateExtraHost() = %v, want %v", got, tt.want) - } - }) - } -} - -func Test_validateIPAddress(t *testing.T) { - type args struct { - val string - } - tests := []struct { - name string - args args - want string - wantErr bool - }{ - {name: "ipv4-good", args: args{val: "192.168.1.1"}, want: "192.168.1.1", wantErr: false}, - {name: "ipv4-bad", args: args{val: "192.168.1.1.1"}, want: "", wantErr: true}, - {name: "ipv4-bad", args: args{val: "192."}, want: "", wantErr: true}, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - got, err := validateIPAddress(tt.args.val) - if (err != nil) != tt.wantErr { - t.Errorf("validateIPAddress() error = %v, wantErr %v", err, tt.wantErr) - return - } - if got != tt.want { - t.Errorf("validateIPAddress() = %v, want %v", got, tt.want) - } - }) - } -} - -func TestValidateFileName(t *testing.T) { - type args struct { - filename string - } - tests := []struct { - name string - args args - wantErr bool - }{ - {name: "good", args: args{filename: "/some/rand/path"}, wantErr: false}, - {name: "good", args: args{filename: "some/rand/path"}, wantErr: false}, - {name: "good", args: args{filename: "/"}, wantErr: false}, - {name: "bad", args: args{filename: "/:"}, wantErr: true}, - {name: "bad", args: args{filename: ":/"}, wantErr: true}, - {name: "bad", args: args{filename: "/some/rand:/path"}, wantErr: true}, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - if err := ValidateFileName(tt.args.filename); (err != nil) != tt.wantErr { - t.Errorf("ValidateFileName() error = %v, wantErr %v", err, tt.wantErr) - } - }) - } -} - -func TestGetAllLabels(t *testing.T) { - fileLabels := []string{} - labels, _ := GetAllLabels(fileLabels, Var1) - assert.Equal(t, len(labels), 2) -} - -func TestGetAllLabelsBadKeyValue(t *testing.T) { - inLabels := []string{"=badValue", "="} - fileLabels := []string{} - _, err := GetAllLabels(fileLabels, inLabels) - assert.Error(t, err, assert.AnError) -} - -func TestGetAllLabelsBadLabelFile(t *testing.T) { - fileLabels := []string{"/foobar5001/be"} - _, err := GetAllLabels(fileLabels, Var1) - assert.Error(t, err, assert.AnError) -} - -func TestGetAllLabelsFile(t *testing.T) { - content := []byte("THREE=3") - tFile, err := createTmpFile(content) - defer os.Remove(tFile) - assert.NoError(t, err) - fileLabels := []string{tFile} - result, _ := GetAllLabels(fileLabels, Var1) - assert.Equal(t, len(result), 3) -} diff --git a/cmd/podmanV2/pods/create.go b/cmd/podmanV2/pods/create.go deleted file mode 100644 index ab8957ee3..000000000 --- a/cmd/podmanV2/pods/create.go +++ /dev/null @@ -1,132 +0,0 @@ -package pods - -import ( - "context" - "fmt" - "os" - "strings" - - "github.com/containers/libpod/cmd/podmanV2/common" - "github.com/containers/libpod/cmd/podmanV2/parse" - "github.com/containers/libpod/cmd/podmanV2/registry" - "github.com/containers/libpod/libpod/define" - "github.com/containers/libpod/pkg/domain/entities" - "github.com/containers/libpod/pkg/errorhandling" - "github.com/containers/libpod/pkg/specgen" - "github.com/containers/libpod/pkg/util" - "github.com/pkg/errors" - "github.com/spf13/cobra" -) - -var ( - podCreateDescription = `After creating the pod, the pod ID is printed to stdout. - - You can then start it at any time with the podman pod start <pod_id> command. The pod will be created with the initial state 'created'.` - - createCommand = &cobra.Command{ - Use: "create", - Args: cobra.NoArgs, - Short: "Create a new empty pod", - Long: podCreateDescription, - RunE: create, - } -) - -var ( - createOptions entities.PodCreateOptions - labels, labelFile []string - podIDFile string - share string -) - -func init() { - registry.Commands = append(registry.Commands, registry.CliCommand{ - Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode}, - Command: createCommand, - Parent: podCmd, - }) - flags := createCommand.Flags() - flags.SetInterspersed(false) - flags.AddFlagSet(common.GetNetFlags()) - flags.StringVar(&createOptions.CGroupParent, "cgroup-parent", "", "Set parent cgroup for the pod") - flags.BoolVar(&createOptions.Infra, "infra", true, "Create an infra container associated with the pod to share namespaces with") - flags.StringVar(&createOptions.InfraImage, "infra-image", define.DefaultInfraImage, "The image of the infra container to associate with the pod") - flags.StringVar(&createOptions.InfraCommand, "infra-command", define.DefaultInfraCommand, "The command to run on the infra container when the pod is started") - flags.StringSliceVar(&labelFile, "label-file", []string{}, "Read in a line delimited file of labels") - flags.StringSliceVarP(&labels, "label", "l", []string{}, "Set metadata on pod (default [])") - flags.StringVarP(&createOptions.Name, "name", "n", "", "Assign a name to the pod") - flags.StringVarP(&createOptions.Hostname, "hostname", "", "", "Set a hostname to the pod") - flags.StringVar(&podIDFile, "pod-id-file", "", "Write the pod ID to the file") - flags.StringVar(&share, "share", common.DefaultKernelNamespaces, "A comma delimited list of kernel namespaces the pod will share") -} - -func create(cmd *cobra.Command, args []string) error { - var ( - err error - podIdFile *os.File - ) - createOptions.Labels, err = parse.GetAllLabels(labelFile, labels) - if err != nil { - return errors.Wrapf(err, "unable to process labels") - } - - if !createOptions.Infra && cmd.Flag("share").Changed && share != "none" && share != "" { - return errors.Errorf("You cannot share kernel namespaces on the pod level without an infra container") - } - createOptions.Share = strings.Split(share, ",") - if cmd.Flag("pod-id-file").Changed { - podIdFile, err = util.OpenExclusiveFile(podIDFile) - if err != nil && os.IsExist(err) { - return errors.Errorf("pod id file exists. Ensure another pod is not using it or delete %s", podIDFile) - } - if err != nil { - return errors.Errorf("error opening pod-id-file %s", podIDFile) - } - defer errorhandling.CloseQuiet(podIdFile) - defer errorhandling.SyncQuiet(podIdFile) - } - - createOptions.Net, err = common.NetFlagsToNetOptions(cmd) - if err != nil { - return err - } - netInput, err := cmd.Flags().GetString("network") - if err != nil { - return err - } - n := specgen.Namespace{} - switch netInput { - case "bridge": - n.NSMode = specgen.Bridge - case "host": - n.NSMode = specgen.Host - case "slip4netns": - n.NSMode = specgen.Slirp - default: - if strings.HasPrefix(netInput, "container:") { //nolint - split := strings.Split(netInput, ":") - if len(split) != 2 { - return errors.Errorf("invalid network paramater: %q", netInput) - } - n.NSMode = specgen.FromContainer - n.Value = split[1] - } else if strings.HasPrefix(netInput, "ns:") { - return errors.New("the ns: network option is not supported for pods") - } else { - n.NSMode = specgen.Bridge - createOptions.Net.CNINetworks = strings.Split(netInput, ",") - } - } - if len(createOptions.Net.PublishPorts) > 0 { - if !createOptions.Infra { - return errors.Errorf("you must have an infra container to publish port bindings to the host") - } - } - - response, err := registry.ContainerEngine().PodCreate(context.Background(), createOptions) - if err != nil { - return err - } - fmt.Println(response.Id) - return nil -} diff --git a/cmd/podmanV2/pods/exists.go b/cmd/podmanV2/pods/exists.go deleted file mode 100644 index e37f2ebd7..000000000 --- a/cmd/podmanV2/pods/exists.go +++ /dev/null @@ -1,43 +0,0 @@ -package pods - -import ( - "context" - "os" - - "github.com/containers/libpod/cmd/podmanV2/registry" - "github.com/containers/libpod/pkg/domain/entities" - "github.com/spf13/cobra" -) - -var ( - podExistsDescription = `If the named pod exists in local storage, podman pod exists exits with 0, otherwise the exit code will be 1.` - - existsCommand = &cobra.Command{ - Use: "exists POD", - Short: "Check if a pod exists in local storage", - Long: podExistsDescription, - RunE: exists, - Args: cobra.ExactArgs(1), - Example: `podman pod exists podID - podman pod exists mypod || podman pod create --name mypod`, - } -) - -func init() { - registry.Commands = append(registry.Commands, registry.CliCommand{ - Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode}, - Command: existsCommand, - Parent: podCmd, - }) -} - -func exists(cmd *cobra.Command, args []string) error { - response, err := registry.ContainerEngine().PodExists(context.Background(), args[0]) - if err != nil { - return err - } - if !response.Value { - os.Exit(1) - } - return nil -} diff --git a/cmd/podmanV2/pods/kill.go b/cmd/podmanV2/pods/kill.go deleted file mode 100644 index 06cca916c..000000000 --- a/cmd/podmanV2/pods/kill.go +++ /dev/null @@ -1,68 +0,0 @@ -package pods - -import ( - "context" - "fmt" - - "github.com/containers/libpod/cmd/podmanV2/parse" - "github.com/containers/libpod/cmd/podmanV2/registry" - "github.com/containers/libpod/cmd/podmanV2/utils" - "github.com/containers/libpod/pkg/domain/entities" - "github.com/spf13/cobra" -) - -var ( - podKillDescription = `Signals are sent to the main process of each container inside the specified pod. - - The default signal is SIGKILL, or any signal specified with option --signal.` - killCommand = &cobra.Command{ - Use: "kill [flags] POD [POD...]", - Short: "Send the specified signal or SIGKILL to containers in pod", - Long: podKillDescription, - RunE: kill, - Args: func(cmd *cobra.Command, args []string) error { - return parse.CheckAllLatestAndCIDFile(cmd, args, false, false) - }, - Example: `podman pod kill podID - podman pod kill --signal TERM mywebserver - podman pod kill --latest`, - } -) - -var ( - killOpts entities.PodKillOptions -) - -func init() { - registry.Commands = append(registry.Commands, registry.CliCommand{ - Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode}, - Command: killCommand, - Parent: podCmd, - }) - flags := killCommand.Flags() - flags.BoolVarP(&killOpts.All, "all", "a", false, "Kill all containers in all pods") - flags.BoolVarP(&killOpts.Latest, "latest", "l", false, "Act on the latest pod podman is aware of") - flags.StringVarP(&killOpts.Signal, "signal", "s", "KILL", "Signal to send to the containers in the pod") - if registry.IsRemote() { - _ = flags.MarkHidden("latest") - } - -} -func kill(cmd *cobra.Command, args []string) error { - var ( - errs utils.OutputErrors - ) - responses, err := registry.ContainerEngine().PodKill(context.Background(), args, killOpts) - if err != nil { - return err - } - // in the cli, first we print out all the successful attempts - for _, r := range responses { - if len(r.Errs) == 0 { - fmt.Println(r.Id) - } else { - errs = append(errs, r.Errs...) - } - } - return errs.PrintErrors() -} diff --git a/cmd/podmanV2/pods/pause.go b/cmd/podmanV2/pods/pause.go deleted file mode 100644 index dc86e534d..000000000 --- a/cmd/podmanV2/pods/pause.go +++ /dev/null @@ -1,66 +0,0 @@ -package pods - -import ( - "context" - "fmt" - - "github.com/containers/libpod/cmd/podmanV2/parse" - "github.com/containers/libpod/cmd/podmanV2/registry" - "github.com/containers/libpod/cmd/podmanV2/utils" - "github.com/containers/libpod/pkg/domain/entities" - "github.com/spf13/cobra" -) - -var ( - podPauseDescription = `The pod name or ID can be used. - - All running containers within each specified pod will then be paused.` - pauseCommand = &cobra.Command{ - Use: "pause [flags] POD [POD...]", - Short: "Pause one or more pods", - Long: podPauseDescription, - RunE: pause, - Args: func(cmd *cobra.Command, args []string) error { - return parse.CheckAllLatestAndCIDFile(cmd, args, false, false) - }, - Example: `podman pod pause podID1 podID2 - podman pod pause --latest - podman pod pause --all`, - } -) - -var ( - pauseOptions entities.PodPauseOptions -) - -func init() { - registry.Commands = append(registry.Commands, registry.CliCommand{ - Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode}, - Command: pauseCommand, - Parent: podCmd, - }) - flags := pauseCommand.Flags() - flags.BoolVarP(&pauseOptions.All, "all", "a", false, "Pause all running pods") - flags.BoolVarP(&pauseOptions.Latest, "latest", "l", false, "Act on the latest pod podman is aware of") - if registry.IsRemote() { - _ = flags.MarkHidden("latest") - } -} -func pause(cmd *cobra.Command, args []string) error { - var ( - errs utils.OutputErrors - ) - responses, err := registry.ContainerEngine().PodPause(context.Background(), args, pauseOptions) - if err != nil { - return err - } - // in the cli, first we print out all the successful attempts - for _, r := range responses { - if len(r.Errs) == 0 { - fmt.Println(r.Id) - } else { - errs = append(errs, r.Errs...) - } - } - return errs.PrintErrors() -} diff --git a/cmd/podmanV2/pods/pod.go b/cmd/podmanV2/pods/pod.go deleted file mode 100644 index 3766893bb..000000000 --- a/cmd/podmanV2/pods/pod.go +++ /dev/null @@ -1,63 +0,0 @@ -package pods - -import ( - "strings" - "text/template" - - "github.com/containers/libpod/cmd/podmanV2/registry" - "github.com/containers/libpod/pkg/domain/entities" - "github.com/spf13/cobra" -) - -var ( - // Command: podman _pod_ - podCmd = &cobra.Command{ - Use: "pod", - Short: "Manage pods", - Long: "Manage pods", - TraverseChildren: true, - PersistentPreRunE: preRunE, - RunE: registry.SubCommandExists, - } -) - -var podFuncMap = template.FuncMap{ - "numCons": func(cons []*entities.ListPodContainer) int { - return len(cons) - }, - "podcids": func(cons []*entities.ListPodContainer) string { - var ctrids []string - for _, c := range cons { - ctrids = append(ctrids, c.Id[:12]) - } - return strings.Join(ctrids, ",") - }, - "podconnames": func(cons []*entities.ListPodContainer) string { - var ctrNames []string - for _, c := range cons { - ctrNames = append(ctrNames, c.Names[:12]) - } - return strings.Join(ctrNames, ",") - }, - "podconstatuses": func(cons []*entities.ListPodContainer) string { - var statuses []string - for _, c := range cons { - statuses = append(statuses, c.Status) - } - return strings.Join(statuses, ",") - }, -} - -func init() { - registry.Commands = append(registry.Commands, registry.CliCommand{ - Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode}, - Command: podCmd, - }) - podCmd.SetHelpTemplate(registry.HelpTemplate()) - podCmd.SetUsageTemplate(registry.UsageTemplate()) -} - -func preRunE(cmd *cobra.Command, args []string) error { - _, err := registry.NewContainerEngine(cmd, args) - return err -} diff --git a/cmd/podmanV2/pods/ps.go b/cmd/podmanV2/pods/ps.go deleted file mode 100644 index 9546dff9e..000000000 --- a/cmd/podmanV2/pods/ps.go +++ /dev/null @@ -1,166 +0,0 @@ -package pods - -import ( - "context" - "encoding/json" - "fmt" - "io" - "os" - "strings" - "text/tabwriter" - "text/template" - - "github.com/containers/libpod/cmd/podmanV2/registry" - "github.com/containers/libpod/cmd/podmanV2/report" - "github.com/containers/libpod/pkg/domain/entities" - "github.com/pkg/errors" - "github.com/spf13/cobra" -) - -var ( - psDescription = "List all pods on system including their names, ids and current state." - - // Command: podman pod _ps_ - psCmd = &cobra.Command{ - Use: "ps", - Aliases: []string{"ls", "list"}, - Short: "list pods", - Long: psDescription, - RunE: pods, - } -) - -var ( - defaultHeaders string = "POD ID\tNAME\tSTATUS\tCREATED" - inputFilters string - noTrunc bool - psInput entities.PodPSOptions -) - -func init() { - registry.Commands = append(registry.Commands, registry.CliCommand{ - Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode}, - Command: psCmd, - Parent: podCmd, - }) - flags := psCmd.Flags() - flags.BoolVar(&psInput.CtrNames, "ctr-names", false, "Display the container names") - flags.BoolVar(&psInput.CtrIds, "ctr-ids", false, "Display the container UUIDs. If no-trunc is not set they will be truncated") - flags.BoolVar(&psInput.CtrStatus, "ctr-status", false, "Display the container status") - // TODO should we make this a [] ? - flags.StringVarP(&inputFilters, "filter", "f", "", "Filter output based on conditions given") - flags.StringVar(&psInput.Format, "format", "", "Pretty-print pods to JSON or using a Go template") - flags.BoolVarP(&psInput.Latest, "latest", "l", false, "Act on the latest pod podman is aware of") - flags.BoolVar(&psInput.Namespace, "namespace", false, "Display namespace information of the pod") - flags.BoolVar(&psInput.Namespace, "ns", false, "Display namespace information of the pod") - flags.BoolVar(&noTrunc, "no-trunc", false, "Do not truncate pod and container IDs") - flags.BoolVarP(&psInput.Quiet, "quiet", "q", false, "Print the numeric IDs of the pods only") - flags.StringVar(&psInput.Sort, "sort", "created", "Sort output by created, id, name, or number") - if registry.IsRemote() { - _ = flags.MarkHidden("latest") - } -} - -func pods(cmd *cobra.Command, args []string) error { - var ( - w io.Writer = os.Stdout - row string - ) - if cmd.Flag("filter").Changed { - for _, f := range strings.Split(inputFilters, ",") { - split := strings.Split(f, "=") - if len(split) < 2 { - return errors.Errorf("filter input must be in the form of filter=value: %s is invalid", f) - } - psInput.Filters[split[0]] = append(psInput.Filters[split[0]], split[1]) - } - } - responses, err := registry.ContainerEngine().PodPs(context.Background(), psInput) - if err != nil { - return err - } - - if psInput.Format == "json" { - b, err := json.MarshalIndent(responses, "", " ") - if err != nil { - return err - } - fmt.Println(string(b)) - return nil - } - headers, row := createPodPsOut(cmd) - if psInput.Quiet { - if noTrunc { - row = "{{.Id}}\n" - } else { - row = "{{slice .Id 0 12}}\n" - } - } - if cmd.Flag("format").Changed { - row = psInput.Format - if !strings.HasPrefix(row, "\n") { - row += "\n" - } - } - format := "{{range . }}" + row + "{{end}}" - if !psInput.Quiet && !cmd.Flag("format").Changed { - format = headers + format - } - funcs := report.AppendFuncMap(podFuncMap) - tmpl, err := template.New("listPods").Funcs(funcs).Parse(format) - if err != nil { - return err - } - if !psInput.Quiet { - w = tabwriter.NewWriter(os.Stdout, 8, 2, 2, ' ', 0) - } - if err := tmpl.Execute(w, responses); err != nil { - return err - } - if flusher, ok := w.(interface{ Flush() error }); ok { - return flusher.Flush() - } - return nil -} - -func createPodPsOut(cmd *cobra.Command) (string, string) { - var row string - headers := defaultHeaders - if noTrunc { - row += "{{.Id}}" - } else { - row += "{{slice .Id 0 12}}" - } - - row += "\t{{.Name}}\t{{.Status}}\t{{humanDurationFromTime .Created}}" - - //rowFormat string = "{{slice .Id 0 12}}\t{{.Name}}\t{{.Status}}\t{{humanDurationFromTime .Created}}" - if psInput.CtrIds { - headers += "\tIDS" - row += "\t{{podcids .Containers}}" - } - if psInput.CtrNames { - headers += "\tNAMES" - row += "\t{{podconnames .Containers}}" - } - if psInput.CtrStatus { - headers += "\tSTATUS" - row += "\t{{podconstatuses .Containers}}" - } - if psInput.Namespace { - headers += "\tCGROUP\tNAMESPACES" - row += "\t{{.Cgroup}}\t{{.Namespace}}" - } - if !psInput.CtrStatus && !psInput.CtrNames && !psInput.CtrIds { - headers += "\t# OF CONTAINERS" - row += "\t{{numCons .Containers}}" - - } - headers += "\tINFRA ID\n" - if noTrunc { - row += "\t{{.InfraId}}\n" - } else { - row += "\t{{slice .InfraId 0 12}}\n" - } - return headers, row -} diff --git a/cmd/podmanV2/pods/restart.go b/cmd/podmanV2/pods/restart.go deleted file mode 100644 index 1c8709704..000000000 --- a/cmd/podmanV2/pods/restart.go +++ /dev/null @@ -1,68 +0,0 @@ -package pods - -import ( - "context" - "fmt" - - "github.com/containers/libpod/cmd/podmanV2/parse" - "github.com/containers/libpod/cmd/podmanV2/registry" - "github.com/containers/libpod/cmd/podmanV2/utils" - "github.com/containers/libpod/pkg/domain/entities" - "github.com/spf13/cobra" -) - -var ( - podRestartDescription = `The pod ID or name can be used. - - All of the containers within each of the specified pods will be restarted. If a container in a pod is not currently running it will be started.` - restartCommand = &cobra.Command{ - Use: "restart [flags] POD [POD...]", - Short: "Restart one or more pods", - Long: podRestartDescription, - RunE: restart, - Args: func(cmd *cobra.Command, args []string) error { - return parse.CheckAllLatestAndCIDFile(cmd, args, false, false) - }, - Example: `podman pod restart podID1 podID2 - podman pod restart --latest - podman pod restart --all`, - } -) - -var ( - restartOptions = entities.PodRestartOptions{} -) - -func init() { - registry.Commands = append(registry.Commands, registry.CliCommand{ - Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode}, - Command: restartCommand, - Parent: podCmd, - }) - - flags := restartCommand.Flags() - flags.BoolVarP(&restartOptions.All, "all", "a", false, "Restart all running pods") - flags.BoolVarP(&restartOptions.Latest, "latest", "l", false, "Restart the latest pod podman is aware of") - if registry.IsRemote() { - _ = flags.MarkHidden("latest") - } -} - -func restart(cmd *cobra.Command, args []string) error { - var ( - errs utils.OutputErrors - ) - responses, err := registry.ContainerEngine().PodRestart(context.Background(), args, restartOptions) - if err != nil { - return err - } - // in the cli, first we print out all the successful attempts - for _, r := range responses { - if len(r.Errs) == 0 { - fmt.Println(r.Id) - } else { - errs = append(errs, r.Errs...) - } - } - return errs.PrintErrors() -} diff --git a/cmd/podmanV2/pods/rm.go b/cmd/podmanV2/pods/rm.go deleted file mode 100644 index b43dd2d6c..000000000 --- a/cmd/podmanV2/pods/rm.go +++ /dev/null @@ -1,71 +0,0 @@ -package pods - -import ( - "context" - "fmt" - - "github.com/containers/libpod/cmd/podmanV2/parse" - "github.com/containers/libpod/cmd/podmanV2/registry" - "github.com/containers/libpod/cmd/podmanV2/utils" - "github.com/containers/libpod/pkg/domain/entities" - "github.com/spf13/cobra" -) - -var ( - podRmDescription = fmt.Sprintf(`podman rm will remove one or more stopped pods and their containers from the host. - - The pod name or ID can be used. A pod with containers will not be removed without --force. If --force is specified, all containers will be stopped, then removed.`) - rmCommand = &cobra.Command{ - Use: "rm [flags] POD [POD...]", - Short: "Remove one or more pods", - Long: podRmDescription, - RunE: rm, - Args: func(cmd *cobra.Command, args []string) error { - return parse.CheckAllLatestAndCIDFile(cmd, args, false, false) - }, - Example: `podman pod rm mywebserverpod - podman pod rm -f 860a4b23 - podman pod rm -f -a`, - } -) - -var ( - rmOptions = entities.PodRmOptions{} -) - -func init() { - registry.Commands = append(registry.Commands, registry.CliCommand{ - Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode}, - Command: rmCommand, - Parent: podCmd, - }) - - flags := rmCommand.Flags() - flags.BoolVarP(&rmOptions.All, "all", "a", false, "Restart all running pods") - flags.BoolVarP(&rmOptions.Force, "force", "f", false, "Force removal of a running pod by first stopping all containers, then removing all containers in the pod. The default is false") - flags.BoolVarP(&rmOptions.Ignore, "ignore", "i", false, "Ignore errors when a specified pod is missing") - flags.BoolVarP(&rmOptions.Latest, "latest", "l", false, "Restart the latest pod podman is aware of") - if registry.IsRemote() { - _ = flags.MarkHidden("latest") - _ = flags.MarkHidden("ignore") - } -} - -func rm(cmd *cobra.Command, args []string) error { - var ( - errs utils.OutputErrors - ) - responses, err := registry.ContainerEngine().PodRm(context.Background(), args, rmOptions) - if err != nil { - return err - } - // in the cli, first we print out all the successful attempts - for _, r := range responses { - if r.Err == nil { - fmt.Println(r.Id) - } else { - errs = append(errs, r.Err) - } - } - return errs.PrintErrors() -} diff --git a/cmd/podmanV2/pods/start.go b/cmd/podmanV2/pods/start.go deleted file mode 100644 index 11ac312f9..000000000 --- a/cmd/podmanV2/pods/start.go +++ /dev/null @@ -1,68 +0,0 @@ -package pods - -import ( - "context" - "fmt" - - "github.com/containers/libpod/cmd/podmanV2/parse" - "github.com/containers/libpod/cmd/podmanV2/registry" - "github.com/containers/libpod/cmd/podmanV2/utils" - "github.com/containers/libpod/pkg/domain/entities" - "github.com/spf13/cobra" -) - -var ( - podStartDescription = `The pod name or ID can be used. - - All containers defined in the pod will be started.` - startCommand = &cobra.Command{ - Use: "start [flags] POD [POD...]", - Short: "Start one or more pods", - Long: podStartDescription, - RunE: start, - Args: func(cmd *cobra.Command, args []string) error { - return parse.CheckAllLatestAndCIDFile(cmd, args, false, false) - }, - Example: `podman pod start podID - podman pod start --latest - podman pod start --all`, - } -) - -var ( - startOptions = entities.PodStartOptions{} -) - -func init() { - registry.Commands = append(registry.Commands, registry.CliCommand{ - Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode}, - Command: startCommand, - Parent: podCmd, - }) - - flags := startCommand.Flags() - flags.BoolVarP(&startOptions.All, "all", "a", false, "Restart all running pods") - flags.BoolVarP(&startOptions.Latest, "latest", "l", false, "Restart the latest pod podman is aware of") - if registry.IsRemote() { - _ = flags.MarkHidden("latest") - } -} - -func start(cmd *cobra.Command, args []string) error { - var ( - errs utils.OutputErrors - ) - responses, err := registry.ContainerEngine().PodStart(context.Background(), args, startOptions) - if err != nil { - return err - } - // in the cli, first we print out all the successful attempts - for _, r := range responses { - if len(r.Errs) == 0 { - fmt.Println(r.Id) - } else { - errs = append(errs, r.Errs...) - } - } - return errs.PrintErrors() -} diff --git a/cmd/podmanV2/pods/stop.go b/cmd/podmanV2/pods/stop.go deleted file mode 100644 index 403c7d95d..000000000 --- a/cmd/podmanV2/pods/stop.go +++ /dev/null @@ -1,79 +0,0 @@ -package pods - -import ( - "context" - "fmt" - - "github.com/containers/libpod/cmd/podmanV2/parse" - "github.com/containers/libpod/cmd/podmanV2/registry" - "github.com/containers/libpod/cmd/podmanV2/utils" - "github.com/containers/libpod/pkg/domain/entities" - "github.com/spf13/cobra" -) - -var ( - podStopDescription = `The pod name or ID can be used. - - This command will stop all running containers in each of the specified pods.` - - stopCommand = &cobra.Command{ - Use: "stop [flags] POD [POD...]", - Short: "Stop one or more pods", - Long: podStopDescription, - RunE: stop, - Args: func(cmd *cobra.Command, args []string) error { - return parse.CheckAllLatestAndCIDFile(cmd, args, false, false) - }, - Example: `podman pod stop mywebserverpod - podman pod stop --latest - podman pod stop --time 0 490eb 3557fb`, - } -) - -var ( - stopOptions = entities.PodStopOptions{ - Timeout: -1, - } - timeout uint -) - -func init() { - registry.Commands = append(registry.Commands, registry.CliCommand{ - Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode}, - Command: stopCommand, - Parent: podCmd, - }) - flags := stopCommand.Flags() - flags.BoolVarP(&stopOptions.All, "all", "a", false, "Stop all running pods") - flags.BoolVarP(&stopOptions.Ignore, "ignore", "i", false, "Ignore errors when a specified pod is missing") - flags.BoolVarP(&stopOptions.Latest, "latest", "l", false, "Stop the latest pod podman is aware of") - flags.UintVarP(&timeout, "time", "t", 0, "Seconds to wait for pod stop before killing the container") - if registry.IsRemote() { - _ = flags.MarkHidden("latest") - _ = flags.MarkHidden("ignore") - - } - flags.SetNormalizeFunc(utils.AliasFlags) -} - -func stop(cmd *cobra.Command, args []string) error { - var ( - errs utils.OutputErrors - ) - if cmd.Flag("time").Changed { - stopOptions.Timeout = int(timeout) - } - responses, err := registry.ContainerEngine().PodStop(context.Background(), args, stopOptions) - if err != nil { - return err - } - // in the cli, first we print out all the successful attempts - for _, r := range responses { - if len(r.Errs) == 0 { - fmt.Println(r.Id) - } else { - errs = append(errs, r.Errs...) - } - } - return errs.PrintErrors() -} diff --git a/cmd/podmanV2/pods/top.go b/cmd/podmanV2/pods/top.go deleted file mode 100644 index 5ef282238..000000000 --- a/cmd/podmanV2/pods/top.go +++ /dev/null @@ -1,90 +0,0 @@ -package pods - -import ( - "context" - "fmt" - "os" - "strings" - "text/tabwriter" - - "github.com/containers/libpod/cmd/podmanV2/registry" - "github.com/containers/libpod/pkg/domain/entities" - "github.com/containers/psgo" - "github.com/pkg/errors" - "github.com/spf13/cobra" -) - -var ( - topDescription = fmt.Sprintf(`Specify format descriptors to alter the output. - - You may run "podman pod top -l pid pcpu seccomp" to print the process ID, the CPU percentage and the seccomp mode of each process of the latest pod. - Format Descriptors: - %s`, strings.Join(psgo.ListDescriptors(), ",")) - - topOptions = entities.PodTopOptions{} - - topCommand = &cobra.Command{ - Use: "top [flags] POD [FORMAT-DESCRIPTORS|ARGS]", - Short: "Display the running processes in a pod", - Long: topDescription, - PersistentPreRunE: preRunE, - RunE: top, - Args: cobra.ArbitraryArgs, - Example: `podman pod top podID -podman pod top --latest -podman pod top podID pid seccomp args %C -podman pod top podID -eo user,pid,comm`, - } -) - -func init() { - registry.Commands = append(registry.Commands, registry.CliCommand{ - Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode}, - Command: topCommand, - Parent: podCmd, - }) - - topCommand.SetHelpTemplate(registry.HelpTemplate()) - topCommand.SetUsageTemplate(registry.UsageTemplate()) - - flags := topCommand.Flags() - flags.SetInterspersed(false) - flags.BoolVar(&topOptions.ListDescriptors, "list-descriptors", false, "") - flags.BoolVarP(&topOptions.Latest, "latest", "l", false, "Act on the latest container podman is aware of") - - _ = flags.MarkHidden("list-descriptors") // meant only for bash completion - if registry.IsRemote() { - _ = flags.MarkHidden("latest") - } -} - -func top(cmd *cobra.Command, args []string) error { - if topOptions.ListDescriptors { - fmt.Println(strings.Join(psgo.ListDescriptors(), "\n")) - return nil - } - - if len(args) < 1 && !topOptions.Latest { - return errors.Errorf("you must provide the name or id of a running pod") - } - - if topOptions.Latest { - topOptions.Descriptors = args - } else { - topOptions.NameOrID = args[0] - topOptions.Descriptors = args[1:] - } - - topResponse, err := registry.ContainerEngine().PodTop(context.Background(), topOptions) - if err != nil { - return err - } - - w := tabwriter.NewWriter(os.Stdout, 5, 1, 3, ' ', 0) - for _, proc := range topResponse.Value { - if _, err := fmt.Fprintln(w, proc); err != nil { - return err - } - } - return w.Flush() -} diff --git a/cmd/podmanV2/pods/unpause.go b/cmd/podmanV2/pods/unpause.go deleted file mode 100644 index 2de7b964f..000000000 --- a/cmd/podmanV2/pods/unpause.go +++ /dev/null @@ -1,66 +0,0 @@ -package pods - -import ( - "context" - "fmt" - - "github.com/containers/libpod/cmd/podmanV2/parse" - "github.com/containers/libpod/cmd/podmanV2/registry" - "github.com/containers/libpod/cmd/podmanV2/utils" - "github.com/containers/libpod/pkg/domain/entities" - "github.com/spf13/cobra" -) - -var ( - podUnpauseDescription = `The podman unpause command will unpause all "paused" containers assigned to the pod. - - The pod name or ID can be used.` - unpauseCommand = &cobra.Command{ - Use: "unpause [flags] POD [POD...]", - Short: "Unpause one or more pods", - Long: podUnpauseDescription, - RunE: unpause, - Args: func(cmd *cobra.Command, args []string) error { - return parse.CheckAllLatestAndCIDFile(cmd, args, false, false) - }, - Example: `podman pod unpause podID1 podID2 - podman pod unpause --all - podman pod unpause --latest`, - } -) - -var ( - unpauseOptions entities.PodunpauseOptions -) - -func init() { - registry.Commands = append(registry.Commands, registry.CliCommand{ - Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode}, - Command: unpauseCommand, - Parent: podCmd, - }) - flags := unpauseCommand.Flags() - flags.BoolVarP(&unpauseOptions.All, "all", "a", false, "Pause all running pods") - flags.BoolVarP(&unpauseOptions.Latest, "latest", "l", false, "Act on the latest pod podman is aware of") - if registry.IsRemote() { - _ = flags.MarkHidden("latest") - } -} -func unpause(cmd *cobra.Command, args []string) error { - var ( - errs utils.OutputErrors - ) - responses, err := registry.ContainerEngine().PodUnpause(context.Background(), args, unpauseOptions) - if err != nil { - return err - } - // in the cli, first we print out all the successful attempts - for _, r := range responses { - if len(r.Errs) == 0 { - fmt.Println(r.Id) - } else { - errs = append(errs, r.Errs...) - } - } - return errs.PrintErrors() -} diff --git a/cmd/podmanV2/registry/registry.go b/cmd/podmanV2/registry/registry.go deleted file mode 100644 index 401f82718..000000000 --- a/cmd/podmanV2/registry/registry.go +++ /dev/null @@ -1,136 +0,0 @@ -package registry - -import ( - "context" - - "github.com/containers/libpod/pkg/domain/entities" - "github.com/containers/libpod/pkg/domain/infra" - "github.com/pkg/errors" - "github.com/spf13/cobra" -) - -type CobraFuncs func(cmd *cobra.Command, args []string) error - -type CliCommand struct { - Mode []entities.EngineMode - Command *cobra.Command - Parent *cobra.Command -} - -const ExecErrorCodeGeneric = 125 - -var ( - cliCtx context.Context - containerEngine entities.ContainerEngine - exitCode = ExecErrorCodeGeneric - imageEngine entities.ImageEngine - - Commands []CliCommand - EngineOptions entities.EngineOptions -) - -func SetExitCode(code int) { - exitCode = code -} - -func GetExitCode() int { - return exitCode -} - -// HelpTemplate returns the help template for podman commands -// This uses the short and long options. -// command should not use this. -func HelpTemplate() string { - return `{{.Short}} - -Description: - {{.Long}} - -{{if or .Runnable .HasSubCommands}}{{.UsageString}}{{end}}` -} - -// UsageTemplate returns the usage template for podman commands -// This blocks the displaying of the global options. The main podman -// command should not use this. -func UsageTemplate() string { - return `Usage(v2):{{if (and .Runnable (not .HasAvailableSubCommands))}} - {{.UseLine}}{{end}}{{if .HasAvailableSubCommands}} - {{.CommandPath}} [command]{{end}}{{if gt (len .Aliases) 0}} - -Aliases: - {{.NameAndAliases}}{{end}}{{if .HasExample}} - -Examples: - {{.Example}}{{end}}{{if .HasAvailableSubCommands}} - -Available Commands:{{range .Commands}}{{if (or .IsAvailableCommand (eq .Name "help"))}} - {{rpad .Name .NamePadding }} {{.Short}}{{end}}{{end}}{{end}}{{if .HasAvailableLocalFlags}} - -Flags: -{{.LocalFlags.FlagUsages | trimTrailingWhitespaces}}{{end}}{{if .HasAvailableInheritedFlags}} -{{end}} -` -} - -func ImageEngine() entities.ImageEngine { - return imageEngine -} - -// NewImageEngine is a wrapper for building an ImageEngine to be used for PreRunE functions -func NewImageEngine(cmd *cobra.Command, args []string) (entities.ImageEngine, error) { - if imageEngine == nil { - EngineOptions.FlagSet = cmd.Flags() - engine, err := infra.NewImageEngine(EngineOptions) - if err != nil { - return nil, err - } - imageEngine = engine - } - return imageEngine, nil -} - -func ContainerEngine() entities.ContainerEngine { - return containerEngine -} - -// NewContainerEngine is a wrapper for building an ContainerEngine to be used for PreRunE functions -func NewContainerEngine(cmd *cobra.Command, args []string) (entities.ContainerEngine, error) { - if containerEngine == nil { - EngineOptions.FlagSet = cmd.Flags() - engine, err := infra.NewContainerEngine(EngineOptions) - if err != nil { - return nil, err - } - containerEngine = engine - } - return containerEngine, nil -} - -func SubCommandExists(cmd *cobra.Command, args []string) error { - if len(args) > 0 { - return errors.Errorf("unrecognized command `%[1]s %[2]s`\nTry '%[1]s --help' for more information.", cmd.CommandPath(), args[0]) - } - return errors.Errorf("missing command '%[1]s COMMAND'\nTry '%[1]s --help' for more information.", cmd.CommandPath()) -} - -type podmanContextKey string - -var podmanFactsKey = podmanContextKey("engineOptions") - -func NewOptions(ctx context.Context, facts *entities.EngineOptions) context.Context { - return context.WithValue(ctx, podmanFactsKey, facts) -} - -func Options(cmd *cobra.Command) (*entities.EngineOptions, error) { - if f, ok := cmd.Context().Value(podmanFactsKey).(*entities.EngineOptions); ok { - return f, errors.New("Command Context ") - } - return nil, nil -} - -func GetContext() context.Context { - if cliCtx == nil { - cliCtx = context.TODO() - } - return cliCtx -} diff --git a/cmd/podmanV2/registry/remote.go b/cmd/podmanV2/registry/remote.go deleted file mode 100644 index 32a231ac4..000000000 --- a/cmd/podmanV2/registry/remote.go +++ /dev/null @@ -1,9 +0,0 @@ -package registry - -import ( - "github.com/containers/libpod/pkg/domain/entities" -) - -func IsRemote() bool { - return EngineOptions.EngineMode == entities.TunnelMode -} diff --git a/cmd/podmanV2/report/templates.go b/cmd/podmanV2/report/templates.go deleted file mode 100644 index e46048e97..000000000 --- a/cmd/podmanV2/report/templates.go +++ /dev/null @@ -1,73 +0,0 @@ -package report - -import ( - "strings" - "text/template" - "time" - "unicode" - - "github.com/docker/go-units" -) - -var defaultFuncMap = template.FuncMap{ - "ellipsis": func(s string, length int) string { - if len(s) > length { - return s[:length-3] + "..." - } - return s - }, - "humanDuration": func(t int64) string { - return units.HumanDuration(time.Since(time.Unix(t, 0))) + " ago" - }, - "humanDurationFromTime": func(t time.Time) string { - return units.HumanDuration(time.Since(t)) + " ago" - }, - "humanSize": func(sz int64) string { - s := units.HumanSizeWithPrecision(float64(sz), 3) - i := strings.LastIndexFunc(s, unicode.IsNumber) - return s[:i+1] + " " + s[i+1:] - }, - "join": strings.Join, - "lower": strings.ToLower, - "rfc3339": func(t int64) string { - return time.Unix(t, 0).Format(time.RFC3339) - }, - "replace": strings.Replace, - "split": strings.Split, - "title": strings.Title, - "upper": strings.ToUpper, - // TODO: Remove after Go 1.14 port - "slice": func(s string, i, j int) string { - if i > j || len(s) < i { - return s - } - if len(s) < j { - return s[i:] - } - return s[i:j] - }, -} - -func ReportHeader(columns ...string) []byte { - hdr := make([]string, len(columns)) - for i, h := range columns { - hdr[i] = strings.ToUpper(h) - } - return []byte(strings.Join(hdr, "\t") + "\n") -} - -func AppendFuncMap(funcMap template.FuncMap) template.FuncMap { - merged := PodmanTemplateFuncs() - for k, v := range funcMap { - merged[k] = v - } - return merged -} - -func PodmanTemplateFuncs() template.FuncMap { - merged := make(template.FuncMap) - for k, v := range defaultFuncMap { - merged[k] = v - } - return merged -} diff --git a/cmd/podmanV2/root.go b/cmd/podmanV2/root.go deleted file mode 100644 index 6fc12f57e..000000000 --- a/cmd/podmanV2/root.go +++ /dev/null @@ -1,99 +0,0 @@ -package main - -import ( - "fmt" - "log/syslog" - "os" - "path" - - "github.com/containers/libpod/cmd/podmanV2/registry" - "github.com/containers/libpod/pkg/domain/entities" - "github.com/containers/libpod/version" - "github.com/sirupsen/logrus" - logrusSyslog "github.com/sirupsen/logrus/hooks/syslog" - "github.com/spf13/cobra" -) - -var ( - rootCmd = &cobra.Command{ - Use: path.Base(os.Args[0]), - Long: "Manage pods, containers and images", - SilenceUsage: true, - SilenceErrors: true, - TraverseChildren: true, - PersistentPreRunE: preRunE, - RunE: registry.SubCommandExists, - Version: version.Version, - } - - logLevels = entities.NewStringSet("debug", "info", "warn", "error", "fatal", "panic") - logLevel = "error" - useSyslog bool -) - -func init() { - // Override default --help information of `--version` global flag} - var dummyVersion bool - // TODO had to disable shorthand -v for version due to -v rm with volume - rootCmd.PersistentFlags().BoolVar(&dummyVersion, "version", false, "Version of Podman") - rootCmd.PersistentFlags().StringVarP(®istry.EngineOptions.Uri, "remote", "r", "", "URL to access Podman service") - rootCmd.PersistentFlags().StringSliceVar(®istry.EngineOptions.Identities, "identity", []string{}, "path to SSH identity file") - rootCmd.PersistentFlags().StringVar(&logLevel, "log-level", "error", fmt.Sprintf("Log messages above specified level (%s)", logLevels.String())) - rootCmd.PersistentFlags().BoolVar(&useSyslog, "syslog", false, "Output logging information to syslog as well as the console (default false)") - - cobra.OnInitialize( - logging, - syslogHook, - ) -} - -func preRunE(cmd *cobra.Command, args []string) error { - cmd.SetHelpTemplate(registry.HelpTemplate()) - cmd.SetUsageTemplate(registry.UsageTemplate()) - return nil -} - -func logging() { - if !logLevels.Contains(logLevel) { - fmt.Fprintf(os.Stderr, "Log Level \"%s\" is not supported, choose from: %s\n", logLevel, logLevels.String()) - os.Exit(1) - } - - level, err := logrus.ParseLevel(logLevel) - if err != nil { - fmt.Fprintf(os.Stderr, err.Error()) - os.Exit(1) - } - logrus.SetLevel(level) - - if logrus.IsLevelEnabled(logrus.InfoLevel) { - logrus.Infof("%s filtering at log level %s", os.Args[0], logrus.GetLevel()) - } -} - -func syslogHook() { - if useSyslog { - hook, err := logrusSyslog.NewSyslogHook("", "", syslog.LOG_INFO, "") - if err != nil { - logrus.WithError(err).Error("Failed to initialize syslog hook") - } - if err == nil { - logrus.AddHook(hook) - } - } -} - -func Execute() { - o := registry.NewOptions(rootCmd.Context(), ®istry.EngineOptions) - if err := rootCmd.ExecuteContext(o); err != nil { - fmt.Fprintln(os.Stderr, "Error:", err.Error()) - } else if registry.GetExitCode() == registry.ExecErrorCodeGeneric { - // The exitCode modified from registry.ExecErrorCodeGeneric, - // indicates an application - // running inside of a container failed, as opposed to the - // podman command failed. Must exit with that exit code - // otherwise command exited correctly. - registry.SetExitCode(0) - } - os.Exit(registry.GetExitCode()) -} diff --git a/cmd/podmanV2/system/system.go b/cmd/podmanV2/system/system.go deleted file mode 100644 index 4e805c7bd..000000000 --- a/cmd/podmanV2/system/system.go +++ /dev/null @@ -1,33 +0,0 @@ -package system - -import ( - "github.com/containers/libpod/cmd/podmanV2/registry" - "github.com/containers/libpod/pkg/domain/entities" - "github.com/spf13/cobra" -) - -var ( - // Command: podman _system_ - cmd = &cobra.Command{ - Use: "system", - Short: "Manage podman", - Long: "Manage podman", - TraverseChildren: true, - PersistentPreRunE: preRunE, - RunE: registry.SubCommandExists, - } -) - -func init() { - registry.Commands = append(registry.Commands, registry.CliCommand{ - Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode}, - Command: cmd, - }) - cmd.SetHelpTemplate(registry.HelpTemplate()) - cmd.SetUsageTemplate(registry.UsageTemplate()) -} - -func preRunE(cmd *cobra.Command, args []string) error { - _, err := registry.NewContainerEngine(cmd, args) - return err -} diff --git a/cmd/podmanV2/utils/alias.go b/cmd/podmanV2/utils/alias.go deleted file mode 100644 index 54b3c5e89..000000000 --- a/cmd/podmanV2/utils/alias.go +++ /dev/null @@ -1,24 +0,0 @@ -package utils - -import "github.com/spf13/pflag" - -// AliasFlags is a function to handle backwards compatability with old flags -func AliasFlags(f *pflag.FlagSet, name string) pflag.NormalizedName { - switch name { - case "healthcheck-command": - name = "health-cmd" - case "healthcheck-interval": - name = "health-interval" - case "healthcheck-retries": - name = "health-retries" - case "healthcheck-start-period": - name = "health-start-period" - case "healthcheck-timeout": - name = "health-timeout" - case "net": - name = "network" - case "timeout": - name = "time" - } - return pflag.NormalizedName(name) -} diff --git a/cmd/podmanV2/utils/error.go b/cmd/podmanV2/utils/error.go deleted file mode 100644 index 3464f0779..000000000 --- a/cmd/podmanV2/utils/error.go +++ /dev/null @@ -1,16 +0,0 @@ -package utils - -import "fmt" - -type OutputErrors []error - -func (o OutputErrors) PrintErrors() (lastError error) { - if len(o) == 0 { - return - } - lastError = o[len(o)-1] - for e := 0; e < len(o)-1; e++ { - fmt.Println(o[e]) - } - return -} diff --git a/cmd/podmanV2/volumes/create.go b/cmd/podmanV2/volumes/create.go deleted file mode 100644 index 91181dd03..000000000 --- a/cmd/podmanV2/volumes/create.go +++ /dev/null @@ -1,72 +0,0 @@ -package volumes - -import ( - "context" - "fmt" - - "github.com/containers/libpod/cmd/podmanV2/parse" - "github.com/containers/libpod/cmd/podmanV2/registry" - "github.com/containers/libpod/pkg/domain/entities" - "github.com/pkg/errors" - "github.com/spf13/cobra" -) - -var ( - createDescription = `If using the default driver, "local", the volume will be created on the host in the volumes directory under container storage.` - - createCommand = &cobra.Command{ - Use: "create [flags] [NAME]", - Short: "Create a new volume", - Long: createDescription, - RunE: create, - Example: `podman volume create myvol - podman volume create - podman volume create --label foo=bar myvol`, - } -) - -var ( - createOpts = entities.VolumeCreateOptions{} - opts = struct { - Label []string - Opts []string - }{} -) - -func init() { - registry.Commands = append(registry.Commands, registry.CliCommand{ - Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode}, - Command: createCommand, - Parent: volumeCmd, - }) - flags := createCommand.Flags() - flags.StringVar(&createOpts.Driver, "driver", "", "Specify volume driver name (default local)") - flags.StringSliceVarP(&opts.Label, "label", "l", []string{}, "Set metadata for a volume (default [])") - flags.StringArrayVarP(&opts.Opts, "opt", "o", []string{}, "Set driver specific options (default [])") -} - -func create(cmd *cobra.Command, args []string) error { - var ( - err error - ) - if len(args) > 1 { - return errors.Errorf("too many arguments, create takes at most 1 argument") - } - if len(args) > 0 { - createOpts.Name = args[0] - } - createOpts.Label, err = parse.GetAllLabels([]string{}, opts.Label) - if err != nil { - return errors.Wrapf(err, "unable to process labels") - } - createOpts.Options, err = parse.GetAllLabels([]string{}, opts.Opts) - if err != nil { - return errors.Wrapf(err, "unable to process options") - } - response, err := registry.ContainerEngine().VolumeCreate(context.Background(), createOpts) - if err != nil { - return err - } - fmt.Println(response.IdOrName) - return nil -} diff --git a/cmd/podmanV2/volumes/inspect.go b/cmd/podmanV2/volumes/inspect.go deleted file mode 100644 index 4d9720432..000000000 --- a/cmd/podmanV2/volumes/inspect.go +++ /dev/null @@ -1,74 +0,0 @@ -package volumes - -import ( - "encoding/json" - "fmt" - "html/template" - "os" - - "github.com/containers/buildah/pkg/formats" - "github.com/containers/libpod/cmd/podmanV2/registry" - "github.com/containers/libpod/pkg/domain/entities" - "github.com/pkg/errors" - "github.com/spf13/cobra" - "golang.org/x/net/context" -) - -var ( - volumeInspectDescription = `Display detailed information on one or more volumes. - - Use a Go template to change the format from JSON.` - inspectCommand = &cobra.Command{ - Use: "inspect [flags] VOLUME [VOLUME...]", - Short: "Display detailed information on one or more volumes", - Long: volumeInspectDescription, - RunE: inspect, - Example: `podman volume inspect myvol - podman volume inspect --all - podman volume inspect --format "{{.Driver}} {{.Scope}}" myvol`, - } -) - -var ( - inspectOpts = entities.VolumeInspectOptions{} - inspectFormat string -) - -func init() { - registry.Commands = append(registry.Commands, registry.CliCommand{ - Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode}, - Command: inspectCommand, - Parent: volumeCmd, - }) - flags := inspectCommand.Flags() - flags.BoolVarP(&inspectOpts.All, "all", "a", false, "Inspect all volumes") - flags.StringVarP(&inspectFormat, "format", "f", "json", "Format volume output using Go template") -} - -func inspect(cmd *cobra.Command, args []string) error { - if (inspectOpts.All && len(args) > 0) || (!inspectOpts.All && len(args) < 1) { - return errors.New("provide one or more volume names or use --all") - } - responses, err := registry.ContainerEngine().VolumeInspect(context.Background(), args, inspectOpts) - if err != nil { - return err - } - switch inspectFormat { - case "", formats.JSONString: - jsonOut, err := json.MarshalIndent(responses, "", " ") - if err != nil { - return errors.Wrapf(err, "error marshalling inspect JSON") - } - fmt.Println(string(jsonOut)) - default: - tmpl, err := template.New("volumeInspect").Parse(inspectFormat) - if err != nil { - return err - } - if err := tmpl.Execute(os.Stdout, responses); err != nil { - return err - } - } - return nil - -} diff --git a/cmd/podmanV2/volumes/list.go b/cmd/podmanV2/volumes/list.go deleted file mode 100644 index c38f78c73..000000000 --- a/cmd/podmanV2/volumes/list.go +++ /dev/null @@ -1,98 +0,0 @@ -package volumes - -import ( - "context" - "html/template" - "io" - "os" - "strings" - "text/tabwriter" - - "github.com/containers/libpod/cmd/podmanV2/registry" - "github.com/containers/libpod/pkg/domain/entities" - "github.com/pkg/errors" - "github.com/spf13/cobra" -) - -var ( - volumeLsDescription = ` -podman volume ls - -List all available volumes. The output of the volumes can be filtered -and the output format can be changed to JSON or a user specified Go template.` - lsCommand = &cobra.Command{ - Use: "ls", - Aliases: []string{"list"}, - Args: cobra.NoArgs, - Short: "List volumes", - Long: volumeLsDescription, - RunE: list, - } -) - -var ( - // Temporary struct to hold cli values. - cliOpts = struct { - Filter []string - Format string - Quiet bool - }{} - lsOpts = entities.VolumeListOptions{} -) - -func init() { - registry.Commands = append(registry.Commands, registry.CliCommand{ - Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode}, - Command: lsCommand, - Parent: volumeCmd, - }) - flags := lsCommand.Flags() - flags.StringSliceVarP(&cliOpts.Filter, "filter", "f", []string{}, "Filter volume output") - flags.StringVar(&cliOpts.Format, "format", "{{.Driver}}\t{{.Name}}\n", "Format volume output using Go template") - flags.BoolVarP(&cliOpts.Quiet, "quiet", "q", false, "Print volume output in quiet mode") -} - -func list(cmd *cobra.Command, args []string) error { - var w io.Writer = os.Stdout - if cliOpts.Quiet && cmd.Flag("format").Changed { - return errors.New("quiet and format flags cannot be used together") - } - for _, f := range cliOpts.Filter { - filterSplit := strings.Split(f, "=") - if len(filterSplit) < 2 { - return errors.Errorf("filter input must be in the form of filter=value: %s is invalid", f) - } - lsOpts.Filter[filterSplit[0]] = append(lsOpts.Filter[filterSplit[0]], filterSplit[1:]...) - } - responses, err := registry.ContainerEngine().VolumeList(context.Background(), lsOpts) - if err != nil { - return err - } - // "\t" from the command line is not being recognized as a tab - // replacing the string "\t" to a tab character if the user passes in "\t" - cliOpts.Format = strings.Replace(cliOpts.Format, `\t`, "\t", -1) - if cliOpts.Quiet { - cliOpts.Format = "{{.Name}}\n" - } - headers := "DRIVER\tVOLUME NAME\n" - row := cliOpts.Format - if !strings.HasSuffix(cliOpts.Format, "\n") { - row += "\n" - } - format := "{{range . }}" + row + "{{end}}" - if !cliOpts.Quiet && !cmd.Flag("format").Changed { - w = tabwriter.NewWriter(os.Stdout, 12, 2, 2, ' ', 0) - format = headers + format - } - tmpl, err := template.New("listVolume").Parse(format) - if err != nil { - return err - } - if err := tmpl.Execute(w, responses); err != nil { - return err - } - if flusher, ok := w.(interface{ Flush() error }); ok { - return flusher.Flush() - } - return nil -} diff --git a/cmd/podmanV2/volumes/prune.go b/cmd/podmanV2/volumes/prune.go deleted file mode 100644 index 148065f56..000000000 --- a/cmd/podmanV2/volumes/prune.go +++ /dev/null @@ -1,74 +0,0 @@ -package volumes - -import ( - "bufio" - "context" - "fmt" - "os" - "strings" - - "github.com/containers/libpod/cmd/podmanV2/registry" - "github.com/containers/libpod/cmd/podmanV2/utils" - "github.com/containers/libpod/pkg/domain/entities" - "github.com/pkg/errors" - "github.com/spf13/cobra" -) - -var ( - volumePruneDescription = `Volumes that are not currently owned by a container will be removed. - - The command prompts for confirmation which can be overridden with the --force flag. - Note all data will be destroyed.` - pruneCommand = &cobra.Command{ - Use: "prune", - Args: cobra.NoArgs, - Short: "Remove all unused volumes", - Long: volumePruneDescription, - RunE: prune, - } -) - -var ( - pruneOptions entities.VolumePruneOptions -) - -func init() { - registry.Commands = append(registry.Commands, registry.CliCommand{ - Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode}, - Command: pruneCommand, - Parent: volumeCmd, - }) - flags := pruneCommand.Flags() - flags.BoolVarP(&pruneOptions.Force, "force", "f", false, "Do not prompt for confirmation") -} - -func prune(cmd *cobra.Command, args []string) error { - var ( - errs utils.OutputErrors - ) - // Prompt for confirmation if --force is not set - if !pruneOptions.Force { - reader := bufio.NewReader(os.Stdin) - fmt.Println("WARNING! This will remove all volumes not used by at least one container.") - fmt.Print("Are you sure you want to continue? [y/N] ") - answer, err := reader.ReadString('\n') - if err != nil { - return errors.Wrapf(err, "error reading input") - } - if strings.ToLower(answer)[0] != 'y' { - return nil - } - } - responses, err := registry.ContainerEngine().VolumePrune(context.Background(), pruneOptions) - if err != nil { - return err - } - for _, r := range responses { - if r.Err == nil { - fmt.Println(r.Id) - } else { - errs = append(errs, r.Err) - } - } - return errs.PrintErrors() -} diff --git a/cmd/podmanV2/volumes/rm.go b/cmd/podmanV2/volumes/rm.go deleted file mode 100644 index b019285d8..000000000 --- a/cmd/podmanV2/volumes/rm.go +++ /dev/null @@ -1,64 +0,0 @@ -package volumes - -import ( - "context" - "fmt" - - "github.com/containers/libpod/cmd/podmanV2/registry" - "github.com/containers/libpod/cmd/podmanV2/utils" - "github.com/containers/libpod/pkg/domain/entities" - "github.com/pkg/errors" - "github.com/spf13/cobra" -) - -var ( - volumeRmDescription = `Remove one or more existing volumes. - - By default only volumes that are not being used by any containers will be removed. To remove the volumes anyways, use the --force flag.` - rmCommand = &cobra.Command{ - Use: "rm [flags] VOLUME [VOLUME...]", - Aliases: []string{"remove"}, - Short: "Remove one or more volumes", - Long: volumeRmDescription, - RunE: rm, - Example: `podman volume rm myvol1 myvol2 - podman volume rm --all - podman volume rm --force myvol`, - } -) - -var ( - rmOptions = entities.VolumeRmOptions{} -) - -func init() { - registry.Commands = append(registry.Commands, registry.CliCommand{ - Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode}, - Command: rmCommand, - Parent: volumeCmd, - }) - flags := rmCommand.Flags() - flags.BoolVarP(&rmOptions.All, "all", "a", false, "Remove all volumes") - flags.BoolVarP(&rmOptions.Force, "force", "f", false, "Remove a volume by force, even if it is being used by a container") -} - -func rm(cmd *cobra.Command, args []string) error { - var ( - errs utils.OutputErrors - ) - if (len(args) > 0 && rmOptions.All) || (len(args) < 1 && !rmOptions.All) { - return errors.New("choose either one or more volumes or all") - } - responses, err := registry.ContainerEngine().VolumeRm(context.Background(), args, rmOptions) - if err != nil { - return err - } - for _, r := range responses { - if r.Err == nil { - fmt.Println(r.Id) - } else { - errs = append(errs, r.Err) - } - } - return errs.PrintErrors() -} diff --git a/cmd/podmanV2/volumes/volume.go b/cmd/podmanV2/volumes/volume.go deleted file mode 100644 index 84abe3d24..000000000 --- a/cmd/podmanV2/volumes/volume.go +++ /dev/null @@ -1,33 +0,0 @@ -package volumes - -import ( - "github.com/containers/libpod/cmd/podmanV2/registry" - "github.com/containers/libpod/pkg/domain/entities" - "github.com/spf13/cobra" -) - -var ( - // Command: podman _volume_ - volumeCmd = &cobra.Command{ - Use: "volume", - Short: "Manage volumes", - Long: "Volumes are created in and can be shared between containers", - TraverseChildren: true, - PersistentPreRunE: preRunE, - RunE: registry.SubCommandExists, - } -) - -func init() { - registry.Commands = append(registry.Commands, registry.CliCommand{ - Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode}, - Command: volumeCmd, - }) - volumeCmd.SetHelpTemplate(registry.HelpTemplate()) - volumeCmd.SetUsageTemplate(registry.UsageTemplate()) -} - -func preRunE(cmd *cobra.Command, args []string) error { - _, err := registry.NewContainerEngine(cmd, args) - return err -} |