summaryrefslogtreecommitdiff
path: root/cmd
diff options
context:
space:
mode:
Diffstat (limited to 'cmd')
-rw-r--r--cmd/podman/common/default.go6
-rw-r--r--cmd/podman/common/netflags.go11
-rw-r--r--cmd/podman/common/specgen.go273
-rw-r--r--cmd/podman/containers/attach.go17
-rw-r--r--cmd/podman/containers/commit.go2
-rw-r--r--cmd/podman/containers/container.go3
-rw-r--r--cmd/podman/containers/inspect.go1
-rw-r--r--cmd/podman/containers/mount.go1
-rw-r--r--cmd/podman/containers/ps.go1
-rw-r--r--cmd/podman/containers/run.go4
-rw-r--r--cmd/podman/containers/start.go2
-rw-r--r--cmd/podman/images/history.go2
-rw-r--r--cmd/podman/images/image.go3
-rw-r--r--cmd/podman/images/inspect.go1
-rw-r--r--cmd/podman/images/list.go2
-rw-r--r--cmd/podman/login.go68
-rw-r--r--cmd/podman/logout.go57
-rw-r--r--cmd/podman/pods/inspect.go3
-rw-r--r--cmd/podman/pods/pod.go3
-rw-r--r--cmd/podman/pods/ps.go4
-rw-r--r--cmd/podman/registry/json.go20
-rw-r--r--cmd/podman/report/diff.go3
-rw-r--r--cmd/podman/report/report.go6
-rw-r--r--cmd/podman/system/info.go1
-rw-r--r--cmd/podman/system/system.go3
-rw-r--r--cmd/podman/volumes/inspect.go1
-rw-r--r--cmd/podman/volumes/volume.go3
27 files changed, 355 insertions, 146 deletions
diff --git a/cmd/podman/common/default.go b/cmd/podman/common/default.go
index 89316270b..7233b2091 100644
--- a/cmd/podman/common/default.go
+++ b/cmd/podman/common/default.go
@@ -1,5 +1,9 @@
package common
+import (
+ "github.com/containers/libpod/cmd/podman/registry"
+)
+
var (
// DefaultHealthCheckInterval default value
DefaultHealthCheckInterval = "30s"
@@ -11,4 +15,6 @@ var (
DefaultHealthCheckTimeout = "30s"
// DefaultImageVolume default value
DefaultImageVolume = "bind"
+ // Pull in configured json library
+ json = registry.JsonLibrary()
)
diff --git a/cmd/podman/common/netflags.go b/cmd/podman/common/netflags.go
index 1a47733e7..a439eb792 100644
--- a/cmd/podman/common/netflags.go
+++ b/cmd/podman/common/netflags.go
@@ -5,6 +5,7 @@ import (
"github.com/containers/libpod/cmd/podman/parse"
"github.com/containers/libpod/pkg/domain/entities"
+ "github.com/containers/libpod/pkg/specgen"
"github.com/pkg/errors"
"github.com/spf13/cobra"
"github.com/spf13/pflag"
@@ -159,9 +160,13 @@ func NetFlagsToNetOptions(cmd *cobra.Command) (*entities.NetOptions, error) {
return nil, err
}
- return nil, errors.Errorf("network %s is not yet supported", network)
- // TODO How do I convert a string network to a Specgen.Namespace?
- // opts.Network = specgen.Namespace{NSMode: network}
+ ns, cniNets, err := specgen.ParseNetworkNamespace(network)
+ if err != nil {
+ return nil, err
+ }
+
+ opts.Network = ns
+ opts.CNINetworks = cniNets
}
return &opts, err
diff --git a/cmd/podman/common/specgen.go b/cmd/podman/common/specgen.go
index 4e2ce1e34..fc0167461 100644
--- a/cmd/podman/common/specgen.go
+++ b/cmd/podman/common/specgen.go
@@ -1,7 +1,6 @@
package common
import (
- "encoding/json"
"fmt"
"os"
"path/filepath"
@@ -23,49 +22,135 @@ import (
"github.com/pkg/errors"
)
-func FillOutSpecGen(s *specgen.SpecGenerator, c *ContainerCLIOpts, args []string) error {
- var (
- err error
- //namespaces map[string]string
- )
+func getCPULimits(s *specgen.SpecGenerator, c *ContainerCLIOpts, args []string) (*specs.LinuxCPU, error) {
+ cpu := &specs.LinuxCPU{}
+ hasLimits := false
- // validate flags as needed
- if err := c.validate(); err != nil {
- return nil
+ if c.CPUShares > 0 {
+ cpu.Shares = &c.CPUShares
+ hasLimits = true
+ }
+ if c.CPUPeriod > 0 {
+ cpu.Period = &c.CPUPeriod
+ hasLimits = true
+ }
+ if c.CPUSetCPUs != "" {
+ cpu.Cpus = c.CPUSetCPUs
+ hasLimits = true
+ }
+ if c.CPUSetMems != "" {
+ cpu.Mems = c.CPUSetMems
+ hasLimits = true
+ }
+ if c.CPUQuota > 0 {
+ cpu.Quota = &c.CPUQuota
+ hasLimits = true
+ }
+ if c.CPURTPeriod > 0 {
+ cpu.RealtimePeriod = &c.CPURTPeriod
+ hasLimits = true
+ }
+ if c.CPURTRuntime > 0 {
+ cpu.RealtimeRuntime = &c.CPURTRuntime
+ hasLimits = true
}
- s.User = c.User
- inputCommand := args[1:]
- if len(c.HealthCmd) > 0 {
- s.HealthConfig, err = makeHealthCheckFromCli(c.HealthCmd, c.HealthInterval, c.HealthRetries, c.HealthTimeout, c.HealthStartPeriod)
+ if !hasLimits {
+ return nil, nil
+ }
+ return cpu, nil
+}
+
+func getIOLimits(s *specgen.SpecGenerator, c *ContainerCLIOpts, args []string) (*specs.LinuxBlockIO, error) {
+ var err error
+ io := &specs.LinuxBlockIO{}
+ hasLimits := false
+ if b := c.BlkIOWeight; len(b) > 0 {
+ u, err := strconv.ParseUint(b, 10, 16)
if err != nil {
- return err
+ return nil, errors.Wrapf(err, "invalid value for blkio-weight")
}
+ nu := uint16(u)
+ io.Weight = &nu
+ hasLimits = true
}
- s.IDMappings, err = util.ParseIDMapping(ns.UsernsMode(c.UserNS), c.UIDMap, c.GIDMap, c.SubUIDName, c.SubGIDName)
- if err != nil {
- return err
+ if len(c.BlkIOWeightDevice) > 0 {
+ if err := parseWeightDevices(c.BlkIOWeightDevice, s); err != nil {
+ return nil, err
+ }
+ hasLimits = true
}
- if s.ResourceLimits == nil {
- s.ResourceLimits = &specs.LinuxResources{}
+
+ if bps := c.DeviceReadBPs; len(bps) > 0 {
+ if s.ThrottleReadBpsDevice, err = parseThrottleBPSDevices(bps); err != nil {
+ return nil, err
+ }
+ hasLimits = true
+ }
+
+ if bps := c.DeviceWriteBPs; len(bps) > 0 {
+ if s.ThrottleWriteBpsDevice, err = parseThrottleBPSDevices(bps); err != nil {
+ return nil, err
+ }
+ hasLimits = true
+ }
+
+ if iops := c.DeviceReadIOPs; len(iops) > 0 {
+ if s.ThrottleReadIOPSDevice, err = parseThrottleIOPsDevices(iops); err != nil {
+ return nil, err
+ }
+ hasLimits = true
+ }
+
+ if iops := c.DeviceWriteIOPs; len(iops) > 0 {
+ if s.ThrottleWriteIOPSDevice, err = parseThrottleIOPsDevices(iops); err != nil {
+ return nil, err
+ }
+ hasLimits = true
+ }
+
+ if !hasLimits {
+ return nil, nil
+ }
+ return io, nil
+}
+
+func getPidsLimits(s *specgen.SpecGenerator, c *ContainerCLIOpts, args []string) (*specs.LinuxPids, error) {
+ pids := &specs.LinuxPids{}
+ hasLimits := false
+ if c.PIDsLimit > 0 {
+ pids.Limit = c.PIDsLimit
+ hasLimits = true
+ }
+ if c.CGroups == "disabled" && c.PIDsLimit > 0 {
+ s.ResourceLimits.Pids.Limit = -1
}
- if s.ResourceLimits.Memory == nil {
- s.ResourceLimits.Memory = &specs.LinuxMemory{}
+ if !hasLimits {
+ return nil, nil
}
+ return pids, nil
+}
+
+func getMemoryLimits(s *specgen.SpecGenerator, c *ContainerCLIOpts, args []string) (*specs.LinuxMemory, error) {
+ var err error
+ memory := &specs.LinuxMemory{}
+ hasLimits := false
if m := c.Memory; len(m) > 0 {
ml, err := units.RAMInBytes(m)
if err != nil {
- return errors.Wrapf(err, "invalid value for memory")
+ return nil, errors.Wrapf(err, "invalid value for memory")
}
- s.ResourceLimits.Memory.Limit = &ml
+ memory.Limit = &ml
+ hasLimits = true
}
if m := c.MemoryReservation; len(m) > 0 {
mr, err := units.RAMInBytes(m)
if err != nil {
- return errors.Wrapf(err, "invalid value for memory")
+ return nil, errors.Wrapf(err, "invalid value for memory")
}
- s.ResourceLimits.Memory.Reservation = &mr
+ memory.Reservation = &mr
+ hasLimits = true
}
if m := c.MemorySwap; len(m) > 0 {
var ms int64
@@ -75,28 +160,58 @@ func FillOutSpecGen(s *specgen.SpecGenerator, c *ContainerCLIOpts, args []string
} else {
ms, err = units.RAMInBytes(m)
if err != nil {
- return errors.Wrapf(err, "invalid value for memory")
+ return nil, errors.Wrapf(err, "invalid value for memory")
}
}
- s.ResourceLimits.Memory.Swap = &ms
+ memory.Swap = &ms
+ hasLimits = true
}
if m := c.KernelMemory; len(m) > 0 {
mk, err := units.RAMInBytes(m)
if err != nil {
- return errors.Wrapf(err, "invalid value for kernel-memory")
+ return nil, errors.Wrapf(err, "invalid value for kernel-memory")
}
- s.ResourceLimits.Memory.Kernel = &mk
+ memory.Kernel = &mk
+ hasLimits = true
}
- if s.ResourceLimits.BlockIO == nil {
- s.ResourceLimits.BlockIO = &specs.LinuxBlockIO{}
+ if c.MemorySwappiness >= 0 {
+ swappiness := uint64(c.MemorySwappiness)
+ memory.Swappiness = &swappiness
+ hasLimits = true
}
- if b := c.BlkIOWeight; len(b) > 0 {
- u, err := strconv.ParseUint(b, 10, 16)
+ if c.OOMKillDisable {
+ memory.DisableOOMKiller = &c.OOMKillDisable
+ hasLimits = true
+ }
+ if !hasLimits {
+ return nil, nil
+ }
+ return memory, nil
+}
+
+func FillOutSpecGen(s *specgen.SpecGenerator, c *ContainerCLIOpts, args []string) error {
+ var (
+ err error
+ //namespaces map[string]string
+ )
+
+ // validate flags as needed
+ if err := c.validate(); err != nil {
+ return nil
+ }
+
+ s.User = c.User
+ inputCommand := args[1:]
+ if len(c.HealthCmd) > 0 {
+ s.HealthConfig, err = makeHealthCheckFromCli(c.HealthCmd, c.HealthInterval, c.HealthRetries, c.HealthTimeout, c.HealthStartPeriod)
if err != nil {
- return errors.Wrapf(err, "invalid value for blkio-weight")
+ return err
}
- nu := uint16(u)
- s.ResourceLimits.BlockIO.Weight = &nu
+ }
+
+ s.IDMappings, err = util.ParseIDMapping(ns.UsernsMode(c.UserNS), c.UIDMap, c.GIDMap, c.SubUIDName, c.SubGIDName)
+ if err != nil {
+ return err
}
s.Terminal = c.TTY
@@ -330,12 +445,24 @@ func FillOutSpecGen(s *specgen.SpecGenerator, c *ContainerCLIOpts, args []string
if s.ResourceLimits == nil {
s.ResourceLimits = &specs.LinuxResources{}
}
- if s.ResourceLimits.Memory == nil {
- s.ResourceLimits.Memory = &specs.LinuxMemory{}
+ s.ResourceLimits.Memory, err = getMemoryLimits(s, c, args)
+ if err != nil {
+ return err
}
- if c.MemorySwappiness >= 0 {
- swappiness := uint64(c.MemorySwappiness)
- s.ResourceLimits.Memory.Swappiness = &swappiness
+ s.ResourceLimits.BlockIO, err = getIOLimits(s, c, args)
+ if err != nil {
+ return err
+ }
+ s.ResourceLimits.Pids, err = getPidsLimits(s, c, args)
+ if err != nil {
+ return err
+ }
+ s.ResourceLimits.CPU, err = getCPULimits(s, c, args)
+ if err != nil {
+ return err
+ }
+ if s.ResourceLimits.CPU == nil && s.ResourceLimits.Pids == nil && s.ResourceLimits.BlockIO == nil && s.ResourceLimits.Memory == nil {
+ s.ResourceLimits = nil
}
if s.LogConfiguration == nil {
@@ -345,15 +472,6 @@ func FillOutSpecGen(s *specgen.SpecGenerator, c *ContainerCLIOpts, args []string
if ld := c.LogDriver; len(ld) > 0 {
s.LogConfiguration.Driver = ld
}
- if s.ResourceLimits.Pids == nil {
- s.ResourceLimits.Pids = &specs.LinuxPids{}
- }
- if c.PIDsLimit > 0 {
- s.ResourceLimits.Pids.Limit = c.PIDsLimit
- }
- if c.CGroups == "disabled" && c.PIDsLimit > 0 {
- s.ResourceLimits.Pids.Limit = -1
- }
// TODO WTF
//cgroup := &cc.CgroupConfig{
// Cgroups: c.String("cgroups"),
@@ -459,32 +577,6 @@ func FillOutSpecGen(s *specgen.SpecGenerator, c *ContainerCLIOpts, args []string
// quiet
//DeviceCgroupRules: c.StringSlice("device-cgroup-rule"),
- if bps := c.DeviceReadBPs; len(bps) > 0 {
- if s.ThrottleReadBpsDevice, err = parseThrottleBPSDevices(bps); err != nil {
- return err
- }
- }
-
- if bps := c.DeviceWriteBPs; len(bps) > 0 {
- if s.ThrottleWriteBpsDevice, err = parseThrottleBPSDevices(bps); err != nil {
- return err
- }
- }
-
- if iops := c.DeviceReadIOPs; len(iops) > 0 {
- if s.ThrottleReadIOPSDevice, err = parseThrottleIOPsDevices(iops); err != nil {
- return err
- }
- }
-
- if iops := c.DeviceWriteIOPs; len(iops) > 0 {
- if s.ThrottleWriteIOPSDevice, err = parseThrottleIOPsDevices(iops); err != nil {
- return err
- }
- }
-
- s.ResourceLimits.Memory.DisableOOMKiller = &c.OOMKillDisable
-
// Rlimits/Ulimits
for _, u := range c.Ulimit {
if u == "host" {
@@ -519,35 +611,6 @@ func FillOutSpecGen(s *specgen.SpecGenerator, c *ContainerCLIOpts, args []string
s.LogConfiguration.Options = logOpts
s.Name = c.Name
- if err := parseWeightDevices(c.BlkIOWeightDevice, s); err != nil {
- return err
- }
-
- if s.ResourceLimits.CPU == nil {
- s.ResourceLimits.CPU = &specs.LinuxCPU{}
- }
- if c.CPUShares > 0 {
- s.ResourceLimits.CPU.Shares = &c.CPUShares
- }
- if c.CPUPeriod > 0 {
- s.ResourceLimits.CPU.Period = &c.CPUPeriod
- }
-
- if c.CPUSetCPUs != "" {
- s.ResourceLimits.CPU.Cpus = c.CPUSetCPUs
- }
- if c.CPUSetMems != "" {
- s.ResourceLimits.CPU.Mems = c.CPUSetMems
- }
- if c.CPUQuota > 0 {
- s.ResourceLimits.CPU.Quota = &c.CPUQuota
- }
- if c.CPURTPeriod > 0 {
- s.ResourceLimits.CPU.RealtimePeriod = &c.CPURTPeriod
- }
- if c.CPURTRuntime > 0 {
- s.ResourceLimits.CPU.RealtimeRuntime = &c.CPURTRuntime
- }
s.OOMScoreAdj = &c.OOMScoreAdj
s.RestartPolicy = c.Restart
s.Remove = c.Rm
diff --git a/cmd/podman/containers/attach.go b/cmd/podman/containers/attach.go
index b87fab5ef..78b52ad1b 100644
--- a/cmd/podman/containers/attach.go
+++ b/cmd/podman/containers/attach.go
@@ -43,23 +43,6 @@ var (
attachOpts entities.AttachOptions
)
-func init() {
- registry.Commands = append(registry.Commands, registry.CliCommand{
- Mode: []entities.EngineMode{entities.ABIMode},
- Command: attachCommand,
- })
- flags := attachCommand.Flags()
- attachFlags(flags)
-
- registry.Commands = append(registry.Commands, registry.CliCommand{
- Mode: []entities.EngineMode{entities.ABIMode},
- Command: containerAttachCommand,
- Parent: containerCmd,
- })
- containerAttachFlags := containerAttachCommand.Flags()
- attachFlags(containerAttachFlags)
-}
-
func attachFlags(flags *pflag.FlagSet) {
flags.StringVar(&attachOpts.DetachKeys, "detach-keys", containerConfig.DetachKeys(), "Select the key sequence for detaching a container. Format is a single character `[a-Z]` or a comma separated sequence of `ctrl-<value>`, where `<value>` is one of: `a-z`, `@`, `^`, `[`, `\\`, `]`, `^` or `_`")
flags.BoolVar(&attachOpts.NoStdin, "no-stdin", false, "Do not attach STDIN. The default is false")
diff --git a/cmd/podman/containers/commit.go b/cmd/podman/containers/commit.go
index 69e343f59..137e486eb 100644
--- a/cmd/podman/containers/commit.go
+++ b/cmd/podman/containers/commit.go
@@ -72,7 +72,7 @@ func init() {
registry.Commands = append(registry.Commands, registry.CliCommand{
Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode},
- Command: containerAttachCommand,
+ Command: containerCommitCommand,
Parent: containerCmd,
})
containerCommitFlags := containerCommitCommand.Flags()
diff --git a/cmd/podman/containers/container.go b/cmd/podman/containers/container.go
index 4b1733eb0..97b73cdd0 100644
--- a/cmd/podman/containers/container.go
+++ b/cmd/podman/containers/container.go
@@ -8,6 +8,9 @@ import (
)
var (
+ // Pull in configured json library
+ json = registry.JsonLibrary()
+
// Command: podman _container_
containerCmd = &cobra.Command{
Use: "container",
diff --git a/cmd/podman/containers/inspect.go b/cmd/podman/containers/inspect.go
index 8d591832b..f9ef1ddbd 100644
--- a/cmd/podman/containers/inspect.go
+++ b/cmd/podman/containers/inspect.go
@@ -11,7 +11,6 @@ import (
"github.com/containers/libpod/cmd/podman/registry"
"github.com/containers/libpod/pkg/domain/entities"
- json "github.com/json-iterator/go"
"github.com/spf13/cobra"
)
diff --git a/cmd/podman/containers/mount.go b/cmd/podman/containers/mount.go
index d0d132546..0bdac72cb 100644
--- a/cmd/podman/containers/mount.go
+++ b/cmd/podman/containers/mount.go
@@ -1,7 +1,6 @@
package containers
import (
- "encoding/json"
"fmt"
"os"
"text/tabwriter"
diff --git a/cmd/podman/containers/ps.go b/cmd/podman/containers/ps.go
index 57b81a609..49e77abd2 100644
--- a/cmd/podman/containers/ps.go
+++ b/cmd/podman/containers/ps.go
@@ -1,7 +1,6 @@
package containers
import (
- "encoding/json"
"fmt"
"os"
"sort"
diff --git a/cmd/podman/containers/run.go b/cmd/podman/containers/run.go
index ffad26fe9..06b89b0fc 100644
--- a/cmd/podman/containers/run.go
+++ b/cmd/podman/containers/run.go
@@ -34,8 +34,8 @@ var (
Long: runCommand.Long,
RunE: runCommand.RunE,
Example: `podman container run imageID ls -alF /etc
- podman container run --network=host imageID dnf -y install java
- podman container run --volume /var/hostdir:/var/ctrdir -i -t fedora /bin/bash`,
+ podman container run --network=host imageID dnf -y install java
+ podman container run --volume /var/hostdir:/var/ctrdir -i -t fedora /bin/bash`,
}
)
diff --git a/cmd/podman/containers/start.go b/cmd/podman/containers/start.go
index a321b130e..73f37e51f 100644
--- a/cmd/podman/containers/start.go
+++ b/cmd/podman/containers/start.go
@@ -66,7 +66,7 @@ func init() {
Parent: containerCmd,
})
- containerStartFlags := containerRunCommand.Flags()
+ containerStartFlags := containerStartCommand.Flags()
startFlags(containerStartFlags)
}
diff --git a/cmd/podman/images/history.go b/cmd/podman/images/history.go
index c92072bff..b8d216cc1 100644
--- a/cmd/podman/images/history.go
+++ b/cmd/podman/images/history.go
@@ -13,7 +13,6 @@ import (
"github.com/containers/libpod/cmd/podman/registry"
"github.com/containers/libpod/pkg/domain/entities"
"github.com/docker/go-units"
- jsoniter "github.com/json-iterator/go"
"github.com/pkg/errors"
"github.com/spf13/cobra"
)
@@ -77,7 +76,6 @@ func history(cmd *cobra.Command, args []string) error {
layers[i].ImageHistoryLayer = l
layers[i].Created = l.Created.Format(time.RFC3339)
}
- json := jsoniter.ConfigCompatibleWithStandardLibrary
enc := json.NewEncoder(os.Stdout)
err = enc.Encode(layers)
}
diff --git a/cmd/podman/images/image.go b/cmd/podman/images/image.go
index 37e46ab9e..604f49251 100644
--- a/cmd/podman/images/image.go
+++ b/cmd/podman/images/image.go
@@ -7,6 +7,9 @@ import (
)
var (
+ // Pull in configured json library
+ json = registry.JsonLibrary()
+
// Command: podman _image_
imageCmd = &cobra.Command{
Use: "image",
diff --git a/cmd/podman/images/inspect.go b/cmd/podman/images/inspect.go
index 3190ab725..91c9445eb 100644
--- a/cmd/podman/images/inspect.go
+++ b/cmd/podman/images/inspect.go
@@ -2,7 +2,6 @@ package images
import (
"context"
- "encoding/json"
"fmt"
"os"
"strings"
diff --git a/cmd/podman/images/list.go b/cmd/podman/images/list.go
index 63ddc5d56..b979cb6af 100644
--- a/cmd/podman/images/list.go
+++ b/cmd/podman/images/list.go
@@ -14,7 +14,6 @@ import (
"github.com/containers/libpod/cmd/podman/registry"
"github.com/containers/libpod/pkg/domain/entities"
"github.com/docker/go-units"
- jsoniter "github.com/json-iterator/go"
"github.com/spf13/cobra"
"github.com/spf13/pflag"
)
@@ -127,7 +126,6 @@ func writeJSON(imageS []*entities.ImageSummary) error {
imgs = append(imgs, h)
}
- json := jsoniter.ConfigCompatibleWithStandardLibrary
enc := json.NewEncoder(os.Stdout)
return enc.Encode(imgs)
}
diff --git a/cmd/podman/login.go b/cmd/podman/login.go
new file mode 100644
index 000000000..1843a764d
--- /dev/null
+++ b/cmd/podman/login.go
@@ -0,0 +1,68 @@
+package main
+
+import (
+ "context"
+ "os"
+
+ "github.com/containers/common/pkg/auth"
+ "github.com/containers/image/v5/types"
+ "github.com/containers/libpod/cmd/podman/registry"
+ "github.com/containers/libpod/pkg/domain/entities"
+ "github.com/spf13/cobra"
+)
+
+type loginOptionsWrapper struct {
+ auth.LoginOptions
+ tlsVerify bool
+}
+
+var (
+ loginOptions = loginOptionsWrapper{}
+ loginCommand = &cobra.Command{
+ Use: "login [flags] REGISTRY",
+ Short: "Login to a container registry",
+ Long: "Login to a container registry on a specified server.",
+ RunE: login,
+ Args: cobra.ExactArgs(1),
+ Example: `podman login quay.io
+ podman login --username ... --password ... quay.io
+ podman login --authfile dir/auth.json quay.io`,
+ }
+)
+
+func init() {
+ // Note that the local and the remote client behave the same: both
+ // store credentials locally while the remote client will pass them
+ // over the wire to the endpoint.
+ registry.Commands = append(registry.Commands, registry.CliCommand{
+ Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode},
+ Command: loginCommand,
+ })
+ flags := loginCommand.Flags()
+
+ // Flags from the auth package.
+ flags.AddFlagSet(auth.GetLoginFlags(&loginOptions.LoginOptions))
+
+ // Podman flags.
+ flags.BoolVarP(&loginOptions.tlsVerify, "tls-verify", "", false, "Require HTTPS and verify certificates when contacting registries")
+ flags.BoolVarP(&loginOptions.GetLoginSet, "get-login", "", false, "Return the current login user for the registry")
+ loginOptions.Stdin = os.Stdin
+ loginOptions.Stdout = os.Stdout
+}
+
+// Implementation of podman-login.
+func login(cmd *cobra.Command, args []string) error {
+ var skipTLS types.OptionalBool
+
+ if cmd.Flags().Changed("tls-verify") {
+ skipTLS = types.NewOptionalBool(!loginOptions.tlsVerify)
+ }
+
+ sysCtx := types.SystemContext{
+ AuthFilePath: loginOptions.AuthFile,
+ DockerCertPath: loginOptions.CertDir,
+ DockerInsecureSkipTLSVerify: skipTLS,
+ }
+
+ return auth.Login(context.Background(), &sysCtx, &loginOptions.LoginOptions, args[0])
+}
diff --git a/cmd/podman/logout.go b/cmd/podman/logout.go
new file mode 100644
index 000000000..77bdc92b4
--- /dev/null
+++ b/cmd/podman/logout.go
@@ -0,0 +1,57 @@
+package main
+
+import (
+ "os"
+
+ "github.com/containers/common/pkg/auth"
+ "github.com/containers/image/v5/types"
+ "github.com/containers/libpod/cmd/podman/registry"
+ "github.com/containers/libpod/pkg/domain/entities"
+ "github.com/pkg/errors"
+ "github.com/spf13/cobra"
+)
+
+var (
+ logoutOptions = auth.LogoutOptions{}
+ logoutCommand = &cobra.Command{
+ Use: "logout [flags] REGISTRY",
+ Short: "Logout of a container registry",
+ Long: "Remove the cached username and password for the registry.",
+ RunE: logout,
+ Args: cobra.MaximumNArgs(1),
+ Example: `podman logout quay.io
+ podman logout --authfile dir/auth.json quay.io
+ podman logout --all`,
+ }
+)
+
+func init() {
+ // Note that the local and the remote client behave the same: both
+ // store credentials locally while the remote client will pass them
+ // over the wire to the endpoint.
+ registry.Commands = append(registry.Commands, registry.CliCommand{
+ Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode},
+ Command: logoutCommand,
+ })
+ flags := logoutCommand.Flags()
+
+ // Flags from the auth package.
+ flags.AddFlagSet(auth.GetLogoutFlags(&logoutOptions))
+ logoutOptions.Stdin = os.Stdin
+ logoutOptions.Stdout = os.Stdout
+}
+
+// Implementation of podman-logout.
+func logout(cmd *cobra.Command, args []string) error {
+ sysCtx := types.SystemContext{AuthFilePath: logoutOptions.AuthFile}
+
+ registry := ""
+ if len(args) > 0 {
+ if logoutOptions.All {
+ return errors.New("--all takes no arguments")
+ }
+ registry = args[0]
+ }
+
+ return auth.Logout(&sysCtx, &logoutOptions, registry)
+}
diff --git a/cmd/podman/pods/inspect.go b/cmd/podman/pods/inspect.go
index 901ae50b2..1e333247b 100644
--- a/cmd/podman/pods/inspect.go
+++ b/cmd/podman/pods/inspect.go
@@ -6,7 +6,6 @@ import (
"github.com/containers/libpod/cmd/podman/registry"
"github.com/containers/libpod/pkg/domain/entities"
- jsoniter "github.com/json-iterator/go"
"github.com/pkg/errors"
"github.com/spf13/cobra"
)
@@ -55,7 +54,7 @@ func inspect(cmd *cobra.Command, args []string) error {
if err != nil {
return err
}
- b, err := jsoniter.MarshalIndent(responses, "", " ")
+ b, err := json.MarshalIndent(responses, "", " ")
if err != nil {
return err
}
diff --git a/cmd/podman/pods/pod.go b/cmd/podman/pods/pod.go
index fa917b2ae..e86b8aba4 100644
--- a/cmd/podman/pods/pod.go
+++ b/cmd/podman/pods/pod.go
@@ -8,6 +8,9 @@ import (
)
var (
+ // Pull in configured json library
+ json = registry.JsonLibrary()
+
// Command: podman _pod_
podCmd = &cobra.Command{
Use: "pod",
diff --git a/cmd/podman/pods/ps.go b/cmd/podman/pods/ps.go
index 8cb7b6266..808980eff 100644
--- a/cmd/podman/pods/ps.go
+++ b/cmd/podman/pods/ps.go
@@ -2,7 +2,6 @@ package pods
import (
"context"
- "encoding/json"
"fmt"
"io"
"os"
@@ -11,10 +10,9 @@ import (
"text/template"
"time"
- "github.com/docker/go-units"
-
"github.com/containers/libpod/cmd/podman/registry"
"github.com/containers/libpod/pkg/domain/entities"
+ "github.com/docker/go-units"
"github.com/pkg/errors"
"github.com/spf13/cobra"
)
diff --git a/cmd/podman/registry/json.go b/cmd/podman/registry/json.go
new file mode 100644
index 000000000..f25406c3c
--- /dev/null
+++ b/cmd/podman/registry/json.go
@@ -0,0 +1,20 @@
+package registry
+
+import (
+ "sync"
+
+ jsoniter "github.com/json-iterator/go"
+)
+
+var (
+ json jsoniter.API
+ jsonSync sync.Once
+)
+
+// JsonLibrary provides a "encoding/json" compatible API
+func JsonLibrary() jsoniter.API {
+ jsonSync.Do(func() {
+ json = jsoniter.ConfigCompatibleWithStandardLibrary
+ })
+ return json
+}
diff --git a/cmd/podman/report/diff.go b/cmd/podman/report/diff.go
index b36189d75..0730f06e8 100644
--- a/cmd/podman/report/diff.go
+++ b/cmd/podman/report/diff.go
@@ -6,7 +6,6 @@ import (
"github.com/containers/libpod/pkg/domain/entities"
"github.com/containers/storage/pkg/archive"
- jsoniter "github.com/json-iterator/go"
"github.com/pkg/errors"
)
@@ -31,7 +30,7 @@ func ChangesToJSON(diffs *entities.DiffReport) error {
}
}
- json := jsoniter.ConfigCompatibleWithStandardLibrary
+ // Pull in configured json library
enc := json.NewEncoder(os.Stdout)
return enc.Encode(body)
}
diff --git a/cmd/podman/report/report.go b/cmd/podman/report/report.go
new file mode 100644
index 000000000..8392f10e0
--- /dev/null
+++ b/cmd/podman/report/report.go
@@ -0,0 +1,6 @@
+package report
+
+import "github.com/containers/libpod/cmd/podman/registry"
+
+// Pull in configured json library
+var json = registry.JsonLibrary()
diff --git a/cmd/podman/system/info.go b/cmd/podman/system/info.go
index aa0a66ffc..8e014a91b 100644
--- a/cmd/podman/system/info.go
+++ b/cmd/podman/system/info.go
@@ -1,7 +1,6 @@
package system
import (
- "encoding/json"
"fmt"
"os"
"text/template"
diff --git a/cmd/podman/system/system.go b/cmd/podman/system/system.go
index 6d8c9ebc5..2d55e8c13 100644
--- a/cmd/podman/system/system.go
+++ b/cmd/podman/system/system.go
@@ -7,6 +7,9 @@ import (
)
var (
+ // Pull in configured json library
+ json = registry.JsonLibrary()
+
// Command: podman _system_
systemCmd = &cobra.Command{
Use: "system",
diff --git a/cmd/podman/volumes/inspect.go b/cmd/podman/volumes/inspect.go
index feaaee176..79f65ea4a 100644
--- a/cmd/podman/volumes/inspect.go
+++ b/cmd/podman/volumes/inspect.go
@@ -1,7 +1,6 @@
package volumes
import (
- "encoding/json"
"fmt"
"html/template"
"os"
diff --git a/cmd/podman/volumes/volume.go b/cmd/podman/volumes/volume.go
index 06943da62..4d74ff084 100644
--- a/cmd/podman/volumes/volume.go
+++ b/cmd/podman/volumes/volume.go
@@ -7,6 +7,9 @@ import (
)
var (
+ // Pull in configured json library
+ json = registry.JsonLibrary()
+
// Command: podman _volume_
volumeCmd = &cobra.Command{
Use: "volume",