summaryrefslogtreecommitdiff
path: root/cmd/podman
diff options
context:
space:
mode:
Diffstat (limited to 'cmd/podman')
-rw-r--r--cmd/podman/cliconfig/config.go4
-rw-r--r--cmd/podman/commands.go6
-rw-r--r--cmd/podman/image.go2
-rw-r--r--cmd/podman/libpodruntime/runtime.go9
-rw-r--r--cmd/podman/load.go54
-rw-r--r--cmd/podman/main.go3
-rw-r--r--cmd/podman/pod.go6
-rw-r--r--cmd/podman/pod_rm.go38
-rw-r--r--cmd/podman/save.go106
-rw-r--r--cmd/podman/system_renumber.go49
-rw-r--r--cmd/podman/varlink/io.podman.varlink17
11 files changed, 119 insertions, 175 deletions
diff --git a/cmd/podman/cliconfig/config.go b/cmd/podman/cliconfig/config.go
index ca788529c..a9032202f 100644
--- a/cmd/podman/cliconfig/config.go
+++ b/cmd/podman/cliconfig/config.go
@@ -548,3 +548,7 @@ type SystemPruneValues struct {
Force bool
Volume bool
}
+
+type SystemRenumberValues struct {
+ PodmanCommand
+}
diff --git a/cmd/podman/commands.go b/cmd/podman/commands.go
index 27ac342ba..0acb9c398 100644
--- a/cmd/podman/commands.go
+++ b/cmd/podman/commands.go
@@ -15,10 +15,8 @@ func getMainCommands() []*cobra.Command {
_diffCommand,
_execCommand,
generateCommand.Command,
- podCommand.Command,
_containerKubeCommand,
_psCommand,
- _loadCommand,
_loginCommand,
_logoutCommand,
_logsCommand,
@@ -30,7 +28,6 @@ func getMainCommands() []*cobra.Command {
_restoreCommand,
_rmCommand,
_runCommand,
- _saveCommand,
_searchCommand,
_signCommand,
_startCommand,
@@ -53,7 +50,6 @@ func getMainCommands() []*cobra.Command {
func getImageSubCommands() []*cobra.Command {
return []*cobra.Command{
_loadCommand,
- _saveCommand,
_signCommand,
}
}
@@ -102,7 +98,6 @@ func getPodSubCommands() []*cobra.Command {
_podPauseCommand,
_podPsCommand,
_podRestartCommand,
- _podRmCommand,
_podStartCommand,
_podStatsCommand,
_podStopCommand,
@@ -136,5 +131,6 @@ func getTrustSubCommands() []*cobra.Command {
func getSystemSubCommands() []*cobra.Command {
return []*cobra.Command{
_pruneSystemCommand,
+ _renumberCommand,
}
}
diff --git a/cmd/podman/image.go b/cmd/podman/image.go
index 4f9c7cd6a..14053cb0d 100644
--- a/cmd/podman/image.go
+++ b/cmd/podman/image.go
@@ -24,10 +24,12 @@ var imageSubCommands = []*cobra.Command{
_imagesCommand,
_importCommand,
_inspectCommand,
+ _loadCommand,
_pruneImagesCommand,
_pullCommand,
_pushCommand,
_rmiCommand,
+ _saveCommand,
_tagCommand,
}
diff --git a/cmd/podman/libpodruntime/runtime.go b/cmd/podman/libpodruntime/runtime.go
index 0b9568b8d..880b281bd 100644
--- a/cmd/podman/libpodruntime/runtime.go
+++ b/cmd/podman/libpodruntime/runtime.go
@@ -8,8 +8,17 @@ import (
"github.com/pkg/errors"
)
+// GetRuntimeRenumber gets a libpod runtime that will perform a lock renumber
+func GetRuntimeRenumber(c *cliconfig.PodmanCommand) (*libpod.Runtime, error) {
+ return getRuntime(c, true)
+}
+
// GetRuntime generates a new libpod runtime configured by command line options
func GetRuntime(c *cliconfig.PodmanCommand) (*libpod.Runtime, error) {
+ return getRuntime(c, false)
+}
+
+func getRuntime(c *cliconfig.PodmanCommand, renumber bool) (*libpod.Runtime, error) {
options := []libpod.RuntimeOption{}
storageOpts, volumePath, err := util.GetDefaultStoreOptions()
diff --git a/cmd/podman/load.go b/cmd/podman/load.go
index 34a51cd0d..514c9f1e9 100644
--- a/cmd/podman/load.go
+++ b/cmd/podman/load.go
@@ -6,12 +6,8 @@ import (
"io/ioutil"
"os"
- "github.com/containers/image/directory"
- dockerarchive "github.com/containers/image/docker/archive"
- ociarchive "github.com/containers/image/oci/archive"
"github.com/containers/libpod/cmd/podman/cliconfig"
- "github.com/containers/libpod/cmd/podman/libpodruntime"
- "github.com/containers/libpod/libpod/image"
+ "github.com/containers/libpod/libpod/adapter"
"github.com/pkg/errors"
"github.com/spf13/cobra"
)
@@ -56,14 +52,16 @@ func loadCmd(c *cliconfig.LoadValues) error {
return errors.New("too many arguments. Requires exactly 1")
}
- runtime, err := libpodruntime.GetRuntime(&c.PodmanCommand)
+ runtime, err := adapter.GetRuntime(&c.PodmanCommand)
if err != nil {
return errors.Wrapf(err, "could not get runtime")
}
defer runtime.Shutdown(false)
input := c.Input
-
+ if runtime.Remote && len(input) == 0 {
+ return errors.New("the remote client requires you to load via -i and a tarball")
+ }
if input == "/dev/stdin" {
fi, err := os.Stdin.Stat()
if err != nil {
@@ -96,46 +94,10 @@ func loadCmd(c *cliconfig.LoadValues) error {
return err
}
- var writer io.Writer
- if !c.Quiet {
- writer = os.Stderr
- }
-
- ctx := getContext()
-
- var newImages []*image.Image
- src, err := dockerarchive.ParseReference(input) // FIXME? We should add dockerarchive.NewReference()
- if err == nil {
- newImages, err = runtime.ImageRuntime().LoadFromArchiveReference(ctx, src, c.SignaturePolicy, writer)
- }
+ names, err := runtime.LoadImage(getContext(), imageName, c)
if err != nil {
- // generate full src name with specified image:tag
- src, err := ociarchive.NewReference(input, imageName) // imageName may be ""
- if err == nil {
- newImages, err = runtime.ImageRuntime().LoadFromArchiveReference(ctx, src, c.SignaturePolicy, writer)
- }
- if err != nil {
- src, err := directory.NewReference(input)
- if err == nil {
- newImages, err = runtime.ImageRuntime().LoadFromArchiveReference(ctx, src, c.SignaturePolicy, writer)
- }
- if err != nil {
- return errors.Wrapf(err, "error pulling %q", input)
- }
- }
+ return err
}
- fmt.Println("Loaded image(s): " + getImageNames(newImages))
+ fmt.Println("Loaded image(s): " + names)
return nil
}
-
-func getImageNames(images []*image.Image) string {
- var names string
- for i := range images {
- if i == 0 {
- names = images[i].InputName
- } else {
- names += ", " + images[i].InputName
- }
- }
- return names
-}
diff --git a/cmd/podman/main.go b/cmd/podman/main.go
index ecb72f58b..990e55a8c 100644
--- a/cmd/podman/main.go
+++ b/cmd/podman/main.go
@@ -45,9 +45,12 @@ var mainCommands = []*cobra.Command{
_infoCommand,
_inspectCommand,
_killCommand,
+ _loadCommand,
+ podCommand.Command,
_pullCommand,
_pushCommand,
_rmiCommand,
+ _saveCommand,
_tagCommand,
_versionCommand,
imageCommand.Command,
diff --git a/cmd/podman/pod.go b/cmd/podman/pod.go
index e988875ab..cf87730d7 100644
--- a/cmd/podman/pod.go
+++ b/cmd/podman/pod.go
@@ -18,7 +18,13 @@ var podCommand = cliconfig.PodmanCommand{
},
}
+//podSubCommands are implemented both in local and remote clients
+var podSubCommands = []*cobra.Command{
+ _podRmCommand,
+}
+
func init() {
+ podCommand.AddCommand(podSubCommands...)
podCommand.AddCommand(getPodSubCommands()...)
podCommand.SetUsageTemplate(UsageTemplate())
}
diff --git a/cmd/podman/pod_rm.go b/cmd/podman/pod_rm.go
index 54cee2a50..b615f88c9 100644
--- a/cmd/podman/pod_rm.go
+++ b/cmd/podman/pod_rm.go
@@ -2,9 +2,9 @@ package main
import (
"fmt"
+ "github.com/containers/libpod/libpod/adapter"
"github.com/containers/libpod/cmd/podman/cliconfig"
- "github.com/containers/libpod/cmd/podman/libpodruntime"
"github.com/pkg/errors"
"github.com/sirupsen/logrus"
"github.com/spf13/cobra"
@@ -42,36 +42,30 @@ func init() {
}
-// saveCmd saves the image to either docker-archive or oci
+// podRmCmd deletes pods
func podRmCmd(c *cliconfig.PodRmValues) error {
if err := checkMutuallyExclusiveFlags(&c.PodmanCommand); err != nil {
return err
}
-
- runtime, err := libpodruntime.GetRuntime(&c.PodmanCommand)
+ runtime, err := adapter.GetRuntime(&c.PodmanCommand)
if err != nil {
return errors.Wrapf(err, "could not get runtime")
}
defer runtime.Shutdown(false)
+ podRmIds, podRmErrors := runtime.RemovePods(getContext(), c)
+ for _, p := range podRmIds {
+ fmt.Println(p)
+ }
+ if len(podRmErrors) == 0 {
+ return nil
+ }
+ // Grab the last error
+ lastError := podRmErrors[len(podRmErrors)-1]
+ // Remove the last error from the error slice
+ podRmErrors = podRmErrors[:len(podRmErrors)-1]
- ctx := getContext()
- force := c.Force
-
- // getPodsFromContext returns an error when a requested pod
- // isn't found. The only fatal error scenerio is when there are no pods
- // in which case the following loop will be skipped.
- pods, lastError := getPodsFromContext(&c.PodmanCommand, runtime)
-
- for _, pod := range pods {
- err = runtime.RemovePod(ctx, pod, force, force)
- if err != nil {
- if lastError != nil {
- logrus.Errorf("%q", lastError)
- }
- lastError = errors.Wrapf(err, "failed to delete pod %v", pod.ID())
- } else {
- fmt.Println(pod.ID())
- }
+ for _, err := range podRmErrors {
+ logrus.Errorf("%q", err)
}
return lastError
}
diff --git a/cmd/podman/save.go b/cmd/podman/save.go
index ff4a22453..ba5209f34 100644
--- a/cmd/podman/save.go
+++ b/cmd/podman/save.go
@@ -1,21 +1,10 @@
package main
import (
- "fmt"
- "io"
"os"
- "strings"
- "github.com/containers/image/directory"
- dockerarchive "github.com/containers/image/docker/archive"
- "github.com/containers/image/docker/reference"
- "github.com/containers/image/manifest"
- ociarchive "github.com/containers/image/oci/archive"
- "github.com/containers/image/types"
"github.com/containers/libpod/cmd/podman/cliconfig"
- "github.com/containers/libpod/cmd/podman/libpodruntime"
- libpodImage "github.com/containers/libpod/libpod/image"
- imgspecv1 "github.com/opencontainers/image-spec/specs-go/v1"
+ "github.com/containers/libpod/libpod/adapter"
"github.com/pkg/errors"
"github.com/sirupsen/logrus"
"github.com/spf13/cobra"
@@ -52,7 +41,7 @@ func init() {
saveCommand.SetUsageTemplate(UsageTemplate())
flags := saveCommand.Flags()
flags.BoolVar(&saveCommand.Compress, "compress", false, "Compress tarball image layers when saving to a directory using the 'dir' transport. (default is same compression type as source)")
- flags.StringVar(&saveCommand.Format, "format", "", "Save image to oci-archive, oci-dir (directory with oci manifest type), docker-dir (directory with v2s2 manifest type)")
+ flags.StringVar(&saveCommand.Format, "format", "docker-archive", "Save image to oci-archive, oci-dir (directory with oci manifest type), docker-dir (directory with v2s2 manifest type)")
flags.StringVarP(&saveCommand.Output, "output", "o", "/dev/stdout", "Write to a file, default is STDOUT")
flags.BoolVarP(&saveCommand.Quiet, "quiet", "q", false, "Suppress the output")
}
@@ -64,7 +53,7 @@ func saveCmd(c *cliconfig.SaveValues) error {
return errors.Errorf("need at least 1 argument")
}
- runtime, err := libpodruntime.GetRuntime(&c.PodmanCommand)
+ runtime, err := adapter.GetRuntime(&c.PodmanCommand)
if err != nil {
return errors.Wrapf(err, "could not create runtime")
}
@@ -74,11 +63,6 @@ func saveCmd(c *cliconfig.SaveValues) error {
return errors.Errorf("--compress can only be set when --format is either 'oci-dir' or 'docker-dir'")
}
- var writer io.Writer
- if !c.Quiet {
- writer = os.Stderr
- }
-
output := c.Output
if output == "/dev/stdout" {
fi := os.Stdout
@@ -89,87 +73,5 @@ func saveCmd(c *cliconfig.SaveValues) error {
if err := validateFileName(output); err != nil {
return err
}
-
- source := args[0]
- newImage, err := runtime.ImageRuntime().NewFromLocal(source)
- if err != nil {
- return err
- }
-
- var destRef types.ImageReference
- var manifestType string
- switch c.Format {
- case "oci-archive":
- destImageName := imageNameForSaveDestination(newImage, source)
- destRef, err = ociarchive.NewReference(output, destImageName) // destImageName may be ""
- if err != nil {
- return errors.Wrapf(err, "error getting OCI archive ImageReference for (%q, %q)", output, destImageName)
- }
- case "oci-dir":
- destRef, err = directory.NewReference(output)
- if err != nil {
- return errors.Wrapf(err, "error getting directory ImageReference for %q", output)
- }
- manifestType = imgspecv1.MediaTypeImageManifest
- case "docker-dir":
- destRef, err = directory.NewReference(output)
- if err != nil {
- return errors.Wrapf(err, "error getting directory ImageReference for %q", output)
- }
- manifestType = manifest.DockerV2Schema2MediaType
- case "docker-archive", "":
- dst := output
- destImageName := imageNameForSaveDestination(newImage, source)
- if destImageName != "" {
- dst = fmt.Sprintf("%s:%s", dst, destImageName)
- }
- destRef, err = dockerarchive.ParseReference(dst) // FIXME? Add dockerarchive.NewReference
- if err != nil {
- return errors.Wrapf(err, "error getting Docker archive ImageReference for %q", dst)
- }
- default:
- return errors.Errorf("unknown format option %q", c.String("format"))
- }
-
- // supports saving multiple tags to the same tar archive
- var additionaltags []reference.NamedTagged
- if len(args) > 1 {
- additionaltags, err = libpodImage.GetAdditionalTags(args[1:])
- if err != nil {
- return err
- }
- }
- if err := newImage.PushImageToReference(getContext(), destRef, manifestType, "", "", writer, c.Bool("compress"), libpodImage.SigningOptions{}, &libpodImage.DockerRegistryOptions{}, additionaltags); err != nil {
- if err2 := os.Remove(output); err2 != nil {
- logrus.Errorf("error deleting %q: %v", output, err)
- }
- return errors.Wrapf(err, "unable to save %q", args)
- }
-
- return nil
-}
-
-// imageNameForSaveDestination returns a Docker-like reference appropriate for saving img,
-// which the user referred to as imgUserInput; or an empty string, if there is no appropriate
-// reference.
-func imageNameForSaveDestination(img *libpodImage.Image, imgUserInput string) string {
- if strings.Contains(img.ID(), imgUserInput) {
- return ""
- }
-
- prepend := ""
- localRegistryPrefix := fmt.Sprintf("%s/", libpodImage.DefaultLocalRegistry)
- if !strings.HasPrefix(imgUserInput, localRegistryPrefix) {
- // we need to check if localhost was added to the image name in NewFromLocal
- for _, name := range img.Names() {
- // If the user is saving an image in the localhost registry, getLocalImage need
- // a name that matches the format localhost/<tag1>:<tag2> or localhost/<tag>:latest to correctly
- // set up the manifest and save.
- if strings.HasPrefix(name, localRegistryPrefix) && (strings.HasSuffix(name, imgUserInput) || strings.HasSuffix(name, fmt.Sprintf("%s:latest", imgUserInput))) {
- prepend = localRegistryPrefix
- break
- }
- }
- }
- return fmt.Sprintf("%s%s", prepend, imgUserInput)
+ return runtime.SaveImage(getContext(), c)
}
diff --git a/cmd/podman/system_renumber.go b/cmd/podman/system_renumber.go
new file mode 100644
index 000000000..c8ce628b1
--- /dev/null
+++ b/cmd/podman/system_renumber.go
@@ -0,0 +1,49 @@
+package main
+
+import (
+ "github.com/containers/libpod/cmd/podman/cliconfig"
+ "github.com/containers/libpod/cmd/podman/libpodruntime"
+ "github.com/pkg/errors"
+ "github.com/spf13/cobra"
+)
+
+var (
+ renumberCommand cliconfig.SystemRenumberValues
+ renumberDescription = `
+ podman system renumber
+
+ Migrate lock numbers to handle a change in maximum number of locks.
+ Mandatory after the number of locks in libpod.conf is changed.
+`
+
+ _renumberCommand = &cobra.Command{
+ Use: "renumber",
+ Short: "Migrate lock numbers",
+ Long: renumberDescription,
+ RunE: func(cmd *cobra.Command, args []string) error {
+ renumberCommand.InputArgs = args
+ renumberCommand.GlobalFlags = MainGlobalOpts
+ return renumberCmd(&renumberCommand)
+ },
+ }
+)
+
+func init() {
+ renumberCommand.Command = _renumberCommand
+ renumberCommand.SetUsageTemplate(UsageTemplate())
+}
+
+func renumberCmd(c *cliconfig.SystemRenumberValues) error {
+ // We need to pass one extra option to NewRuntime.
+ // This will inform the OCI runtime to start a renumber.
+ // That's controlled by the last argument to GetRuntime.
+ r, err := libpodruntime.GetRuntimeRenumber(&c.PodmanCommand)
+ if err != nil {
+ return errors.Wrapf(err, "error renumbering locks")
+ }
+ if err := r.Shutdown(false); err != nil {
+ return err
+ }
+
+ return nil
+}
diff --git a/cmd/podman/varlink/io.podman.varlink b/cmd/podman/varlink/io.podman.varlink
index c53a5454a..09d178760 100644
--- a/cmd/podman/varlink/io.podman.varlink
+++ b/cmd/podman/varlink/io.podman.varlink
@@ -26,6 +26,16 @@ type ContainerChanges (
deleted: []string
)
+type ImageSaveOptions (
+ name: string,
+ format: string,
+ output: string,
+ outputType: string,
+ moreTags: []string,
+ quiet: bool,
+ compress: bool
+)
+
type VolumeCreateOpts (
volumeName: string,
driver: string,
@@ -1090,6 +1100,13 @@ method GetVolumes(args: []string, all: bool) -> (volumes: []Volume)
# VolumesPrune removes unused volumes on the host
method VolumesPrune() -> (prunedNames: []string, prunedErrors: []string)
+method ImageSave(options: ImageSaveOptions) -> (reply: MoreResponse)
+
+
+method GetPodsByContext(all: bool, latest: bool, args: []string) -> (pods: []string)
+
+method LoadImage(name: string, inputFile: string, quiet: bool, deleteFile: bool) -> (reply: MoreResponse)
+
# ImageNotFound means the image could not be found by the provided name or ID in local storage.
error ImageNotFound (id: string)