Add support for podman context as alias to podman system connection
Alias podman --context -> podman --connection podman context use -> podman system connection default podman context rm -> podman system connection rm podman context create -> podman system connection add podman context ls ->podman system connection ls podman context inspect ->podman system connection ls --json (For specified connections) Podman context is a hidden command, but can be used for existing scripts that assume Docker under the covers. Signed-off-by: Daniel J Walsh <dwalsh@redhat.com>
This commit is contained in:
parent
4fc18d07a6
commit
3508bd22fe
|
@ -32,6 +32,8 @@ func IsRemote() bool {
|
||||||
fs.BoolVarP(&remoteFromCLI.Value, "remote", "r", remote, "")
|
fs.BoolVarP(&remoteFromCLI.Value, "remote", "r", remote, "")
|
||||||
connectionFlagName := "connection"
|
connectionFlagName := "connection"
|
||||||
fs.StringP(connectionFlagName, "c", "", "")
|
fs.StringP(connectionFlagName, "c", "", "")
|
||||||
|
contextFlagName := "context"
|
||||||
|
fs.String(contextFlagName, "", "")
|
||||||
hostFlagName := "host"
|
hostFlagName := "host"
|
||||||
fs.StringP(hostFlagName, "H", "", "")
|
fs.StringP(hostFlagName, "H", "", "")
|
||||||
urlFlagName := "url"
|
urlFlagName := "url"
|
||||||
|
@ -46,7 +48,7 @@ func IsRemote() bool {
|
||||||
}
|
}
|
||||||
_ = fs.Parse(os.Args[start:])
|
_ = fs.Parse(os.Args[start:])
|
||||||
// --connection or --url implies --remote
|
// --connection or --url implies --remote
|
||||||
remoteFromCLI.Value = remoteFromCLI.Value || fs.Changed(connectionFlagName) || fs.Changed(urlFlagName) || fs.Changed(hostFlagName)
|
remoteFromCLI.Value = remoteFromCLI.Value || fs.Changed(connectionFlagName) || fs.Changed(urlFlagName) || fs.Changed(hostFlagName) || fs.Changed(contextFlagName)
|
||||||
})
|
})
|
||||||
return podmanOptions.EngineMode == entities.TunnelMode || remoteFromCLI.Value
|
return podmanOptions.EngineMode == entities.TunnelMode || remoteFromCLI.Value
|
||||||
}
|
}
|
||||||
|
|
|
@ -174,11 +174,7 @@ func persistentPreRunE(cmd *cobra.Command, args []string) error {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// --connection is not as "special" as --remote so we can wait and process it here
|
setupConnection := func() error {
|
||||||
conn := cmd.Root().LocalFlags().Lookup("connection")
|
|
||||||
if conn != nil && conn.Changed {
|
|
||||||
cfg.Engine.ActiveService = conn.Value.String()
|
|
||||||
|
|
||||||
var err error
|
var err error
|
||||||
cfg.URI, cfg.Identity, err = cfg.ActiveDestination()
|
cfg.URI, cfg.Identity, err = cfg.ActiveDestination()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -192,6 +188,29 @@ func persistentPreRunE(cmd *cobra.Command, args []string) error {
|
||||||
if err := cmd.Root().LocalFlags().Set("identity", cfg.Identity); err != nil {
|
if err := cmd.Root().LocalFlags().Set("identity", cfg.Identity); err != nil {
|
||||||
return fmt.Errorf("failed to override --identity flag: %w", err)
|
return fmt.Errorf("failed to override --identity flag: %w", err)
|
||||||
}
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// --connection is not as "special" as --remote so we can wait and process it here
|
||||||
|
contextConn := cmd.Root().LocalFlags().Lookup("context")
|
||||||
|
conn := cmd.Root().LocalFlags().Lookup("connection")
|
||||||
|
if conn != nil && conn.Changed {
|
||||||
|
if contextConn != nil && contextConn.Changed {
|
||||||
|
return fmt.Errorf("use of --connection and --context at the same time is not allowed")
|
||||||
|
}
|
||||||
|
cfg.Engine.ActiveService = conn.Value.String()
|
||||||
|
if err := setupConnection(); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if contextConn != nil && contextConn.Changed {
|
||||||
|
service := contextConn.Value.String()
|
||||||
|
if service != "default" {
|
||||||
|
cfg.Engine.ActiveService = service
|
||||||
|
if err := setupConnection(); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Special case if command is hidden completion command ("__complete","__completeNoDesc")
|
// Special case if command is hidden completion command ("__complete","__completeNoDesc")
|
||||||
|
@ -232,10 +251,6 @@ func persistentPreRunE(cmd *cobra.Command, args []string) error {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
context := cmd.Root().LocalFlags().Lookup("context")
|
|
||||||
if context.Value.String() != "default" {
|
|
||||||
return errors.New("podman does not support swarm, the only --context value allowed is \"default\"")
|
|
||||||
}
|
|
||||||
if !registry.IsRemote() {
|
if !registry.IsRemote() {
|
||||||
if cmd.Flag("cpu-profile").Changed {
|
if cmd.Flag("cpu-profile").Changed {
|
||||||
f, err := os.Create(cfg.CPUProfile)
|
f, err := os.Create(cfg.CPUProfile)
|
||||||
|
@ -362,7 +377,7 @@ func rootFlags(cmd *cobra.Command, opts *entities.PodmanConfig) {
|
||||||
_ = cmd.RegisterFlagCompletionFunc(sshFlagName, common.AutocompleteSSH)
|
_ = cmd.RegisterFlagCompletionFunc(sshFlagName, common.AutocompleteSSH)
|
||||||
|
|
||||||
connectionFlagName := "connection"
|
connectionFlagName := "connection"
|
||||||
lFlags.StringVarP(&opts.Engine.ActiveService, connectionFlagName, "c", srv, "Connection to use for remote Podman service")
|
lFlags.StringP(connectionFlagName, "c", srv, "Connection to use for remote Podman service")
|
||||||
_ = cmd.RegisterFlagCompletionFunc(connectionFlagName, common.AutocompleteSystemConnections)
|
_ = cmd.RegisterFlagCompletionFunc(connectionFlagName, common.AutocompleteSystemConnections)
|
||||||
|
|
||||||
urlFlagName := "url"
|
urlFlagName := "url"
|
||||||
|
|
|
@ -6,6 +6,7 @@ import (
|
||||||
"net/url"
|
"net/url"
|
||||||
"os"
|
"os"
|
||||||
"regexp"
|
"regexp"
|
||||||
|
"strings"
|
||||||
|
|
||||||
"github.com/containers/common/pkg/completion"
|
"github.com/containers/common/pkg/completion"
|
||||||
"github.com/containers/common/pkg/config"
|
"github.com/containers/common/pkg/config"
|
||||||
|
@ -37,6 +38,17 @@ var (
|
||||||
`,
|
`,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
createCmd = &cobra.Command{
|
||||||
|
Use: "create [options] NAME DESTINATION",
|
||||||
|
Args: cobra.ExactArgs(1),
|
||||||
|
Short: addCmd.Short,
|
||||||
|
Long: addCmd.Long,
|
||||||
|
RunE: create,
|
||||||
|
ValidArgsFunction: completion.AutocompleteNone,
|
||||||
|
}
|
||||||
|
|
||||||
|
dockerPath string
|
||||||
|
|
||||||
cOpts = struct {
|
cOpts = struct {
|
||||||
Identity string
|
Identity string
|
||||||
Port int
|
Port int
|
||||||
|
@ -50,7 +62,6 @@ func init() {
|
||||||
Command: addCmd,
|
Command: addCmd,
|
||||||
Parent: system.ConnectionCmd,
|
Parent: system.ConnectionCmd,
|
||||||
})
|
})
|
||||||
|
|
||||||
flags := addCmd.Flags()
|
flags := addCmd.Flags()
|
||||||
|
|
||||||
portFlagName := "port"
|
portFlagName := "port"
|
||||||
|
@ -66,6 +77,21 @@ func init() {
|
||||||
_ = addCmd.RegisterFlagCompletionFunc(socketPathFlagName, completion.AutocompleteDefault)
|
_ = addCmd.RegisterFlagCompletionFunc(socketPathFlagName, completion.AutocompleteDefault)
|
||||||
|
|
||||||
flags.BoolVarP(&cOpts.Default, "default", "d", false, "Set connection to be default")
|
flags.BoolVarP(&cOpts.Default, "default", "d", false, "Set connection to be default")
|
||||||
|
|
||||||
|
registry.Commands = append(registry.Commands, registry.CliCommand{
|
||||||
|
Command: createCmd,
|
||||||
|
Parent: system.ContextCmd,
|
||||||
|
})
|
||||||
|
|
||||||
|
flags = createCmd.Flags()
|
||||||
|
dockerFlagName := "docker"
|
||||||
|
flags.StringVar(&dockerPath, dockerFlagName, "", "Description of the context")
|
||||||
|
|
||||||
|
_ = createCmd.RegisterFlagCompletionFunc(dockerFlagName, completion.AutocompleteNone)
|
||||||
|
flags.String("description", "", "Ignored. Just for script compatibility")
|
||||||
|
flags.String("from", "", "Ignored. Just for script compatibility")
|
||||||
|
flags.String("kubernetes", "", "Ignored. Just for script compatibility")
|
||||||
|
flags.String("default-stack-orchestrator", "", "Ignored. Just for script compatibility")
|
||||||
}
|
}
|
||||||
|
|
||||||
func add(cmd *cobra.Command, args []string) error {
|
func add(cmd *cobra.Command, args []string) error {
|
||||||
|
@ -171,3 +197,59 @@ func add(cmd *cobra.Command, args []string) error {
|
||||||
}
|
}
|
||||||
return cfg.Write()
|
return cfg.Write()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func create(cmd *cobra.Command, args []string) error {
|
||||||
|
dest, err := translateDest(dockerPath)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if match, err := regexp.Match("^[A-Za-z][A-Za-z0-9+.-]*://", []byte(dest)); err != nil {
|
||||||
|
return fmt.Errorf("invalid destination: %w", err)
|
||||||
|
} else if !match {
|
||||||
|
dest = "ssh://" + dest
|
||||||
|
}
|
||||||
|
|
||||||
|
uri, err := url.Parse(dest)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
cfg, err := config.ReadCustomConfig()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
dst := config.Destination{
|
||||||
|
URI: uri.String(),
|
||||||
|
}
|
||||||
|
|
||||||
|
if cfg.Engine.ServiceDestinations == nil {
|
||||||
|
cfg.Engine.ServiceDestinations = map[string]config.Destination{
|
||||||
|
args[0]: dst,
|
||||||
|
}
|
||||||
|
cfg.Engine.ActiveService = args[0]
|
||||||
|
} else {
|
||||||
|
cfg.Engine.ServiceDestinations[args[0]] = dst
|
||||||
|
}
|
||||||
|
return cfg.Write()
|
||||||
|
}
|
||||||
|
|
||||||
|
func translateDest(path string) (string, error) {
|
||||||
|
if path == "" {
|
||||||
|
return "", nil
|
||||||
|
}
|
||||||
|
split := strings.SplitN(path, "=", 2)
|
||||||
|
if len(split) == 1 {
|
||||||
|
return split[0], nil
|
||||||
|
}
|
||||||
|
if split[0] != "host" {
|
||||||
|
return "", fmt.Errorf("\"host\" is requited for --docker option")
|
||||||
|
}
|
||||||
|
// "host=tcp://myserver:2376,ca=~/ca-file,cert=~/cert-file,key=~/key-file"
|
||||||
|
vals := strings.Split(split[1], ",")
|
||||||
|
if len(vals) > 1 {
|
||||||
|
return "", fmt.Errorf("--docker additional options %q not supported", strings.Join(vals[1:], ","))
|
||||||
|
}
|
||||||
|
// for now we ignore other fields specified on command line
|
||||||
|
return vals[0], nil
|
||||||
|
}
|
||||||
|
|
|
@ -21,9 +21,23 @@ var (
|
||||||
RunE: defaultRunE,
|
RunE: defaultRunE,
|
||||||
Example: `podman system connection default testing`,
|
Example: `podman system connection default testing`,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
useCmd = &cobra.Command{
|
||||||
|
Use: "use NAME",
|
||||||
|
Args: cobra.ExactArgs(1),
|
||||||
|
Short: dfltCmd.Short,
|
||||||
|
Long: dfltCmd.Long,
|
||||||
|
ValidArgsFunction: dfltCmd.ValidArgsFunction,
|
||||||
|
RunE: dfltCmd.RunE,
|
||||||
|
Example: `podman context use testing`,
|
||||||
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
|
registry.Commands = append(registry.Commands, registry.CliCommand{
|
||||||
|
Command: useCmd,
|
||||||
|
Parent: system.ContextCmd,
|
||||||
|
})
|
||||||
registry.Commands = append(registry.Commands, registry.CliCommand{
|
registry.Commands = append(registry.Commands, registry.CliCommand{
|
||||||
Command: dfltCmd,
|
Command: dfltCmd,
|
||||||
Parent: system.ConnectionCmd,
|
Parent: system.ConnectionCmd,
|
||||||
|
|
|
@ -8,6 +8,7 @@ import (
|
||||||
"github.com/containers/common/pkg/completion"
|
"github.com/containers/common/pkg/completion"
|
||||||
"github.com/containers/common/pkg/config"
|
"github.com/containers/common/pkg/config"
|
||||||
"github.com/containers/common/pkg/report"
|
"github.com/containers/common/pkg/report"
|
||||||
|
"github.com/containers/common/pkg/util"
|
||||||
"github.com/containers/podman/v4/cmd/podman/common"
|
"github.com/containers/podman/v4/cmd/podman/common"
|
||||||
"github.com/containers/podman/v4/cmd/podman/registry"
|
"github.com/containers/podman/v4/cmd/podman/registry"
|
||||||
"github.com/containers/podman/v4/cmd/podman/system"
|
"github.com/containers/podman/v4/cmd/podman/system"
|
||||||
|
@ -29,16 +30,36 @@ var (
|
||||||
RunE: list,
|
RunE: list,
|
||||||
TraverseChildren: false,
|
TraverseChildren: false,
|
||||||
}
|
}
|
||||||
|
inspectCmd = &cobra.Command{
|
||||||
|
Use: "inspect [options] [CONTEXT] [CONTEXT...]",
|
||||||
|
Short: "Inspect destination for a Podman service(s)",
|
||||||
|
ValidArgsFunction: completion.AutocompleteNone,
|
||||||
|
RunE: inspect,
|
||||||
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
|
initFlags := func(cmd *cobra.Command) {
|
||||||
|
cmd.Flags().StringP("format", "f", "", "Custom Go template for printing connections")
|
||||||
|
_ = cmd.RegisterFlagCompletionFunc("format", common.AutocompleteFormat(&namedDestination{}))
|
||||||
|
cmd.Flags().BoolP("quiet", "q", false, "Custom Go template for printing connections")
|
||||||
|
}
|
||||||
|
|
||||||
|
registry.Commands = append(registry.Commands, registry.CliCommand{
|
||||||
|
Command: listCmd,
|
||||||
|
Parent: system.ContextCmd,
|
||||||
|
})
|
||||||
registry.Commands = append(registry.Commands, registry.CliCommand{
|
registry.Commands = append(registry.Commands, registry.CliCommand{
|
||||||
Command: listCmd,
|
Command: listCmd,
|
||||||
Parent: system.ConnectionCmd,
|
Parent: system.ConnectionCmd,
|
||||||
})
|
})
|
||||||
|
initFlags(listCmd)
|
||||||
|
|
||||||
listCmd.Flags().String("format", "", "Custom Go template for printing connections")
|
registry.Commands = append(registry.Commands, registry.CliCommand{
|
||||||
_ = listCmd.RegisterFlagCompletionFunc("format", common.AutocompleteFormat(&namedDestination{}))
|
Command: inspectCmd,
|
||||||
|
Parent: system.ContextCmd,
|
||||||
|
})
|
||||||
|
initFlags(inspectCmd)
|
||||||
}
|
}
|
||||||
|
|
||||||
type namedDestination struct {
|
type namedDestination struct {
|
||||||
|
@ -48,13 +69,34 @@ type namedDestination struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
func list(cmd *cobra.Command, _ []string) error {
|
func list(cmd *cobra.Command, _ []string) error {
|
||||||
|
return inspect(cmd, nil)
|
||||||
|
}
|
||||||
|
|
||||||
|
func inspect(cmd *cobra.Command, args []string) error {
|
||||||
cfg, err := config.ReadCustomConfig()
|
cfg, err := config.ReadCustomConfig()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
format := cmd.Flag("format").Value.String()
|
||||||
|
if format == "" && args != nil {
|
||||||
|
format = "json"
|
||||||
|
}
|
||||||
|
|
||||||
|
quiet, err := cmd.Flags().GetBool("quiet")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
rows := make([]namedDestination, 0)
|
rows := make([]namedDestination, 0)
|
||||||
for k, v := range cfg.Engine.ServiceDestinations {
|
for k, v := range cfg.Engine.ServiceDestinations {
|
||||||
|
if args != nil && !util.StringInSlice(k, args) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
if quiet {
|
||||||
|
fmt.Println(k)
|
||||||
|
continue
|
||||||
|
}
|
||||||
def := false
|
def := false
|
||||||
if k == cfg.Engine.ActiveService {
|
if k == cfg.Engine.ActiveService {
|
||||||
def = true
|
def = true
|
||||||
|
@ -71,6 +113,10 @@ func list(cmd *cobra.Command, _ []string) error {
|
||||||
rows = append(rows, r)
|
rows = append(rows, r)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if quiet {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
sort.Slice(rows, func(i, j int) bool {
|
sort.Slice(rows, func(i, j int) bool {
|
||||||
return rows[i].Name < rows[j].Name
|
return rows[i].Name < rows[j].Name
|
||||||
})
|
})
|
||||||
|
@ -78,7 +124,7 @@ func list(cmd *cobra.Command, _ []string) error {
|
||||||
rpt := report.New(os.Stdout, cmd.Name())
|
rpt := report.New(os.Stdout, cmd.Name())
|
||||||
defer rpt.Flush()
|
defer rpt.Flush()
|
||||||
|
|
||||||
if report.IsJSON(cmd.Flag("format").Value.String()) {
|
if report.IsJSON(format) {
|
||||||
buf, err := registry.JSONLibrary().MarshalIndent(rows, "", " ")
|
buf, err := registry.JSONLibrary().MarshalIndent(rows, "", " ")
|
||||||
if err == nil {
|
if err == nil {
|
||||||
fmt.Println(string(buf))
|
fmt.Println(string(buf))
|
||||||
|
@ -86,8 +132,8 @@ func list(cmd *cobra.Command, _ []string) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
if cmd.Flag("format").Changed {
|
if format != "" {
|
||||||
rpt, err = rpt.Parse(report.OriginUser, cmd.Flag("format").Value.String())
|
rpt, err = rpt.Parse(report.OriginUser, format)
|
||||||
} else {
|
} else {
|
||||||
rpt, err = rpt.Parse(report.OriginPodman,
|
rpt, err = rpt.Parse(report.OriginPodman,
|
||||||
"{{range .}}{{.Name}}\t{{.URI}}\t{{.Identity}}\t{{.Default}}\n{{end -}}")
|
"{{range .}}{{.Name}}\t{{.URI}}\t{{.Identity}}\t{{.Default}}\n{{end -}}")
|
||||||
|
|
|
@ -29,6 +29,11 @@ var (
|
||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
|
registry.Commands = append(registry.Commands, registry.CliCommand{
|
||||||
|
Command: rmCmd,
|
||||||
|
Parent: system.ContextCmd,
|
||||||
|
})
|
||||||
|
|
||||||
registry.Commands = append(registry.Commands, registry.CliCommand{
|
registry.Commands = append(registry.Commands, registry.CliCommand{
|
||||||
Command: rmCmd,
|
Command: rmCmd,
|
||||||
Parent: system.ConnectionCmd,
|
Parent: system.ConnectionCmd,
|
||||||
|
@ -36,6 +41,9 @@ func init() {
|
||||||
|
|
||||||
flags := rmCmd.Flags()
|
flags := rmCmd.Flags()
|
||||||
flags.BoolVarP(&rmOpts.All, "all", "a", false, "Remove all connections")
|
flags.BoolVarP(&rmOpts.All, "all", "a", false, "Remove all connections")
|
||||||
|
|
||||||
|
flags.BoolP("force", "f", false, "Ignored: for Docker compatibility")
|
||||||
|
_ = flags.MarkHidden("force")
|
||||||
}
|
}
|
||||||
|
|
||||||
func rm(cmd *cobra.Command, args []string) error {
|
func rm(cmd *cobra.Command, args []string) error {
|
||||||
|
|
|
@ -0,0 +1,28 @@
|
||||||
|
package system
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/containers/podman/v4/cmd/podman/registry"
|
||||||
|
"github.com/containers/podman/v4/cmd/podman/validate"
|
||||||
|
"github.com/spf13/cobra"
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
// ContextCmd skips creating engines (PersistentPreRunE/PersistentPostRunE are No-Op's) since
|
||||||
|
// sub-commands will obtain connection information to said engines
|
||||||
|
ContextCmd = &cobra.Command{
|
||||||
|
Use: "context",
|
||||||
|
Short: "Manage remote API service destinations",
|
||||||
|
Long: `Manage remote API service destination information in podman configuration`,
|
||||||
|
PersistentPreRunE: validate.NoOp,
|
||||||
|
RunE: validate.SubCommandExists,
|
||||||
|
PersistentPostRunE: validate.NoOp,
|
||||||
|
Hidden: true,
|
||||||
|
TraverseChildren: false,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
registry.Commands = append(registry.Commands, registry.CliCommand{
|
||||||
|
Command: ContextCmd,
|
||||||
|
})
|
||||||
|
}
|
|
@ -13,7 +13,7 @@ List ssh destination(s) for podman service(s).
|
||||||
|
|
||||||
## OPTIONS
|
## OPTIONS
|
||||||
|
|
||||||
#### **--format**=*format*
|
#### **--format**, **-f**=*format*
|
||||||
|
|
||||||
Change the default output format. This can be of a supported type like 'json' or a Go template.
|
Change the default output format. This can be of a supported type like 'json' or a Go template.
|
||||||
Valid placeholders for the Go template listed below:
|
Valid placeholders for the Go template listed below:
|
||||||
|
@ -25,6 +25,10 @@ Valid placeholders for the Go template listed below:
|
||||||
| .URI | URI to podman service. Valid schemes are ssh://[user@]*host*[:port]*Unix domain socket*[?secure=True], unix://*Unix domain socket*, and tcp://localhost[:*port*] |
|
| .URI | URI to podman service. Valid schemes are ssh://[user@]*host*[:port]*Unix domain socket*[?secure=True], unix://*Unix domain socket*, and tcp://localhost[:*port*] |
|
||||||
| .Default | Indicates whether connection is the default |
|
| .Default | Indicates whether connection is the default |
|
||||||
|
|
||||||
|
#### **--quiet**, **-q**
|
||||||
|
|
||||||
|
Only show connection names
|
||||||
|
|
||||||
## EXAMPLE
|
## EXAMPLE
|
||||||
```
|
```
|
||||||
$ podman system connection list
|
$ podman system connection list
|
||||||
|
|
|
@ -235,6 +235,7 @@ can_use_shortcut ()
|
||||||
|
|
||||||
if (strcmp (argv[argc], "mount") == 0
|
if (strcmp (argv[argc], "mount") == 0
|
||||||
|| strcmp (argv[argc], "machine") == 0
|
|| strcmp (argv[argc], "machine") == 0
|
||||||
|
|| strcmp (argv[argc], "context") == 0
|
||||||
|| strcmp (argv[argc], "search") == 0
|
|| strcmp (argv[argc], "search") == 0
|
||||||
|| (strcmp (argv[argc], "system") == 0 && argv[argc+1] && strcmp (argv[argc+1], "service") != 0))
|
|| (strcmp (argv[argc], "system") == 0 && argv[argc+1] && strcmp (argv[argc+1], "service") != 0))
|
||||||
{
|
{
|
||||||
|
|
|
@ -56,14 +56,17 @@ function setup() {
|
||||||
|
|
||||||
|
|
||||||
@test "podman --context emits reasonable output" {
|
@test "podman --context emits reasonable output" {
|
||||||
|
if ! is_remote; then
|
||||||
|
skip "only applicable on podman-remote"
|
||||||
|
fi
|
||||||
# All we care about here is that the command passes
|
# All we care about here is that the command passes
|
||||||
run_podman --context=default version
|
run_podman --context=default version
|
||||||
|
|
||||||
# This one must fail
|
# This one must fail
|
||||||
run_podman 125 --context=swarm version
|
run_podman 125 --context=swarm version
|
||||||
is "$output" \
|
is "$output" \
|
||||||
"Error: podman does not support swarm, the only --context value allowed is \"default\"" \
|
"Error: failed to resolve active destination: \"swarm\" service destination not found" \
|
||||||
"--context=default or fail"
|
"--context=swarm should fail"
|
||||||
}
|
}
|
||||||
|
|
||||||
@test "podman can pull an image" {
|
@test "podman can pull an image" {
|
||||||
|
|
|
@ -56,8 +56,22 @@ function _run_podman_remote() {
|
||||||
c1="c1_$(random_string 15)"
|
c1="c1_$(random_string 15)"
|
||||||
c2="c2_$(random_string 15)"
|
c2="c2_$(random_string 15)"
|
||||||
|
|
||||||
run_podman system connection add $c1 tcp://localhost:12345
|
run_podman system connection add $c1 tcp://localhost:12345
|
||||||
run_podman system connection add --default $c2 tcp://localhost:54321
|
run_podman context create --docker "host=tcp://localhost:54321" $c2
|
||||||
|
run_podman system connection ls
|
||||||
|
is "$output" \
|
||||||
|
".*$c1[ ]\+tcp://localhost:12345[ ]\+true
|
||||||
|
$c2[ ]\+tcp://localhost:54321[ ]\+false" \
|
||||||
|
"system connection ls"
|
||||||
|
run_podman system connection ls -q
|
||||||
|
is "$(echo $(sort <<<$output))" \
|
||||||
|
"$c1 $c2" \
|
||||||
|
"system connection ls -q should show two names"
|
||||||
|
run_podman context ls -q
|
||||||
|
is "$(echo $(sort <<<$output))" \
|
||||||
|
"$c1 $c2" \
|
||||||
|
"context ls -q should show two names"
|
||||||
|
run_podman context use $c2
|
||||||
run_podman system connection ls
|
run_podman system connection ls
|
||||||
is "$output" \
|
is "$output" \
|
||||||
".*$c1[ ]\+tcp://localhost:12345[ ]\+false
|
".*$c1[ ]\+tcp://localhost:12345[ ]\+false
|
||||||
|
@ -66,11 +80,11 @@ $c2[ ]\+tcp://localhost:54321[ ]\+true" \
|
||||||
|
|
||||||
# Remove default connection; the remaining one should still not be default
|
# Remove default connection; the remaining one should still not be default
|
||||||
run_podman system connection rm $c2
|
run_podman system connection rm $c2
|
||||||
run_podman system connection ls
|
run_podman context ls
|
||||||
is "$output" ".*$c1[ ]\+tcp://localhost:12345[ ]\+false" \
|
is "$output" ".*$c1[ ]\+tcp://localhost:12345[ ]\+false" \
|
||||||
"system connection ls (after removing default connection)"
|
"system connection ls (after removing default connection)"
|
||||||
|
|
||||||
run_podman system connection rm $c1
|
run_podman context rm $c1
|
||||||
}
|
}
|
||||||
|
|
||||||
# Test tcp socket; requires starting a local server
|
# Test tcp socket; requires starting a local server
|
||||||
|
|
Loading…
Reference in New Issue