Add shell completion with cobra

Allow automatic generation for shell completion scripts
with the internal cobra functions (requires v1.0.0+).

This should replace the handwritten completion scripts
and even adds support for fish. With this approach it is
less likley that completions and code are out of sync.

We can now create the scripts with
- podman completion bash
- podman completion zsh
- podman completion fish

To test the completion run:
source <(podman completion bash)

The same works for podman-remote and podman --remote and
it will complete your remote containers/images with
the correct endpoints values from --url/--connection.

The completion logic is written in go and provided by the
cobra library. The completion functions lives in
`cmd/podman/completion/completion.go`.

The unit test at cmd/podman/shell_completion_test.go checks
if each command and flag has an autocompletion function set.
This prevents that commands and flags have no shell completion set.

This commit does not replace the current autocompletion scripts.

Closes #6440

Signed-off-by: Paul Holzinger <paul.holzinger@web.de>
This commit is contained in:
Paul Holzinger 2020-05-31 17:35:59 +02:00
parent df4bf5c584
commit b5d1d89a37
124 changed files with 3082 additions and 970 deletions

View File

@ -4,6 +4,7 @@ import (
"fmt" "fmt"
"github.com/containers/common/pkg/auth" "github.com/containers/common/pkg/auth"
"github.com/containers/common/pkg/completion"
"github.com/containers/podman/v2/cmd/podman/registry" "github.com/containers/podman/v2/cmd/podman/registry"
"github.com/containers/podman/v2/pkg/domain/entities" "github.com/containers/podman/v2/pkg/domain/entities"
"github.com/containers/podman/v2/pkg/errorhandling" "github.com/containers/podman/v2/pkg/errorhandling"
@ -24,6 +25,7 @@ var (
Short: "Auto update containers according to their auto-update policy", Short: "Auto update containers according to their auto-update policy",
Long: autoUpdateDescription, Long: autoUpdateDescription,
RunE: autoUpdate, RunE: autoUpdate,
ValidArgsFunction: completion.AutocompleteNone,
Example: `podman auto-update Example: `podman auto-update
podman auto-update --authfile ~/authfile.json`, podman auto-update --authfile ~/authfile.json`,
} }
@ -36,7 +38,10 @@ func init() {
}) })
flags := autoUpdateCommand.Flags() flags := autoUpdateCommand.Flags()
flags.StringVar(&autoUpdateOptions.Authfile, "authfile", auth.GetDefaultAuthFile(), "Path to the authentication file. Use REGISTRY_AUTH_FILE environment variable to override")
authfileFlagName := "authfile"
flags.StringVar(&autoUpdateOptions.Authfile, authfileFlagName, auth.GetDefaultAuthFile(), "Path to the authentication file. Use REGISTRY_AUTH_FILE environment variable to override")
_ = autoUpdateCommand.RegisterFlagCompletionFunc(authfileFlagName, completion.AutocompleteDefault)
} }
func autoUpdate(cmd *cobra.Command, args []string) error { func autoUpdate(cmd *cobra.Command, args []string) error {

View File

@ -0,0 +1,638 @@
package common
import (
"bufio"
"os"
"strings"
"github.com/containers/common/pkg/config"
"github.com/containers/podman/v2/cmd/podman/registry"
"github.com/containers/podman/v2/libpod"
"github.com/containers/podman/v2/libpod/define"
"github.com/containers/podman/v2/pkg/domain/entities"
"github.com/containers/podman/v2/pkg/registries"
systemdGen "github.com/containers/podman/v2/pkg/systemd/generate"
"github.com/spf13/cobra"
)
var (
// ChangeCmds is the list of valid Change commands to passed to the Commit call
ChangeCmds = []string{"CMD", "ENTRYPOINT", "ENV", "EXPOSE", "LABEL", "ONBUILD", "STOPSIGNAL", "USER", "VOLUME", "WORKDIR"}
// LogLevels supported by podman
LogLevels = []string{"debug", "info", "warn", "error", "fatal", "panic"}
)
func getContainers(status string, toComplete string) ([]string, cobra.ShellCompDirective) {
suggestions := []string{}
listOpts := entities.ContainerListOptions{
Filters: make(map[string][]string),
}
listOpts.All = true
if status != "all" {
listOpts.Filters = map[string][]string{"status": {status}}
}
containers, err := registry.ContainerEngine().ContainerList(registry.GetContext(), listOpts)
if err != nil {
cobra.CompErrorln(err.Error())
return nil, cobra.ShellCompDirectiveError
}
for _, container := range containers {
// include ids in suggestions if more then 2 chars are typed
if len(toComplete) > 1 {
suggestions = append(suggestions, container.ID[0:12])
}
// include name in suggestions
suggestions = append(suggestions, container.Names...)
}
return suggestions, cobra.ShellCompDirectiveNoFileComp
}
func getPods(status string, toComplete string) ([]string, cobra.ShellCompDirective) {
suggestions := []string{}
listOpts := entities.PodPSOptions{
Filters: make(map[string][]string),
}
if status != "all" {
listOpts.Filters = map[string][]string{"status": {status}}
}
pods, err := registry.ContainerEngine().PodPs(registry.GetContext(), listOpts)
if err != nil {
cobra.CompErrorln(err.Error())
return nil, cobra.ShellCompDirectiveError
}
for _, pod := range pods {
// include ids in suggestions if more then 2 chars are typed
if len(toComplete) > 1 {
suggestions = append(suggestions, pod.Id[0:12])
}
// include name in suggestions
suggestions = append(suggestions, pod.Name)
}
return suggestions, cobra.ShellCompDirectiveNoFileComp
}
func getVolumes() ([]string, cobra.ShellCompDirective) {
suggestions := []string{}
lsOpts := entities.VolumeListOptions{}
volumes, err := registry.ContainerEngine().VolumeList(registry.GetContext(), lsOpts)
if err != nil {
cobra.CompErrorln(err.Error())
return nil, cobra.ShellCompDirectiveError
}
for _, volume := range volumes {
suggestions = append(suggestions, volume.Name)
}
return suggestions, cobra.ShellCompDirectiveNoFileComp
}
func getImages(toComplete string) ([]string, cobra.ShellCompDirective) {
suggestions := []string{}
listOptions := entities.ImageListOptions{}
images, err := registry.ImageEngine().List(registry.GetContext(), listOptions)
if err != nil {
cobra.CompErrorln(err.Error())
return nil, cobra.ShellCompDirectiveError
}
for _, image := range images {
// FIXME: need ux testing
// discuss when image ids should be completed
// include ids in suggestions if more then 2 chars are typed
if len(toComplete) > 1 {
suggestions = append(suggestions, image.ID[0:12])
}
for _, repo := range image.RepoTags {
if toComplete == "" {
// suggest only full repo path if no input is given
suggestions = append(suggestions, repo)
} else {
// suggested "registry.fedoraproject.org/f29/httpd:latest" as
// - "registry.fedoraproject.org/f29/httpd:latest"
// - "registry.fedoraproject.org/f29/httpd"
// - "f29/httpd:latest"
// - "f29/httpd"
// - "httpd:latest"
// - "httpd"
paths := strings.Split(repo, "/")
for i := range paths {
suggestionWithTag := strings.Join(paths[i:], "/")
suggestionWithoutTag := strings.SplitN(strings.SplitN(suggestionWithTag, ":", 2)[0], "@", 2)[0]
suggestions = append(suggestions, suggestionWithTag, suggestionWithoutTag)
}
}
}
}
return suggestions, cobra.ShellCompDirectiveNoFileComp
}
func getRegistries() ([]string, cobra.ShellCompDirective) {
regs, err := registries.GetRegistries()
if err != nil {
cobra.CompErrorln(err.Error())
return nil, cobra.ShellCompDirectiveError
}
return regs, cobra.ShellCompDirectiveNoFileComp
}
func getNetworks() ([]string, cobra.ShellCompDirective) {
suggestions := []string{}
networkListOptions := entities.NetworkListOptions{}
networks, err := registry.ContainerEngine().NetworkList(registry.Context(), networkListOptions)
if err != nil {
cobra.CompErrorln(err.Error())
return nil, cobra.ShellCompDirectiveError
}
for _, network := range networks {
suggestions = append(suggestions, network.Name)
}
return suggestions, cobra.ShellCompDirectiveNoFileComp
}
/* Autocomplete Functions for cobra ValidArgsFunction */
// AutocompleteContainers - Autocomplete all container names.
func AutocompleteContainers(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) {
return getContainers("all", toComplete)
}
// AutocompleteContainersCreated - Autocomplete only created container names.
func AutocompleteContainersCreated(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) {
return getContainers("created", toComplete)
}
// AutocompleteContainersExited - Autocomplete only exited container names.
func AutocompleteContainersExited(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) {
return getContainers("exited", toComplete)
}
// AutocompleteContainersPaused - Autocomplete only paused container names.
func AutocompleteContainersPaused(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) {
return getContainers("paused", toComplete)
}
// AutocompleteContainersRunning - Autocomplete only running container names.
func AutocompleteContainersRunning(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) {
return getContainers("running", toComplete)
}
// AutocompleteContainersStartable - Autocomplete only created and exited container names.
func AutocompleteContainersStartable(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) {
containersCreated, _ := getContainers("created", toComplete)
containersExited, _ := getContainers("exited", toComplete)
return append(containersCreated, containersExited...), cobra.ShellCompDirectiveNoFileComp
}
// AutocompletePods - Autocomplete all pod names.
func AutocompletePods(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) {
return getPods("all", toComplete)
}
// AutocompletePodsRunning - Autocomplete only running pod names.
func AutocompletePodsRunning(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) {
return getPods("running", toComplete)
}
// AutocompleteContainersAndPods - Autocomplete container names and pod names.
func AutocompleteContainersAndPods(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) {
containers, _ := getContainers("all", toComplete)
pods, _ := getPods("all", toComplete)
return append(containers, pods...), cobra.ShellCompDirectiveNoFileComp
}
// AutocompleteContainersAndImages - Autocomplete container names and pod names.
func AutocompleteContainersAndImages(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) {
containers, _ := getContainers("all", toComplete)
images, _ := getImages(toComplete)
return append(containers, images...), cobra.ShellCompDirectiveNoFileComp
}
// AutocompleteVolumes - Autocomplete volumes.
func AutocompleteVolumes(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) {
return getVolumes()
}
// AutocompleteImages - Autocomplete images.
func AutocompleteImages(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) {
return getImages(toComplete)
}
// AutocompleteCreateRun - Autocomplete only the fist argument as image and then do file completion.
func AutocompleteCreateRun(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) {
if len(args) < 1 {
return getImages(toComplete)
}
// TODO: add path completion for files in the image
return nil, cobra.ShellCompDirectiveDefault
}
// AutocompleteRegistries - Autocomplete registries.
func AutocompleteRegistries(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) {
return getRegistries()
}
// AutocompleteNetworks - Autocomplete networks.
func AutocompleteNetworks(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) {
return getNetworks()
}
// AutocompleteCpCommand - Autocomplete podman cp command args.
func AutocompleteCpCommand(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) {
if len(args) < 2 {
containers, _ := getContainers("all", toComplete)
for _, container := range containers {
// TODO: Add path completion for inside the container if possible
if strings.HasPrefix(container, toComplete) {
return containers, cobra.ShellCompDirectiveNoSpace
}
}
// else complete paths
return nil, cobra.ShellCompDirectiveDefault
}
// don't complete more than 2 args
return nil, cobra.ShellCompDirectiveNoFileComp
}
// AutocompleteSystemConnections - Autocomplete system connections.
func AutocompleteSystemConnections(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) {
suggestions := []string{}
cfg, err := config.ReadCustomConfig()
if err != nil {
cobra.CompErrorln(err.Error())
return nil, cobra.ShellCompDirectiveError
}
for k, v := range cfg.Engine.ServiceDestinations {
// the URI will be show as description in shells like zsh
suggestions = append(suggestions, k+"\t"+v.URI)
}
return suggestions, cobra.ShellCompDirectiveNoFileComp
}
/* -------------- Flags ----------------- */
// AutocompleteDetachKeys - Autocomplete detach-keys options.
// -> "ctrl-"
func AutocompleteDetachKeys(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) {
if strings.HasSuffix(toComplete, ",") {
return []string{toComplete + "ctrl-"}, cobra.ShellCompDirectiveNoSpace
}
return []string{"ctrl-"}, cobra.ShellCompDirectiveNoSpace
}
// AutocompleteChangeInstructions - Autocomplete change instructions options for commit and import.
// -> "CMD", "ENTRYPOINT", "ENV", "EXPOSE", "LABEL", "ONBUILD", "STOPSIGNAL", "USER", "VOLUME", "WORKDIR"
func AutocompleteChangeInstructions(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) {
return ChangeCmds, cobra.ShellCompDirectiveNoSpace
}
// AutocompleteImageFormat - Autocomplete image format options.
// -> "oci", "docker"
func AutocompleteImageFormat(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) {
ImageFormat := []string{"oci", "docker"}
return ImageFormat, cobra.ShellCompDirectiveNoFileComp
}
// AutocompleteCreateAttach - Autocomplete create --attach options.
// -> "stdin", "stdout", "stderr"
func AutocompleteCreateAttach(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) {
return []string{"stdin", "stdout", "stderr"}, cobra.ShellCompDirectiveNoFileComp
}
// AutocompleteNamespace - Autocomplete namespace options.
// -> host,container:[name],ns:[path],private
func AutocompleteNamespace(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) {
namespacesOptions := []string{"host", "container:", "ns:", "private"}
switch {
case strings.HasPrefix(toComplete, "container:"):
// Complete containers after colon
containers, _ := getContainers("all", toComplete[10:]) //trim "container:"
// add "container:" in front of the suggestions
var suggestions []string
for _, container := range containers {
suggestions = append(suggestions, "container:"+container)
}
return suggestions, cobra.ShellCompDirectiveNoFileComp
case strings.HasPrefix(toComplete, "ns:"):
// Complete path after colon
return nil, cobra.ShellCompDirectiveDefault
case strings.HasPrefix(toComplete, "c") || strings.HasPrefix(toComplete, "n"):
// don't insert space for container: and ns:
return []string{"container:", "ns:"}, cobra.ShellCompDirectiveNoSpace
}
return namespacesOptions, cobra.ShellCompDirectiveNoFileComp
}
// AutocompleteUserNamespace - Autocomplete namespace options.
// -> same as AutocompleteNamespace with "auto", "keep-id" added
func AutocompleteUserNamespace(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) {
results, directive := AutocompleteNamespace(cmd, args, toComplete)
if directive == cobra.ShellCompDirectiveNoFileComp {
// add the auto and keep-id options
results = append(results, "auto", "keep-id")
}
return results, directive
}
// AutocompleteCgroupMode - Autocomplete cgroup mode options.
// -> "enabled", "disabled", "no-conmon", "split"
func AutocompleteCgroupMode(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) {
cgroupModes := []string{"enabled", "disabled", "no-conmon", "split"}
return cgroupModes, cobra.ShellCompDirectiveNoFileComp
}
// AutocompleteImageVolume - Autocomplete image volume options.
// -> "bind", "tmpfs", "ignore"
func AutocompleteImageVolume(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) {
imageVolumes := []string{"bind", "tmpfs", "ignore"}
return imageVolumes, cobra.ShellCompDirectiveNoFileComp
}
// AutocompleteLogDriver - Autocomplete log-driver options.
// -> "journald", "none", "k8s-file"
func AutocompleteLogDriver(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) {
// don't show json-file
logDrivers := []string{define.JournaldLogging, define.NoLogging, define.KubernetesLogging}
return logDrivers, cobra.ShellCompDirectiveNoFileComp
}
// AutocompleteLogOpt - Autocomplete log-opt options.
// -> "path=", "tag="
func AutocompleteLogOpt(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) {
// FIXME: are these the only one? the man page states these but in the current shell completion they are more options
logOptions := []string{"path=", "tag="}
if strings.HasPrefix(toComplete, "path=") {
return nil, cobra.ShellCompDirectiveDefault
}
return logOptions, cobra.ShellCompDirectiveNoFileComp | cobra.ShellCompDirectiveNoSpace
}
// AutocompletePullOption - Autocomplete pull options for create and run command.
// -> "always", "missing", "never"
func AutocompletePullOption(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) {
pullOptions := []string{"always", "missing", "never"}
return pullOptions, cobra.ShellCompDirectiveNoFileComp
}
// AutocompleteRestartOption - Autocomplete restart options for create and run command.
// -> "always", "no", "on-failure", "unless-stopped"
func AutocompleteRestartOption(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) {
restartOptions := []string{libpod.RestartPolicyAlways, libpod.RestartPolicyNo,
libpod.RestartPolicyOnFailure, libpod.RestartPolicyUnlessStopped}
return restartOptions, cobra.ShellCompDirectiveNoFileComp
}
// AutocompleteSecurityOption - Autocomplete security options options.
func AutocompleteSecurityOption(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) {
SecurityOptions := []string{"apparmor=", "no-new-privileges", "seccomp=", "label="}
switch {
case strings.HasPrefix(toComplete, "apparmor=u"):
// add space after unconfined
return []string{"apparmor=unconfined"}, cobra.ShellCompDirectiveNoFileComp
case strings.HasPrefix(toComplete, "label=d"):
// add space after disable
return []string{"label=disable"}, cobra.ShellCompDirectiveNoFileComp
case strings.HasPrefix(toComplete, "label="):
return []string{"label=user:", "label=role:", "label=type:", "label=level:", "label=filetype:", "label=disable"},
cobra.ShellCompDirectiveNoFileComp | cobra.ShellCompDirectiveNoSpace
case strings.HasPrefix(toComplete, "seccomp="):
// complete files
return nil, cobra.ShellCompDirectiveDefault
case strings.HasPrefix(toComplete, "n"):
// add space if no-new-privileges
return []string{"no-new-privileges"}, cobra.ShellCompDirectiveNoFileComp
}
return SecurityOptions, cobra.ShellCompDirectiveNoFileComp | cobra.ShellCompDirectiveNoSpace
}
// AutocompleteStopSignal - Autocomplete stop signal options.
// -> "SIGHUP", "SIGINT", "SIGKILL", "SIGTERM"
func AutocompleteStopSignal(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) {
// FIXME: add more/different signals?
stopSignals := []string{"SIGHUP", "SIGINT", "SIGKILL", "SIGTERM"}
return stopSignals, cobra.ShellCompDirectiveNoFileComp
}
// AutocompleteSystemdFlag - Autocomplete systemd flag options.
// -> "true", "false", "always"
func AutocompleteSystemdFlag(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) {
systemd := []string{"true", "false", "always"}
return systemd, cobra.ShellCompDirectiveNoFileComp
}
// AutocompleteUserFlag - Autocomplete user flag based on the names and groups (includes ids after first char) in /etc/passwd and /etc/group files.
// -> user:group
func AutocompleteUserFlag(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) {
if strings.Contains(toComplete, ":") {
// It would be nice to read the file in the image
// but at this point we don't know the image.
file, err := os.Open("/etc/group")
if err != nil {
return nil, cobra.ShellCompDirectiveError
}
defer file.Close()
var groups []string
scanner := bufio.NewScanner(file)
user := strings.SplitN(toComplete, ":", 2)[0]
for scanner.Scan() {
entries := strings.SplitN(scanner.Text(), ":", 4)
groups = append(groups, user+":"+entries[0])
// complete ids after at least one char is given
if len(user)+1 < len(toComplete) {
groups = append(groups, user+":"+entries[2])
}
}
if err = scanner.Err(); err != nil {
return nil, cobra.ShellCompDirectiveError
}
return groups, cobra.ShellCompDirectiveNoFileComp
}
// It would be nice to read the file in the image
// but at this point we don't know the image.
file, err := os.Open("/etc/passwd")
if err != nil {
return nil, cobra.ShellCompDirectiveError
}
defer file.Close()
var users []string
scanner := bufio.NewScanner(file)
for scanner.Scan() {
entries := strings.SplitN(scanner.Text(), ":", 7)
users = append(users, entries[0]+":")
// complete ids after at least one char is given
if len(toComplete) > 0 {
users = append(users, entries[2]+":")
}
}
if err = scanner.Err(); err != nil {
return nil, cobra.ShellCompDirectiveError
}
return users, cobra.ShellCompDirectiveNoSpace
}
// AutocompleteMountFlag - Autocomplete mount flag options.
// -> "type=bind,", "type=volume,", "type=tmpfs,"
func AutocompleteMountFlag(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) {
types := []string{"type=bind,", "type=volume,", "type=tmpfs,"}
// TODO: Add support for all different options
return types, cobra.ShellCompDirectiveNoSpace
}
// AutocompleteVolumeFlag - Autocomplete volume flag options.
// -> volumes and paths
func AutocompleteVolumeFlag(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) {
result := []string{}
volumes, _ := getVolumes()
for _, volume := range volumes {
// If we don't filter on "toComplete", zsh and fish will not do file completion
// even if the prefix typed by the user does not match the returned completions
if strings.HasPrefix(volume, toComplete) {
result = append(result, volume)
}
}
directive := cobra.ShellCompDirectiveNoSpace | cobra.ShellCompDirectiveDefault
if strings.Contains(toComplete, ":") {
// add space after second path
directive = cobra.ShellCompDirectiveDefault
}
return result, directive
}
// AutocompleteJSONFormat - Autocomplete format flag option.
// -> "json"
func AutocompleteJSONFormat(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) {
return []string{"json"}, cobra.ShellCompDirectiveNoFileComp
}
// AutocompleteEventFilter - Autocomplete event filter flag options.
// -> "container=", "event=", "image=", "pod=", "volume=", "type="
func AutocompleteEventFilter(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) {
filters := []string{"container=", "event=", "image=", "pod=", "volume=", "type="}
return filters, cobra.ShellCompDirectiveNoSpace
}
// AutocompleteSystemdRestartOptions - Autocomplete systemd restart options.
// -> "no", "on-success", "on-failure", "on-abnormal", "on-watchdog", "on-abort", "always"
func AutocompleteSystemdRestartOptions(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) {
return systemdGen.RestartPolicies, cobra.ShellCompDirectiveNoFileComp
}
// AutocompleteTrustType - Autocomplete trust type options.
// -> "signedBy", "accept", "reject"
func AutocompleteTrustType(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) {
types := []string{"signedBy", "accept", "reject"}
return types, cobra.ShellCompDirectiveNoFileComp
}
// AutocompleteImageSort - Autocomplete images sort options.
// -> "created", "id", "repository", "size", "tag"
func AutocompleteImageSort(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) {
sortBy := []string{"created", "id", "repository", "size", "tag"}
return sortBy, cobra.ShellCompDirectiveNoFileComp
}
// AutocompleteInspectType - Autocomplete inspect type options.
// -> "container", "image", "all"
func AutocompleteInspectType(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) {
types := []string{"container", "image", "all"}
return types, cobra.ShellCompDirectiveNoFileComp
}
// AutocompleteManifestFormat - Autocomplete manifest format options.
// -> "oci", "v2s2"
func AutocompleteManifestFormat(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) {
types := []string{"oci", "v2s2"}
return types, cobra.ShellCompDirectiveNoFileComp
}
// AutocompleteNetworkDriver - Autocomplete network driver option.
// -> "bridge"
func AutocompleteNetworkDriver(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) {
drivers := []string{"bridge"}
return drivers, cobra.ShellCompDirectiveNoFileComp
}
// AutocompletePodShareNamespace - Autocomplete pod create --share flag option.
// -> "ipc", "net", "pid", "user", "uts", "cgroup", "none"
func AutocompletePodShareNamespace(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) {
namespaces := []string{"ipc", "net", "pid", "user", "uts", "cgroup", "none"}
return namespaces, cobra.ShellCompDirectiveNoFileComp
}
// AutocompletePodPsSort - Autocomplete images sort options.
// -> "created", "id", "name", "status", "number"
func AutocompletePodPsSort(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) {
sortBy := []string{"created", "id", "name", "status", "number"}
return sortBy, cobra.ShellCompDirectiveNoFileComp
}
// AutocompletePsSort - Autocomplete images sort options.
// -> "command", "created", "id", "image", "names", "runningfor", "size", "status"
func AutocompletePsSort(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) {
sortBy := []string{"command", "created", "id", "image", "names", "runningfor", "size", "status"}
return sortBy, cobra.ShellCompDirectiveNoFileComp
}
// AutocompleteImageSaveFormat - Autocomplete image save format options.
// -> "oci-archive", "oci-dir", "docker-dir"
func AutocompleteImageSaveFormat(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) {
formats := []string{"oci-archive", "oci-dir", "docker-dir"}
return formats, cobra.ShellCompDirectiveNoFileComp
}
// AutocompleteWaitCondition - Autocomplete wait condition options.
// -> "unknown", "configured", "created", "running", "stopped", "paused", "exited", "removing"
func AutocompleteWaitCondition(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) {
states := []string{"unknown", "configured", "created", "running", "stopped", "paused", "exited", "removing"}
return states, cobra.ShellCompDirectiveNoFileComp
}
// AutocompleteCgroupManager - Autocomplete cgroup manager options.
// -> "cgroupfs", "systemd"
func AutocompleteCgroupManager(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) {
types := []string{"cgroupfs", "systemd"}
return types, cobra.ShellCompDirectiveNoFileComp
}
// AutocompleteEventBackend - Autocomplete event backend options.
// -> "file", "journald", "none"
func AutocompleteEventBackend(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) {
types := []string{"file", "journald", "none"}
return types, cobra.ShellCompDirectiveNoFileComp
}
// AutocompleteLogLevel - Autocomplete log level options.
// -> "debug", "info", "warn", "error", "fatal", "panic"
func AutocompleteLogLevel(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) {
return LogLevels, cobra.ShellCompDirectiveNoFileComp
}
// AutocompleteSDNotify - Autocomplete sdnotify options.
// -> "container", "conmon", "ignore"
func AutocompleteSDNotify(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) {
types := []string{"container", "conmon", "ignore"}
return types, cobra.ShellCompDirectiveNoFileComp
}

View File

@ -5,296 +5,457 @@ import (
"os" "os"
"github.com/containers/common/pkg/auth" "github.com/containers/common/pkg/auth"
"github.com/containers/common/pkg/completion"
"github.com/containers/podman/v2/cmd/podman/registry" "github.com/containers/podman/v2/cmd/podman/registry"
"github.com/containers/podman/v2/libpod/define" "github.com/containers/podman/v2/libpod/define"
"github.com/spf13/pflag" "github.com/spf13/cobra"
) )
const sizeWithUnitFormat = "(format: `<number>[<unit>]`, where unit = b (bytes), k (kilobytes), m (megabytes), or g (gigabytes))" const sizeWithUnitFormat = "(format: `<number>[<unit>]`, where unit = b (bytes), k (kilobytes), m (megabytes), or g (gigabytes))"
var containerConfig = registry.PodmanConfig() var containerConfig = registry.PodmanConfig()
func GetCreateFlags(cf *ContainerCLIOpts) *pflag.FlagSet { func DefineCreateFlags(cmd *cobra.Command, cf *ContainerCLIOpts) {
createFlags := pflag.FlagSet{} createFlags := cmd.Flags()
annotationFlagName := "annotation"
createFlags.StringSliceVar( createFlags.StringSliceVar(
&cf.Annotation, &cf.Annotation,
"annotation", []string{}, annotationFlagName, []string{},
"Add annotations to container (key:value)", "Add annotations to container (key:value)",
) )
_ = cmd.RegisterFlagCompletionFunc(annotationFlagName, completion.AutocompleteNone)
attachFlagName := "attach"
createFlags.StringSliceVarP( createFlags.StringSliceVarP(
&cf.Attach, &cf.Attach,
"attach", "a", []string{}, attachFlagName, "a", []string{},
"Attach to STDIN, STDOUT or STDERR", "Attach to STDIN, STDOUT or STDERR",
) )
_ = cmd.RegisterFlagCompletionFunc(attachFlagName, AutocompleteCreateAttach)
authfileFlagName := "authfile"
createFlags.StringVar( createFlags.StringVar(
&cf.Authfile, &cf.Authfile,
"authfile", auth.GetDefaultAuthFile(), authfileFlagName, auth.GetDefaultAuthFile(),
"Path of the authentication file. Use REGISTRY_AUTH_FILE environment variable to override", "Path of the authentication file. Use REGISTRY_AUTH_FILE environment variable to override",
) )
_ = cmd.RegisterFlagCompletionFunc(authfileFlagName, completion.AutocompleteDefault)
blkioWeightFlagName := "blkio-weight"
createFlags.StringVar( createFlags.StringVar(
&cf.BlkIOWeight, &cf.BlkIOWeight,
"blkio-weight", "", blkioWeightFlagName, "",
"Block IO weight (relative weight) accepts a weight value between 10 and 1000.", "Block IO weight (relative weight) accepts a weight value between 10 and 1000.",
) )
_ = cmd.RegisterFlagCompletionFunc(blkioWeightFlagName, completion.AutocompleteNone)
blkioWeightDeviceFlagName := "blkio-weight-device"
createFlags.StringSliceVar( createFlags.StringSliceVar(
&cf.BlkIOWeightDevice, &cf.BlkIOWeightDevice,
"blkio-weight-device", []string{}, blkioWeightDeviceFlagName, []string{},
"Block IO weight (relative device weight, format: `DEVICE_NAME:WEIGHT`)", "Block IO weight (relative device weight, format: `DEVICE_NAME:WEIGHT`)",
) )
_ = cmd.RegisterFlagCompletionFunc(blkioWeightDeviceFlagName, completion.AutocompleteDefault)
capAddFlagName := "cap-add"
createFlags.StringSliceVar( createFlags.StringSliceVar(
&cf.CapAdd, &cf.CapAdd,
"cap-add", []string{}, capAddFlagName, []string{},
"Add capabilities to the container", "Add capabilities to the container",
) )
_ = cmd.RegisterFlagCompletionFunc(capAddFlagName, completion.AutocompleteCapabilities)
capDropFlagName := "cap-drop"
createFlags.StringSliceVar( createFlags.StringSliceVar(
&cf.CapDrop, &cf.CapDrop,
"cap-drop", []string{}, capDropFlagName, []string{},
"Drop capabilities from the container", "Drop capabilities from the container",
) )
_ = cmd.RegisterFlagCompletionFunc(capDropFlagName, completion.AutocompleteCapabilities)
cgroupnsFlagName := "cgroupns"
createFlags.String( createFlags.String(
"cgroupns", "", cgroupnsFlagName, "",
"cgroup namespace to use", "cgroup namespace to use",
) )
_ = cmd.RegisterFlagCompletionFunc(cgroupnsFlagName, AutocompleteNamespace)
cgroupsFlagName := "cgroups"
createFlags.StringVar( createFlags.StringVar(
&cf.CGroupsMode, &cf.CGroupsMode,
"cgroups", containerConfig.Cgroups(), cgroupsFlagName, containerConfig.Cgroups(),
`control container cgroup configuration ("enabled"|"disabled"|"no-conmon"|"split")`, `control container cgroup configuration ("enabled"|"disabled"|"no-conmon"|"split")`,
) )
_ = cmd.RegisterFlagCompletionFunc(cgroupsFlagName, AutocompleteCgroupMode)
cgroupParentFlagName := "cgroup-parent"
createFlags.StringVar( createFlags.StringVar(
&cf.CGroupParent, &cf.CGroupParent,
"cgroup-parent", "", cgroupParentFlagName, "",
"Optional parent cgroup for the container", "Optional parent cgroup for the container",
) )
_ = cmd.RegisterFlagCompletionFunc(cgroupParentFlagName, completion.AutocompleteDefault)
cidfileFlagName := "cidfile"
createFlags.StringVar( createFlags.StringVar(
&cf.CIDFile, &cf.CIDFile,
"cidfile", "", cidfileFlagName, "",
"Write the container ID to the file", "Write the container ID to the file",
) )
_ = cmd.RegisterFlagCompletionFunc(cidfileFlagName, completion.AutocompleteDefault)
conmonPidfileFlagName := "conmon-pidfile"
createFlags.StringVar( createFlags.StringVar(
&cf.ConmonPIDFile, &cf.ConmonPIDFile,
"conmon-pidfile", "", conmonPidfileFlagName, "",
"Path to the file that will receive the PID of conmon", "Path to the file that will receive the PID of conmon",
) )
_ = cmd.RegisterFlagCompletionFunc(conmonPidfileFlagName, completion.AutocompleteDefault)
cpuPeriodFlagName := "cpu-period"
createFlags.Uint64Var( createFlags.Uint64Var(
&cf.CPUPeriod, &cf.CPUPeriod,
"cpu-period", 0, cpuPeriodFlagName, 0,
"Limit the CPU CFS (Completely Fair Scheduler) period", "Limit the CPU CFS (Completely Fair Scheduler) period",
) )
_ = cmd.RegisterFlagCompletionFunc(cpuPeriodFlagName, completion.AutocompleteNone)
cpuQuotaFlagName := "cpu-quota"
createFlags.Int64Var( createFlags.Int64Var(
&cf.CPUQuota, &cf.CPUQuota,
"cpu-quota", 0, cpuQuotaFlagName, 0,
"Limit the CPU CFS (Completely Fair Scheduler) quota", "Limit the CPU CFS (Completely Fair Scheduler) quota",
) )
_ = cmd.RegisterFlagCompletionFunc(cpuQuotaFlagName, completion.AutocompleteNone)
cpuRtPeriodFlagName := "cpu-rt-period"
createFlags.Uint64Var( createFlags.Uint64Var(
&cf.CPURTPeriod, &cf.CPURTPeriod,
"cpu-rt-period", 0, cpuRtPeriodFlagName, 0,
"Limit the CPU real-time period in microseconds", "Limit the CPU real-time period in microseconds",
) )
_ = cmd.RegisterFlagCompletionFunc(cpuRtPeriodFlagName, completion.AutocompleteNone)
cpuRtRuntimeFlagName := "cpu-rt-runtime"
createFlags.Int64Var( createFlags.Int64Var(
&cf.CPURTRuntime, &cf.CPURTRuntime,
"cpu-rt-runtime", 0, cpuRtRuntimeFlagName, 0,
"Limit the CPU real-time runtime in microseconds", "Limit the CPU real-time runtime in microseconds",
) )
_ = cmd.RegisterFlagCompletionFunc(cpuRtRuntimeFlagName, completion.AutocompleteNone)
cpuSharesFlagName := "cpu-shares"
createFlags.Uint64Var( createFlags.Uint64Var(
&cf.CPUShares, &cf.CPUShares,
"cpu-shares", 0, cpuSharesFlagName, 0,
"CPU shares (relative weight)", "CPU shares (relative weight)",
) )
_ = cmd.RegisterFlagCompletionFunc(cpuSharesFlagName, completion.AutocompleteNone)
cpusFlagName := "cpus"
createFlags.Float64Var( createFlags.Float64Var(
&cf.CPUS, &cf.CPUS,
"cpus", 0, cpusFlagName, 0,
"Number of CPUs. The default is 0.000 which means no limit", "Number of CPUs. The default is 0.000 which means no limit",
) )
_ = cmd.RegisterFlagCompletionFunc(cpusFlagName, completion.AutocompleteNone)
cpusetCpusFlagName := "cpuset-cpus"
createFlags.StringVar( createFlags.StringVar(
&cf.CPUSetCPUs, &cf.CPUSetCPUs,
"cpuset-cpus", "", cpusetCpusFlagName, "",
"CPUs in which to allow execution (0-3, 0,1)", "CPUs in which to allow execution (0-3, 0,1)",
) )
_ = cmd.RegisterFlagCompletionFunc(cpusetCpusFlagName, completion.AutocompleteNone)
cpusetMemsFlagName := "cpuset-mems"
createFlags.StringVar( createFlags.StringVar(
&cf.CPUSetMems, &cf.CPUSetMems,
"cpuset-mems", "", cpusetMemsFlagName, "",
"Memory nodes (MEMs) in which to allow execution (0-3, 0,1). Only effective on NUMA systems.", "Memory nodes (MEMs) in which to allow execution (0-3, 0,1). Only effective on NUMA systems.",
) )
_ = cmd.RegisterFlagCompletionFunc(cpusetMemsFlagName, completion.AutocompleteNone)
deviceFlagName := "device"
createFlags.StringSliceVar( createFlags.StringSliceVar(
&cf.Devices, &cf.Devices,
"device", containerConfig.Devices(), deviceFlagName, containerConfig.Devices(),
fmt.Sprintf("Add a host device to the container"), fmt.Sprintf("Add a host device to the container"),
) )
_ = cmd.RegisterFlagCompletionFunc(deviceFlagName, completion.AutocompleteDefault)
deviceCgroupRuleFlagName := "device-cgroup-rule"
createFlags.StringSliceVar( createFlags.StringSliceVar(
&cf.DeviceCGroupRule, &cf.DeviceCGroupRule,
"device-cgroup-rule", []string{}, deviceCgroupRuleFlagName, []string{},
"Add a rule to the cgroup allowed devices list", "Add a rule to the cgroup allowed devices list",
) )
_ = cmd.RegisterFlagCompletionFunc(deviceCgroupRuleFlagName, completion.AutocompleteNone)
deviceReadBpsFlagName := "device-read-bps"
createFlags.StringSliceVar( createFlags.StringSliceVar(
&cf.DeviceReadBPs, &cf.DeviceReadBPs,
"device-read-bps", []string{}, deviceReadBpsFlagName, []string{},
"Limit read rate (bytes per second) from a device (e.g. --device-read-bps=/dev/sda:1mb)", "Limit read rate (bytes per second) from a device (e.g. --device-read-bps=/dev/sda:1mb)",
) )
_ = cmd.RegisterFlagCompletionFunc(deviceReadBpsFlagName, completion.AutocompleteDefault)
deviceReadIopsFlagName := "device-read-iops"
createFlags.StringSliceVar( createFlags.StringSliceVar(
&cf.DeviceReadIOPs, &cf.DeviceReadIOPs,
"device-read-iops", []string{}, deviceReadIopsFlagName, []string{},
"Limit read rate (IO per second) from a device (e.g. --device-read-iops=/dev/sda:1000)", "Limit read rate (IO per second) from a device (e.g. --device-read-iops=/dev/sda:1000)",
) )
_ = cmd.RegisterFlagCompletionFunc(deviceReadIopsFlagName, completion.AutocompleteDefault)
deviceWriteBpsFlagName := "device-write-bps"
createFlags.StringSliceVar( createFlags.StringSliceVar(
&cf.DeviceWriteBPs, &cf.DeviceWriteBPs,
"device-write-bps", []string{}, deviceWriteBpsFlagName, []string{},
"Limit write rate (bytes per second) to a device (e.g. --device-write-bps=/dev/sda:1mb)", "Limit write rate (bytes per second) to a device (e.g. --device-write-bps=/dev/sda:1mb)",
) )
_ = cmd.RegisterFlagCompletionFunc(deviceWriteBpsFlagName, completion.AutocompleteDefault)
deviceWriteIopsFlagName := "device-write-iops"
createFlags.StringSliceVar( createFlags.StringSliceVar(
&cf.DeviceWriteIOPs, &cf.DeviceWriteIOPs,
"device-write-iops", []string{}, deviceWriteIopsFlagName, []string{},
"Limit write rate (IO per second) to a device (e.g. --device-write-iops=/dev/sda:1000)", "Limit write rate (IO per second) to a device (e.g. --device-write-iops=/dev/sda:1000)",
) )
_ = cmd.RegisterFlagCompletionFunc(deviceWriteIopsFlagName, completion.AutocompleteDefault)
createFlags.Bool( createFlags.Bool(
"disable-content-trust", false, "disable-content-trust", false,
"This is a Docker specific option and is a NOOP", "This is a Docker specific option and is a NOOP",
) )
createFlags.String("entrypoint", "",
entrypointFlagName := "entrypoint"
createFlags.String(entrypointFlagName, "",
"Overwrite the default ENTRYPOINT of the image", "Overwrite the default ENTRYPOINT of the image",
) )
_ = cmd.RegisterFlagCompletionFunc(entrypointFlagName, completion.AutocompleteNone)
envFlagName := "env"
createFlags.StringArrayP( createFlags.StringArrayP(
"env", "e", containerConfig.Env(), envFlagName, "e", containerConfig.Env(),
"Set environment variables in container", "Set environment variables in container",
) )
_ = cmd.RegisterFlagCompletionFunc(envFlagName, completion.AutocompleteNone)
if !registry.IsRemote() { if !registry.IsRemote() {
createFlags.BoolVar( createFlags.BoolVar(
&cf.EnvHost, &cf.EnvHost,
"env-host", false, "Use all current host environment variables in container", "env-host", false, "Use all current host environment variables in container",
) )
} }
envFileFlagName := "env-file"
createFlags.StringSliceVar( createFlags.StringSliceVar(
&cf.EnvFile, &cf.EnvFile,
"env-file", []string{}, envFileFlagName, []string{},
"Read in a file of environment variables", "Read in a file of environment variables",
) )
_ = cmd.RegisterFlagCompletionFunc(envFileFlagName, completion.AutocompleteDefault)
exposeFlagName := "expose"
createFlags.StringSliceVar( createFlags.StringSliceVar(
&cf.Expose, &cf.Expose,
"expose", []string{}, exposeFlagName, []string{},
"Expose a port or a range of ports", "Expose a port or a range of ports",
) )
_ = cmd.RegisterFlagCompletionFunc(exposeFlagName, completion.AutocompleteNone)
gidmapFlagName := "gidmap"
createFlags.StringSliceVar( createFlags.StringSliceVar(
&cf.GIDMap, &cf.GIDMap,
"gidmap", []string{}, gidmapFlagName, []string{},
"GID map to use for the user namespace", "GID map to use for the user namespace",
) )
_ = cmd.RegisterFlagCompletionFunc(gidmapFlagName, completion.AutocompleteNone)
groupAddFlagName := "group-add"
createFlags.StringSliceVar( createFlags.StringSliceVar(
&cf.GroupAdd, &cf.GroupAdd,
"group-add", []string{}, groupAddFlagName, []string{},
"Add additional groups to join", "Add additional groups to join",
) )
_ = cmd.RegisterFlagCompletionFunc(groupAddFlagName, completion.AutocompleteNone)
createFlags.Bool( createFlags.Bool(
"help", false, "", "help", false, "",
) )
healthCmdFlagName := "health-cmd"
createFlags.StringVar( createFlags.StringVar(
&cf.HealthCmd, &cf.HealthCmd,
"health-cmd", "", healthCmdFlagName, "",
"set a healthcheck command for the container ('none' disables the existing healthcheck)", "set a healthcheck command for the container ('none' disables the existing healthcheck)",
) )
_ = cmd.RegisterFlagCompletionFunc(healthCmdFlagName, completion.AutocompleteNone)
healthIntervalFlagName := "health-interval"
createFlags.StringVar( createFlags.StringVar(
&cf.HealthInterval, &cf.HealthInterval,
"health-interval", DefaultHealthCheckInterval, healthIntervalFlagName, DefaultHealthCheckInterval,
"set an interval for the healthchecks (a value of disable results in no automatic timer setup)", "set an interval for the healthchecks (a value of disable results in no automatic timer setup)",
) )
_ = cmd.RegisterFlagCompletionFunc(healthIntervalFlagName, completion.AutocompleteNone)
healthRetriesFlagName := "health-retries"
createFlags.UintVar( createFlags.UintVar(
&cf.HealthRetries, &cf.HealthRetries,
"health-retries", DefaultHealthCheckRetries, healthRetriesFlagName, DefaultHealthCheckRetries,
"the number of retries allowed before a healthcheck is considered to be unhealthy", "the number of retries allowed before a healthcheck is considered to be unhealthy",
) )
_ = cmd.RegisterFlagCompletionFunc(healthRetriesFlagName, completion.AutocompleteNone)
healthStartPeriodFlagName := "health-start-period"
createFlags.StringVar( createFlags.StringVar(
&cf.HealthStartPeriod, &cf.HealthStartPeriod,
"health-start-period", DefaultHealthCheckStartPeriod, healthStartPeriodFlagName, DefaultHealthCheckStartPeriod,
"the initialization time needed for a container to bootstrap", "the initialization time needed for a container to bootstrap",
) )
_ = cmd.RegisterFlagCompletionFunc(healthStartPeriodFlagName, completion.AutocompleteNone)
healthTimeoutFlagName := "health-timeout"
createFlags.StringVar( createFlags.StringVar(
&cf.HealthTimeout, &cf.HealthTimeout,
"health-timeout", DefaultHealthCheckTimeout, healthTimeoutFlagName, DefaultHealthCheckTimeout,
"the maximum time allowed to complete the healthcheck before an interval is considered failed", "the maximum time allowed to complete the healthcheck before an interval is considered failed",
) )
_ = cmd.RegisterFlagCompletionFunc(healthTimeoutFlagName, completion.AutocompleteNone)
hostnameFlagName := "hostname"
createFlags.StringVarP( createFlags.StringVarP(
&cf.Hostname, &cf.Hostname,
"hostname", "h", "", hostnameFlagName, "h", "",
"Set container hostname", "Set container hostname",
) )
_ = cmd.RegisterFlagCompletionFunc(hostnameFlagName, completion.AutocompleteNone)
createFlags.BoolVar( createFlags.BoolVar(
&cf.HTTPProxy, &cf.HTTPProxy,
"http-proxy", true, "http-proxy", true,
"Set proxy environment variables in the container based on the host proxy vars", "Set proxy environment variables in the container based on the host proxy vars",
) )
imageVolumeFlagName := "image-volume"
createFlags.StringVar( createFlags.StringVar(
&cf.ImageVolume, &cf.ImageVolume,
"image-volume", DefaultImageVolume, imageVolumeFlagName, DefaultImageVolume,
`Tells podman how to handle the builtin image volumes ("bind"|"tmpfs"|"ignore")`, `Tells podman how to handle the builtin image volumes ("bind"|"tmpfs"|"ignore")`,
) )
_ = cmd.RegisterFlagCompletionFunc(imageVolumeFlagName, AutocompleteImageVolume)
createFlags.BoolVar( createFlags.BoolVar(
&cf.Init, &cf.Init,
"init", false, "init", false,
"Run an init binary inside the container that forwards signals and reaps processes", "Run an init binary inside the container that forwards signals and reaps processes",
) )
initPathFlagName := "init-path"
createFlags.StringVar( createFlags.StringVar(
&cf.InitPath, &cf.InitPath,
"init-path", containerConfig.InitPath(), initPathFlagName, containerConfig.InitPath(),
// Do not use the Value field for setting the default value to determine user input (i.e., non-empty string) // Do not use the Value field for setting the default value to determine user input (i.e., non-empty string)
fmt.Sprintf("Path to the container-init binary"), fmt.Sprintf("Path to the container-init binary"),
) )
_ = cmd.RegisterFlagCompletionFunc(initPathFlagName, completion.AutocompleteDefault)
createFlags.BoolVarP( createFlags.BoolVarP(
&cf.Interactive, &cf.Interactive,
"interactive", "i", false, "interactive", "i", false,
"Keep STDIN open even if not attached", "Keep STDIN open even if not attached",
) )
ipcFlagName := "ipc"
createFlags.String( createFlags.String(
"ipc", "", ipcFlagName, "",
"IPC namespace to use", "IPC namespace to use",
) )
_ = cmd.RegisterFlagCompletionFunc(ipcFlagName, AutocompleteNamespace)
kernelMemoryFlagName := "kernel-memory"
createFlags.StringVar( createFlags.StringVar(
&cf.KernelMemory, &cf.KernelMemory,
"kernel-memory", "", kernelMemoryFlagName, "",
"Kernel memory limit "+sizeWithUnitFormat, "Kernel memory limit "+sizeWithUnitFormat,
) )
_ = cmd.RegisterFlagCompletionFunc(kernelMemoryFlagName, completion.AutocompleteNone)
labelFlagName := "label"
createFlags.StringArrayVarP( createFlags.StringArrayVarP(
&cf.Label, &cf.Label,
"label", "l", []string{}, labelFlagName, "l", []string{},
"Set metadata on container", "Set metadata on container",
) )
_ = cmd.RegisterFlagCompletionFunc(labelFlagName, completion.AutocompleteNone)
labelFileFlagName := "label-file"
createFlags.StringSliceVar( createFlags.StringSliceVar(
&cf.LabelFile, &cf.LabelFile,
"label-file", []string{}, labelFileFlagName, []string{},
"Read in a line delimited file of labels", "Read in a line delimited file of labels",
) )
_ = cmd.RegisterFlagCompletionFunc(labelFileFlagName, completion.AutocompleteDefault)
logDriverFlagName := "log-driver"
createFlags.StringVar( createFlags.StringVar(
&cf.LogDriver, &cf.LogDriver,
"log-driver", "", logDriverFlagName, "",
"Logging driver for the container", "Logging driver for the container",
) )
_ = cmd.RegisterFlagCompletionFunc(logDriverFlagName, AutocompleteLogDriver)
logOptFlagName := "log-opt"
createFlags.StringSliceVar( createFlags.StringSliceVar(
&cf.LogOptions, &cf.LogOptions,
"log-opt", []string{}, logOptFlagName, []string{},
"Logging driver options", "Logging driver options",
) )
_ = cmd.RegisterFlagCompletionFunc(logOptFlagName, AutocompleteLogOpt)
memoryFlagName := "memory"
createFlags.StringVarP( createFlags.StringVarP(
&cf.Memory, &cf.Memory,
"memory", "m", "", memoryFlagName, "m", "",
"Memory limit "+sizeWithUnitFormat, "Memory limit "+sizeWithUnitFormat,
) )
_ = cmd.RegisterFlagCompletionFunc(memoryFlagName, completion.AutocompleteNone)
memoryReservationFlagName := "memory-reservation"
createFlags.StringVar( createFlags.StringVar(
&cf.MemoryReservation, &cf.MemoryReservation,
"memory-reservation", "", memoryReservationFlagName, "",
"Memory soft limit "+sizeWithUnitFormat, "Memory soft limit "+sizeWithUnitFormat,
) )
_ = cmd.RegisterFlagCompletionFunc(memoryReservationFlagName, completion.AutocompleteNone)
memorySwapFlagName := "memory-swap"
createFlags.StringVar( createFlags.StringVar(
&cf.MemorySwap, &cf.MemorySwap,
"memory-swap", "", memorySwapFlagName, "",
"Swap limit equal to memory plus swap: '-1' to enable unlimited swap", "Swap limit equal to memory plus swap: '-1' to enable unlimited swap",
) )
_ = cmd.RegisterFlagCompletionFunc(memorySwapFlagName, completion.AutocompleteNone)
memorySwappinessFlagName := "memory-swappiness"
createFlags.Int64Var( createFlags.Int64Var(
&cf.MemorySwappiness, &cf.MemorySwappiness,
"memory-swappiness", -1, memorySwappinessFlagName, -1,
"Tune container memory swappiness (0 to 100, or -1 for system default)", "Tune container memory swappiness (0 to 100, or -1 for system default)",
) )
_ = cmd.RegisterFlagCompletionFunc(memorySwappinessFlagName, completion.AutocompleteNone)
nameFlagName := "name"
createFlags.StringVar( createFlags.StringVar(
&cf.Name, &cf.Name,
"name", "", nameFlagName, "",
"Assign a name to the container", "Assign a name to the container",
) )
_ = cmd.RegisterFlagCompletionFunc(nameFlagName, completion.AutocompleteNone)
createFlags.BoolVar( createFlags.BoolVar(
&cf.NoHealthCheck, &cf.NoHealthCheck,
"no-healthcheck", false, "no-healthcheck", false,
@ -305,44 +466,69 @@ func GetCreateFlags(cf *ContainerCLIOpts) *pflag.FlagSet {
"oom-kill-disable", false, "oom-kill-disable", false,
"Disable OOM Killer", "Disable OOM Killer",
) )
oomScoreAdjFlagName := "oom-score-adj"
createFlags.IntVar( createFlags.IntVar(
&cf.OOMScoreAdj, &cf.OOMScoreAdj,
"oom-score-adj", 0, oomScoreAdjFlagName, 0,
"Tune the host's OOM preferences (-1000 to 1000)", "Tune the host's OOM preferences (-1000 to 1000)",
) )
_ = cmd.RegisterFlagCompletionFunc(oomScoreAdjFlagName, completion.AutocompleteNone)
overrideArchFlagName := "override-arch"
createFlags.StringVar( createFlags.StringVar(
&cf.OverrideArch, &cf.OverrideArch,
"override-arch", "", overrideArchFlagName, "",
"use `ARCH` instead of the architecture of the machine for choosing images", "use `ARCH` instead of the architecture of the machine for choosing images",
) )
_ = cmd.RegisterFlagCompletionFunc(overrideArchFlagName, completion.AutocompleteNone)
overrideOSFlagName := "override-os"
createFlags.StringVar( createFlags.StringVar(
&cf.OverrideOS, &cf.OverrideOS,
"override-os", "", overrideOSFlagName, "",
"use `OS` instead of the running OS for choosing images", "use `OS` instead of the running OS for choosing images",
) )
_ = cmd.RegisterFlagCompletionFunc(overrideOSFlagName, completion.AutocompleteNone)
overrideVariantFlagName := "override-variant"
createFlags.StringVar( createFlags.StringVar(
&cf.OverrideVariant, &cf.OverrideVariant,
"override-variant", "", overrideVariantFlagName, "",
"Use _VARIANT_ instead of the running architecture variant for choosing images", "Use _VARIANT_ instead of the running architecture variant for choosing images",
) )
_ = cmd.RegisterFlagCompletionFunc(overrideVariantFlagName, completion.AutocompleteNone)
pidFlagName := "pid"
createFlags.String( createFlags.String(
"pid", "", pidFlagName, "",
"PID namespace to use", "PID namespace to use",
) )
_ = cmd.RegisterFlagCompletionFunc(pidFlagName, AutocompleteNamespace)
pidsLimitFlagName := "pids-limit"
createFlags.Int64( createFlags.Int64(
"pids-limit", containerConfig.PidsLimit(), pidsLimitFlagName, containerConfig.PidsLimit(),
"Tune container pids limit (set 0 for unlimited, -1 for server defaults)", "Tune container pids limit (set 0 for unlimited, -1 for server defaults)",
) )
_ = cmd.RegisterFlagCompletionFunc(pidsLimitFlagName, completion.AutocompleteNone)
podFlagName := "pod"
createFlags.StringVar( createFlags.StringVar(
&cf.Pod, &cf.Pod,
"pod", "", podFlagName, "",
"Run container in an existing pod", "Run container in an existing pod",
) )
_ = cmd.RegisterFlagCompletionFunc(podFlagName, AutocompletePods)
podIDFileFlagName := "pod-id-file"
createFlags.StringVar( createFlags.StringVar(
&cf.PodIDFile, &cf.PodIDFile,
"pod-id-file", "", podIDFileFlagName, "",
"Read the pod ID from the file", "Read the pod ID from the file",
) )
_ = cmd.RegisterFlagCompletionFunc(podIDFileFlagName, completion.AutocompleteDefault)
createFlags.BoolVar( createFlags.BoolVar(
&cf.Privileged, &cf.Privileged,
"privileged", false, "privileged", false,
@ -353,11 +539,15 @@ func GetCreateFlags(cf *ContainerCLIOpts) *pflag.FlagSet {
"publish-all", "P", false, "publish-all", "P", false,
"Publish all exposed ports to random ports on the host interface", "Publish all exposed ports to random ports on the host interface",
) )
pullFlagName := "pull"
createFlags.StringVar( createFlags.StringVar(
&cf.Pull, &cf.Pull,
"pull", containerConfig.Engine.PullPolicy, pullFlagName, containerConfig.Engine.PullPolicy,
`Pull image before creating ("always"|"missing"|"never")`, `Pull image before creating ("always"|"missing"|"never")`,
) )
_ = cmd.RegisterFlagCompletionFunc(pullFlagName, AutocompletePullOption)
createFlags.BoolVarP( createFlags.BoolVarP(
&cf.Quiet, &cf.Quiet,
"quiet", "q", false, "quiet", "q", false,
@ -378,11 +568,15 @@ func GetCreateFlags(cf *ContainerCLIOpts) *pflag.FlagSet {
"replace", false, "replace", false,
`If a container with the same name exists, replace it`, `If a container with the same name exists, replace it`,
) )
restartFlagName := "restart"
createFlags.StringVar( createFlags.StringVar(
&cf.Restart, &cf.Restart,
"restart", "", restartFlagName, "",
`Restart policy to apply when a container exits ("always"|"no"|"on-failure"|"unless-stopped")`, `Restart policy to apply when a container exits ("always"|"no"|"on-failure"|"unless-stopped")`,
) )
_ = cmd.RegisterFlagCompletionFunc(restartFlagName, AutocompleteRestartOption)
createFlags.BoolVar( createFlags.BoolVar(
&cf.Rm, &cf.Rm,
"rm", false, "rm", false,
@ -393,20 +587,31 @@ func GetCreateFlags(cf *ContainerCLIOpts) *pflag.FlagSet {
"rootfs", false, "rootfs", false,
"The first argument is not an image but the rootfs to the exploded container", "The first argument is not an image but the rootfs to the exploded container",
) )
sdnotifyFlagName := "sdnotify"
createFlags.StringVar( createFlags.StringVar(
&cf.SdNotifyMode, &cf.SdNotifyMode,
"sdnotify", define.SdNotifyModeContainer, sdnotifyFlagName, define.SdNotifyModeContainer,
`control sd-notify behavior ("container"|"conmon"|"ignore")`, `control sd-notify behavior ("container"|"conmon"|"ignore")`,
) )
_ = cmd.RegisterFlagCompletionFunc(sdnotifyFlagName, AutocompleteSDNotify)
securityOptFlagName := "security-opt"
createFlags.StringArrayVar( createFlags.StringArrayVar(
&cf.SecurityOpt, &cf.SecurityOpt,
"security-opt", []string{}, securityOptFlagName, []string{},
"Security Options", "Security Options",
) )
_ = cmd.RegisterFlagCompletionFunc(securityOptFlagName, AutocompleteSecurityOption)
shmSizeFlagName := "shm-size"
createFlags.String( createFlags.String(
"shm-size", containerConfig.ShmSize(), shmSizeFlagName, containerConfig.ShmSize(),
"Size of /dev/shm "+sizeWithUnitFormat, "Size of /dev/shm "+sizeWithUnitFormat,
) )
_ = cmd.RegisterFlagCompletionFunc(shmSizeFlagName, completion.AutocompleteNone)
stopSignalFlagName := "stop-signal"
createFlags.StringVar( createFlags.StringVar(
&cf.SignaturePolicy, &cf.SignaturePolicy,
"signature-policy", "", "signature-policy", "",
@ -414,112 +619,175 @@ func GetCreateFlags(cf *ContainerCLIOpts) *pflag.FlagSet {
) )
createFlags.StringVar( createFlags.StringVar(
&cf.StopSignal, &cf.StopSignal,
"stop-signal", "", stopSignalFlagName, "",
"Signal to stop a container. Default is SIGTERM", "Signal to stop a container. Default is SIGTERM",
) )
_ = cmd.RegisterFlagCompletionFunc(stopSignalFlagName, AutocompleteStopSignal)
stopTimeoutFlagName := "stop-timeout"
createFlags.UintVar( createFlags.UintVar(
&cf.StopTimeout, &cf.StopTimeout,
"stop-timeout", containerConfig.Engine.StopTimeout, stopTimeoutFlagName, containerConfig.Engine.StopTimeout,
"Timeout (in seconds) to stop a container. Default is 10", "Timeout (in seconds) to stop a container. Default is 10",
) )
_ = cmd.RegisterFlagCompletionFunc(stopTimeoutFlagName, completion.AutocompleteNone)
storageOptFlagName := "storage-opt"
createFlags.StringSliceVar( createFlags.StringSliceVar(
&cf.StoreageOpt, &cf.StoreageOpt,
"storage-opt", []string{}, storageOptFlagName, []string{},
"Storage driver options per container", "Storage driver options per container",
) )
//FIXME: What should we suggest here? The flag is not in the man page.
_ = cmd.RegisterFlagCompletionFunc(storageOptFlagName, completion.AutocompleteNone)
subgidnameFlagName := "subgidname"
createFlags.StringVar( createFlags.StringVar(
&cf.SubUIDName, &cf.SubUIDName,
"subgidname", "", subgidnameFlagName, "",
"Name of range listed in /etc/subgid for use in user namespace", "Name of range listed in /etc/subgid for use in user namespace",
) )
_ = cmd.RegisterFlagCompletionFunc(subgidnameFlagName, completion.AutocompleteSubgidName)
subuidnameFlagName := "subuidname"
createFlags.StringVar( createFlags.StringVar(
&cf.SubGIDName, &cf.SubGIDName,
"subuidname", "", subuidnameFlagName, "",
"Name of range listed in /etc/subuid for use in user namespace", "Name of range listed in /etc/subuid for use in user namespace",
) )
_ = cmd.RegisterFlagCompletionFunc(subuidnameFlagName, completion.AutocompleteSubuidName)
sysctlFlagName := "sysctl"
createFlags.StringSliceVar( createFlags.StringSliceVar(
&cf.Sysctl, &cf.Sysctl,
"sysctl", []string{}, sysctlFlagName, []string{},
"Sysctl options", "Sysctl options",
) )
//TODO: Add function for systctl completion.
_ = cmd.RegisterFlagCompletionFunc(sysctlFlagName, completion.AutocompleteNone)
systemdFlagName := "systemd"
createFlags.StringVar( createFlags.StringVar(
&cf.Systemd, &cf.Systemd,
"systemd", "true", systemdFlagName, "true",
`Run container in systemd mode ("true"|"false"|"always")`, `Run container in systemd mode ("true"|"false"|"always")`,
) )
_ = cmd.RegisterFlagCompletionFunc(systemdFlagName, AutocompleteSystemdFlag)
tmpfsFlagName := "tmpfs"
createFlags.StringArrayVar( createFlags.StringArrayVar(
&cf.TmpFS, &cf.TmpFS,
"tmpfs", []string{}, tmpfsFlagName, []string{},
"Mount a temporary filesystem (`tmpfs`) into a container", "Mount a temporary filesystem (`tmpfs`) into a container",
) )
_ = cmd.RegisterFlagCompletionFunc(tmpfsFlagName, completion.AutocompleteDefault)
createFlags.BoolVarP( createFlags.BoolVarP(
&cf.TTY, &cf.TTY,
"tty", "t", false, "tty", "t", false,
"Allocate a pseudo-TTY for container", "Allocate a pseudo-TTY for container",
) )
timezonezFlagName := "tz"
createFlags.StringVar( createFlags.StringVar(
&cf.Timezone, &cf.Timezone,
"tz", containerConfig.TZ(), timezonezFlagName, containerConfig.TZ(),
"Set timezone in container", "Set timezone in container",
) )
_ = cmd.RegisterFlagCompletionFunc(timezonezFlagName, completion.AutocompleteNone) //TODO: add timezone completion
umaskFlagName := "umask"
createFlags.StringVar( createFlags.StringVar(
&cf.Umask, &cf.Umask,
"umask", containerConfig.Umask(), umaskFlagName, containerConfig.Umask(),
"Set umask in container", "Set umask in container",
) )
_ = cmd.RegisterFlagCompletionFunc(umaskFlagName, completion.AutocompleteNone)
uidmapFlagName := "uidmap"
createFlags.StringSliceVar( createFlags.StringSliceVar(
&cf.UIDMap, &cf.UIDMap,
"uidmap", []string{}, uidmapFlagName, []string{},
"UID map to use for the user namespace", "UID map to use for the user namespace",
) )
_ = cmd.RegisterFlagCompletionFunc(uidmapFlagName, completion.AutocompleteNone)
ulimitFlagName := "ulimit"
createFlags.StringSliceVar( createFlags.StringSliceVar(
&cf.Ulimit, &cf.Ulimit,
"ulimit", containerConfig.Ulimits(), ulimitFlagName, containerConfig.Ulimits(),
"Ulimit options", "Ulimit options",
) )
_ = cmd.RegisterFlagCompletionFunc(ulimitFlagName, completion.AutocompleteNone)
userFlagName := "user"
createFlags.StringVarP( createFlags.StringVarP(
&cf.User, &cf.User,
"user", "u", "", userFlagName, "u", "",
"Username or UID (format: <name|uid>[:<group|gid>])", "Username or UID (format: <name|uid>[:<group|gid>])",
) )
_ = cmd.RegisterFlagCompletionFunc(userFlagName, AutocompleteUserFlag)
usernsFlagName := "userns"
createFlags.String( createFlags.String(
"userns", os.Getenv("PODMAN_USERNS"), usernsFlagName, os.Getenv("PODMAN_USERNS"),
"User namespace to use", "User namespace to use",
) )
_ = cmd.RegisterFlagCompletionFunc(usernsFlagName, AutocompleteUserNamespace)
utsFlagName := "uts"
createFlags.String( createFlags.String(
"uts", "", utsFlagName, "",
"UTS namespace to use", "UTS namespace to use",
) )
_ = cmd.RegisterFlagCompletionFunc(utsFlagName, AutocompleteNamespace)
mountFlagName := "mount"
createFlags.StringArrayVar( createFlags.StringArrayVar(
&cf.Mount, &cf.Mount,
"mount", []string{}, mountFlagName, []string{},
"Attach a filesystem mount to the container", "Attach a filesystem mount to the container",
) )
_ = cmd.RegisterFlagCompletionFunc(mountFlagName, AutocompleteMountFlag)
volumeFlagName := "volume"
createFlags.StringArrayVarP( createFlags.StringArrayVarP(
&cf.Volume, &cf.Volume,
"volume", "v", containerConfig.Volumes(), volumeFlagName, "v", containerConfig.Volumes(),
"Bind mount a volume into the container", "Bind mount a volume into the container",
) )
_ = cmd.RegisterFlagCompletionFunc(volumeFlagName, AutocompleteVolumeFlag)
volumesFromFlagName := "volumes-from"
createFlags.StringArrayVar( createFlags.StringArrayVar(
&cf.VolumesFrom, &cf.VolumesFrom,
"volumes-from", []string{}, volumesFromFlagName, []string{},
"Mount volumes from the specified container(s)", "Mount volumes from the specified container(s)",
) )
_ = cmd.RegisterFlagCompletionFunc(volumesFromFlagName, AutocompleteContainers)
workdirFlagName := "workdir"
createFlags.StringVarP( createFlags.StringVarP(
&cf.Workdir, &cf.Workdir,
"workdir", "w", "", workdirFlagName, "w", "",
"Working directory inside the container", "Working directory inside the container",
) )
_ = cmd.RegisterFlagCompletionFunc(workdirFlagName, completion.AutocompleteDefault)
seccompPolicyFlagName := "seccomp-policy"
createFlags.StringVar( createFlags.StringVar(
&cf.SeccompPolicy, &cf.SeccompPolicy,
"seccomp-policy", "default", seccompPolicyFlagName, "default",
"Policy for selecting a seccomp profile (experimental)", "Policy for selecting a seccomp profile (experimental)",
) )
_ = cmd.RegisterFlagCompletionFunc(seccompPolicyFlagName, completion.AutocompleteDefault)
cgroupConfFlagName := "cgroup-conf"
createFlags.StringSliceVar( createFlags.StringSliceVar(
&cf.CgroupConf, &cf.CgroupConf,
"cgroup-conf", []string{}, cgroupConfFlagName, []string{},
"Configure cgroup v2 (key=value)", "Configure cgroup v2 (key=value)",
) )
return &createFlags _ = cmd.RegisterFlagCompletionFunc(cgroupConfFlagName, completion.AutocompleteNone)
} }

View File

@ -4,58 +4,85 @@ import (
"net" "net"
"strings" "strings"
"github.com/containers/common/pkg/completion"
"github.com/containers/podman/v2/cmd/podman/parse" "github.com/containers/podman/v2/cmd/podman/parse"
"github.com/containers/podman/v2/libpod/define" "github.com/containers/podman/v2/libpod/define"
"github.com/containers/podman/v2/pkg/domain/entities" "github.com/containers/podman/v2/pkg/domain/entities"
"github.com/containers/podman/v2/pkg/specgen" "github.com/containers/podman/v2/pkg/specgen"
"github.com/pkg/errors" "github.com/pkg/errors"
"github.com/spf13/cobra" "github.com/spf13/cobra"
"github.com/spf13/pflag"
) )
func GetNetFlags() *pflag.FlagSet { func DefineNetFlags(cmd *cobra.Command) {
netFlags := pflag.FlagSet{} netFlags := cmd.Flags()
addHostFlagName := "add-host"
netFlags.StringSlice( netFlags.StringSlice(
"add-host", []string{}, addHostFlagName, []string{},
"Add a custom host-to-IP mapping (host:ip) (default [])", "Add a custom host-to-IP mapping (host:ip) (default [])",
) )
_ = cmd.RegisterFlagCompletionFunc(addHostFlagName, completion.AutocompleteNone)
dnsFlagName := "dns"
netFlags.StringSlice( netFlags.StringSlice(
"dns", containerConfig.DNSServers(), dnsFlagName, containerConfig.DNSServers(),
"Set custom DNS servers", "Set custom DNS servers",
) )
_ = cmd.RegisterFlagCompletionFunc(dnsFlagName, completion.AutocompleteNone)
dnsOptFlagName := "dns-opt"
netFlags.StringSlice( netFlags.StringSlice(
"dns-opt", containerConfig.DNSOptions(), dnsOptFlagName, containerConfig.DNSOptions(),
"Set custom DNS options", "Set custom DNS options",
) )
_ = cmd.RegisterFlagCompletionFunc(dnsOptFlagName, completion.AutocompleteNone)
dnsSearchFlagName := "dns-search"
netFlags.StringSlice( netFlags.StringSlice(
"dns-search", containerConfig.DNSSearches(), dnsSearchFlagName, containerConfig.DNSSearches(),
"Set custom DNS search domains", "Set custom DNS search domains",
) )
_ = cmd.RegisterFlagCompletionFunc(dnsSearchFlagName, completion.AutocompleteNone)
ipFlagName := "ip"
netFlags.String( netFlags.String(
"ip", "", ipFlagName, "",
"Specify a static IPv4 address for the container", "Specify a static IPv4 address for the container",
) )
_ = cmd.RegisterFlagCompletionFunc(ipFlagName, completion.AutocompleteNone)
macAddressFlagName := "mac-address"
netFlags.String( netFlags.String(
"mac-address", "", macAddressFlagName, "",
"Container MAC address (e.g. 92:d0:c6:0a:29:33)", "Container MAC address (e.g. 92:d0:c6:0a:29:33)",
) )
_ = cmd.RegisterFlagCompletionFunc(macAddressFlagName, completion.AutocompleteNone)
networkFlagName := "network"
netFlags.String( netFlags.String(
"network", containerConfig.NetNS(), networkFlagName, containerConfig.NetNS(),
"Connect a container to a network", "Connect a container to a network",
) )
_ = cmd.RegisterFlagCompletionFunc(networkFlagName, AutocompleteNetworks)
networkAliasFlagName := "network-alias"
netFlags.StringSlice( netFlags.StringSlice(
"network-alias", []string{}, networkAliasFlagName, []string{},
"Add network-scoped alias for the container", "Add network-scoped alias for the container",
) )
_ = cmd.RegisterFlagCompletionFunc(networkAliasFlagName, completion.AutocompleteNone)
publishFlagName := "publish"
netFlags.StringSliceP( netFlags.StringSliceP(
"publish", "p", []string{}, publishFlagName, "p", []string{},
"Publish a container's port, or a range of ports, to the host (default [])", "Publish a container's port, or a range of ports, to the host (default [])",
) )
_ = cmd.RegisterFlagCompletionFunc(publishFlagName, completion.AutocompleteNone)
netFlags.Bool( netFlags.Bool(
"no-hosts", false, "no-hosts", false,
"Do not create /etc/hosts within the container, instead use the version from the image", "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) { func NetFlagsToNetOptions(cmd *cobra.Command) (*entities.NetOptions, error) {

View File

@ -0,0 +1,93 @@
package completion
import (
"fmt"
"io"
"os"
"strings"
commonComp "github.com/containers/common/pkg/completion"
"github.com/containers/podman/v2/cmd/podman/registry"
"github.com/containers/podman/v2/pkg/domain/entities"
"github.com/spf13/cobra"
)
const (
completionDescription = `Generate shell autocompletions.
Valid arguments are bash, zsh, and fish.
Please refer to the man page to see how you can load these completions.`
)
var (
file string
noDesc bool
shells = []string{"bash", "zsh", "fish"}
completionCmd = &cobra.Command{
Use: fmt.Sprintf("completion [options] {%s}", strings.Join(shells, "|")),
Short: "Generate shell autocompletions",
Long: completionDescription,
ValidArgs: shells,
Args: cobra.ExactValidArgs(1),
RunE: completion,
Example: `podman completion bash
podman completion zsh -f _podman
podman completion fish --no-desc`,
//dont show this command to users
Hidden: true,
}
)
func init() {
registry.Commands = append(registry.Commands, registry.CliCommand{
Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode},
Command: completionCmd,
})
flags := completionCmd.Flags()
fileFlagName := "file"
flags.StringVarP(&file, fileFlagName, "f", "", "Output the completion to file rather than stdout.")
_ = completionCmd.RegisterFlagCompletionFunc(fileFlagName, commonComp.AutocompleteDefault)
flags.BoolVar(&noDesc, "no-desc", false, "Don't include descriptions in the completion output.")
}
func completion(cmd *cobra.Command, args []string) error {
var w io.Writer
if file != "" {
file, err := os.Create(file)
if err != nil {
return err
}
defer file.Close()
w = file
} else {
w = os.Stdout
}
var err error
switch args[0] {
case "bash":
if noDesc {
err = cmd.Root().GenBashCompletion(w)
} else {
err = cmd.Root().GenBashCompletionWithDesc(w)
}
case "zsh":
if noDesc {
err = cmd.Root().GenZshCompletionNoDesc(w)
} else {
err = cmd.Root().GenZshCompletion(w)
}
case "fish":
err = cmd.Root().GenFishCompletion(w, !noDesc)
}
if err != nil {
return err
}
_, err = io.WriteString(w, fmt.Sprintf(
"\n# This file is generated with %q; see: podman-completion(1)\n", cmd.CommandPath(),
))
return err
}

View File

@ -3,12 +3,12 @@ package containers
import ( import (
"os" "os"
"github.com/containers/podman/v2/cmd/podman/common"
"github.com/containers/podman/v2/cmd/podman/registry" "github.com/containers/podman/v2/cmd/podman/registry"
"github.com/containers/podman/v2/cmd/podman/validate" "github.com/containers/podman/v2/cmd/podman/validate"
"github.com/containers/podman/v2/pkg/domain/entities" "github.com/containers/podman/v2/pkg/domain/entities"
"github.com/pkg/errors" "github.com/pkg/errors"
"github.com/spf13/cobra" "github.com/spf13/cobra"
"github.com/spf13/pflag"
) )
var ( var (
@ -19,6 +19,7 @@ var (
Long: attachDescription, Long: attachDescription,
RunE: attach, RunE: attach,
Args: validate.IDOrLatestArgs, Args: validate.IDOrLatestArgs,
ValidArgsFunction: common.AutocompleteContainersRunning,
Example: `podman attach ctrID Example: `podman attach ctrID
podman attach 1234 podman attach 1234
podman attach --no-stdin foobar`, podman attach --no-stdin foobar`,
@ -30,6 +31,7 @@ var (
Long: attachCommand.Long, Long: attachCommand.Long,
RunE: attachCommand.RunE, RunE: attachCommand.RunE,
Args: validate.IDOrLatestArgs, Args: validate.IDOrLatestArgs,
ValidArgsFunction: attachCommand.ValidArgsFunction,
Example: `podman container attach ctrID Example: `podman container attach ctrID
podman container attach 1234 podman container attach 1234
podman container attach --no-stdin foobar`, podman container attach --no-stdin foobar`,
@ -40,8 +42,13 @@ var (
attachOpts entities.AttachOptions attachOpts entities.AttachOptions
) )
func attachFlags(flags *pflag.FlagSet) { func attachFlags(cmd *cobra.Command) {
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 := cmd.Flags()
detachKeysFlagName := "detach-keys"
flags.StringVar(&attachOpts.DetachKeys, detachKeysFlagName, 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 `_`")
_ = cmd.RegisterFlagCompletionFunc(detachKeysFlagName, common.AutocompleteDetachKeys)
flags.BoolVar(&attachOpts.NoStdin, "no-stdin", false, "Do not attach STDIN. The default is false") flags.BoolVar(&attachOpts.NoStdin, "no-stdin", false, "Do not attach STDIN. The default is false")
flags.BoolVar(&attachOpts.SigProxy, "sig-proxy", true, "Proxy received signals to the process") flags.BoolVar(&attachOpts.SigProxy, "sig-proxy", true, "Proxy received signals to the process")
} }
@ -51,7 +58,7 @@ func init() {
Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode}, Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode},
Command: attachCommand, Command: attachCommand,
}) })
attachFlags(attachCommand.Flags()) attachFlags(attachCommand)
validate.AddLatestFlag(attachCommand, &attachOpts.Latest) validate.AddLatestFlag(attachCommand, &attachOpts.Latest)
registry.Commands = append(registry.Commands, registry.CliCommand{ registry.Commands = append(registry.Commands, registry.CliCommand{
@ -59,7 +66,7 @@ func init() {
Command: containerAttachCommand, Command: containerAttachCommand,
Parent: containerCmd, Parent: containerCmd,
}) })
attachFlags(containerAttachCommand.Flags()) attachFlags(containerAttachCommand)
validate.AddLatestFlag(containerAttachCommand, &attachOpts.Latest) validate.AddLatestFlag(containerAttachCommand, &attachOpts.Latest)
} }

View File

@ -4,6 +4,8 @@ import (
"context" "context"
"fmt" "fmt"
"github.com/containers/common/pkg/completion"
"github.com/containers/podman/v2/cmd/podman/common"
"github.com/containers/podman/v2/cmd/podman/registry" "github.com/containers/podman/v2/cmd/podman/registry"
"github.com/containers/podman/v2/cmd/podman/utils" "github.com/containers/podman/v2/cmd/podman/utils"
"github.com/containers/podman/v2/cmd/podman/validate" "github.com/containers/podman/v2/cmd/podman/validate"
@ -27,6 +29,7 @@ var (
Args: func(cmd *cobra.Command, args []string) error { Args: func(cmd *cobra.Command, args []string) error {
return validate.CheckAllLatestAndCIDFile(cmd, args, false, false) return validate.CheckAllLatestAndCIDFile(cmd, args, false, false)
}, },
ValidArgsFunction: common.AutocompleteContainersRunning,
Example: `podman container checkpoint --keep ctrID Example: `podman container checkpoint --keep ctrID
podman container checkpoint --all podman container checkpoint --all
podman container checkpoint --leave-running --latest`, podman container checkpoint --leave-running --latest`,
@ -48,7 +51,11 @@ func init() {
flags.BoolVarP(&checkpointOptions.LeaveRunning, "leave-running", "R", false, "Leave the container running after writing checkpoint to disk") flags.BoolVarP(&checkpointOptions.LeaveRunning, "leave-running", "R", false, "Leave the container running after writing checkpoint to disk")
flags.BoolVar(&checkpointOptions.TCPEstablished, "tcp-established", false, "Checkpoint a container with established TCP connections") flags.BoolVar(&checkpointOptions.TCPEstablished, "tcp-established", false, "Checkpoint a container with established TCP connections")
flags.BoolVarP(&checkpointOptions.All, "all", "a", false, "Checkpoint all running containers") flags.BoolVarP(&checkpointOptions.All, "all", "a", false, "Checkpoint all running containers")
flags.StringVarP(&checkpointOptions.Export, "export", "e", "", "Export the checkpoint image to a tar.gz")
exportFlagName := "export"
flags.StringVarP(&checkpointOptions.Export, exportFlagName, "e", "", "Export the checkpoint image to a tar.gz")
_ = checkpointCommand.RegisterFlagCompletionFunc(exportFlagName, completion.AutocompleteDefault)
flags.BoolVar(&checkpointOptions.IgnoreRootFS, "ignore-rootfs", false, "Do not include root file-system changes when exporting") flags.BoolVar(&checkpointOptions.IgnoreRootFS, "ignore-rootfs", false, "Do not include root file-system changes when exporting")
validate.AddLatestFlag(checkpointCommand, &checkpointOptions.Latest) validate.AddLatestFlag(checkpointCommand, &checkpointOptions.Latest)
} }

View File

@ -3,6 +3,8 @@ package containers
import ( import (
"fmt" "fmt"
"github.com/containers/common/pkg/completion"
"github.com/containers/podman/v2/cmd/podman/common"
"github.com/containers/podman/v2/cmd/podman/registry" "github.com/containers/podman/v2/cmd/podman/registry"
"github.com/containers/podman/v2/cmd/podman/utils" "github.com/containers/podman/v2/cmd/podman/utils"
"github.com/containers/podman/v2/cmd/podman/validate" "github.com/containers/podman/v2/cmd/podman/validate"
@ -26,6 +28,7 @@ var (
Args: func(cmd *cobra.Command, args []string) error { Args: func(cmd *cobra.Command, args []string) error {
return validate.CheckAllLatestAndCIDFile(cmd, args, false, false) return validate.CheckAllLatestAndCIDFile(cmd, args, false, false)
}, },
ValidArgsFunction: common.AutocompleteContainersExited,
Example: `podman container cleanup --latest Example: `podman container cleanup --latest
podman container cleanup ctrID1 ctrID2 ctrID3 podman container cleanup ctrID1 ctrID2 ctrID3
podman container cleanup --all`, podman container cleanup --all`,
@ -44,7 +47,11 @@ func init() {
}) })
flags := cleanupCommand.Flags() flags := cleanupCommand.Flags()
flags.BoolVarP(&cleanupOptions.All, "all", "a", false, "Cleans up all containers") flags.BoolVarP(&cleanupOptions.All, "all", "a", false, "Cleans up all containers")
flags.StringVar(&cleanupOptions.Exec, "exec", "", "Clean up the given exec session instead of the container")
execFlagName := "exec"
flags.StringVar(&cleanupOptions.Exec, execFlagName, "", "Clean up the given exec session instead of the container")
_ = cleanupCommand.RegisterFlagCompletionFunc(execFlagName, completion.AutocompleteNone)
flags.BoolVar(&cleanupOptions.Remove, "rm", false, "After cleanup, remove the container entirely") flags.BoolVar(&cleanupOptions.Remove, "rm", false, "After cleanup, remove the container entirely")
flags.BoolVar(&cleanupOptions.RemoveImage, "rmi", false, "After cleanup, remove the image entirely") flags.BoolVar(&cleanupOptions.RemoveImage, "rmi", false, "After cleanup, remove the image entirely")
validate.AddLatestFlag(cleanupCommand, &cleanupOptions.Latest) validate.AddLatestFlag(cleanupCommand, &cleanupOptions.Latest)

View File

@ -7,11 +7,12 @@ import (
"os" "os"
"strings" "strings"
"github.com/containers/common/pkg/completion"
"github.com/containers/podman/v2/cmd/podman/common"
"github.com/containers/podman/v2/cmd/podman/registry" "github.com/containers/podman/v2/cmd/podman/registry"
"github.com/containers/podman/v2/pkg/domain/entities" "github.com/containers/podman/v2/pkg/domain/entities"
"github.com/pkg/errors" "github.com/pkg/errors"
"github.com/spf13/cobra" "github.com/spf13/cobra"
"github.com/spf13/pflag"
) )
var ( var (
@ -23,6 +24,7 @@ var (
Long: commitDescription, Long: commitDescription,
RunE: commit, RunE: commit,
Args: cobra.RangeArgs(1, 2), Args: cobra.RangeArgs(1, 2),
ValidArgsFunction: common.AutocompleteContainers,
Example: `podman commit -q --message "committing container to image" reverent_golick image-committed 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 --author "firstName lastName" reverent_golick image-committed
podman commit -q --pause=false containerID image-committed podman commit -q --pause=false containerID image-committed
@ -35,14 +37,12 @@ var (
Short: commitCommand.Short, Short: commitCommand.Short,
Long: commitCommand.Long, Long: commitCommand.Long,
RunE: commitCommand.RunE, RunE: commitCommand.RunE,
ValidArgsFunction: commitCommand.ValidArgsFunction,
Example: `podman container commit -q --message "committing container to image" reverent_golick image-committed Example: `podman container commit -q --message "committing container to image" reverent_golick image-committed
podman container commit -q --author "firstName lastName" reverent_golick image-committed podman container commit -q --author "firstName lastName" reverent_golick image-committed
podman container commit -q --pause=false containerID image-committed podman container commit -q --pause=false containerID image-committed
podman container commit containerID`, podman container 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 ( var (
@ -52,12 +52,29 @@ var (
iidFile string iidFile string
) )
func commitFlags(flags *pflag.FlagSet) { func commitFlags(cmd *cobra.Command) {
flags.StringArrayVarP(&commitOptions.Changes, "change", "c", []string{}, "Apply the following possible instructions to the created image (default []): "+strings.Join(ChangeCmds, " | ")) flags := cmd.Flags()
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") changeFlagName := "change"
flags.StringVarP(&commitOptions.Message, "message", "m", "", "Set commit message for imported image") flags.StringArrayVarP(&commitOptions.Changes, changeFlagName, "c", []string{}, "Apply the following possible instructions to the created image (default []): "+strings.Join(common.ChangeCmds, " | "))
flags.StringVarP(&commitOptions.Author, "author", "a", "", "Set the author for the image committed") _ = cmd.RegisterFlagCompletionFunc(changeFlagName, common.AutocompleteChangeInstructions)
formatFlagName := "format"
flags.StringVarP(&commitOptions.Format, formatFlagName, "f", "oci", "`Format` of the image manifest and metadata")
_ = cmd.RegisterFlagCompletionFunc(formatFlagName, common.AutocompleteImageFormat)
iidFileFlagName := "iidfile"
flags.StringVarP(&iidFile, iidFileFlagName, "", "", "`file` to write the image ID to")
_ = cmd.RegisterFlagCompletionFunc(iidFileFlagName, completion.AutocompleteDefault)
messageFlagName := "message"
flags.StringVarP(&commitOptions.Message, messageFlagName, "m", "", "Set commit message for imported image")
_ = cmd.RegisterFlagCompletionFunc(messageFlagName, completion.AutocompleteNone)
authorFlagName := "author"
flags.StringVarP(&commitOptions.Author, authorFlagName, "a", "", "Set the author for the image committed")
_ = cmd.RegisterFlagCompletionFunc(authorFlagName, completion.AutocompleteNone)
flags.BoolVarP(&commitOptions.Pause, "pause", "p", false, "Pause container during commit") flags.BoolVarP(&commitOptions.Pause, "pause", "p", false, "Pause container during commit")
flags.BoolVarP(&commitOptions.Quiet, "quiet", "q", false, "Suppress output") flags.BoolVarP(&commitOptions.Quiet, "quiet", "q", false, "Suppress output")
flags.BoolVar(&commitOptions.IncludeVolumes, "include-volumes", false, "Include container volumes as image volumes") flags.BoolVar(&commitOptions.IncludeVolumes, "include-volumes", false, "Include container volumes as image volumes")
@ -68,16 +85,14 @@ func init() {
Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode}, Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode},
Command: commitCommand, Command: commitCommand,
}) })
flags := commitCommand.Flags() commitFlags(commitCommand)
commitFlags(flags)
registry.Commands = append(registry.Commands, registry.CliCommand{ registry.Commands = append(registry.Commands, registry.CliCommand{
Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode}, Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode},
Command: containerCommitCommand, Command: containerCommitCommand,
Parent: containerCmd, Parent: containerCmd,
}) })
containerCommitFlags := containerCommitCommand.Flags() commitFlags(containerCommitCommand)
commitFlags(containerCommitFlags)
} }
func commit(cmd *cobra.Command, args []string) error { func commit(cmd *cobra.Command, args []string) error {

View File

@ -1,13 +1,13 @@
package containers package containers
import ( import (
"github.com/containers/podman/v2/cmd/podman/common"
"github.com/containers/podman/v2/cmd/podman/registry" "github.com/containers/podman/v2/cmd/podman/registry"
"github.com/containers/podman/v2/pkg/cgroups" "github.com/containers/podman/v2/pkg/cgroups"
"github.com/containers/podman/v2/pkg/domain/entities" "github.com/containers/podman/v2/pkg/domain/entities"
"github.com/containers/podman/v2/pkg/rootless" "github.com/containers/podman/v2/pkg/rootless"
"github.com/sirupsen/logrus" "github.com/sirupsen/logrus"
"github.com/spf13/cobra" "github.com/spf13/cobra"
"github.com/spf13/pflag"
) )
var ( var (
@ -21,6 +21,7 @@ var (
Long: cpDescription, Long: cpDescription,
Args: cobra.ExactArgs(2), Args: cobra.ExactArgs(2),
RunE: cp, RunE: cp,
ValidArgsFunction: common.AutocompleteCpCommand,
Example: "podman cp [CONTAINER:]SRC_PATH [CONTAINER:]DEST_PATH", Example: "podman cp [CONTAINER:]SRC_PATH [CONTAINER:]DEST_PATH",
} }
@ -30,6 +31,7 @@ var (
Long: cpCommand.Long, Long: cpCommand.Long,
Args: cpCommand.Args, Args: cpCommand.Args,
RunE: cpCommand.RunE, RunE: cpCommand.RunE,
ValidArgsFunction: cpCommand.ValidArgsFunction,
Example: "podman container cp [CONTAINER:]SRC_PATH [CONTAINER:]DEST_PATH", Example: "podman container cp [CONTAINER:]SRC_PATH [CONTAINER:]DEST_PATH",
} }
) )
@ -38,7 +40,8 @@ var (
cpOpts entities.ContainerCpOptions cpOpts entities.ContainerCpOptions
) )
func cpFlags(flags *pflag.FlagSet) { func cpFlags(cmd *cobra.Command) {
flags := cmd.Flags()
flags.BoolVar(&cpOpts.Extract, "extract", false, "Extract the tar file into the destination directory.") flags.BoolVar(&cpOpts.Extract, "extract", false, "Extract the tar file into the destination directory.")
flags.BoolVar(&cpOpts.Pause, "pause", copyPause(), "Pause the container while copying") flags.BoolVar(&cpOpts.Pause, "pause", copyPause(), "Pause the container while copying")
} }
@ -48,16 +51,14 @@ func init() {
Mode: []entities.EngineMode{entities.ABIMode}, Mode: []entities.EngineMode{entities.ABIMode},
Command: cpCommand, Command: cpCommand,
}) })
flags := cpCommand.Flags() cpFlags(cpCommand)
cpFlags(flags)
registry.Commands = append(registry.Commands, registry.CliCommand{ registry.Commands = append(registry.Commands, registry.CliCommand{
Mode: []entities.EngineMode{entities.ABIMode}, Mode: []entities.EngineMode{entities.ABIMode},
Command: containerCpCommand, Command: containerCpCommand,
Parent: containerCmd, Parent: containerCmd,
}) })
containerCpFlags := containerCpCommand.Flags() cpFlags(containerCpCommand)
cpFlags(containerCpFlags)
} }
func cp(cmd *cobra.Command, args []string) error { func cp(cmd *cobra.Command, args []string) error {

View File

@ -19,7 +19,6 @@ import (
"github.com/containers/podman/v2/pkg/util" "github.com/containers/podman/v2/pkg/util"
"github.com/pkg/errors" "github.com/pkg/errors"
"github.com/spf13/cobra" "github.com/spf13/cobra"
"github.com/spf13/pflag"
) )
var ( var (
@ -32,6 +31,7 @@ var (
Long: createDescription, Long: createDescription,
RunE: create, RunE: create,
Args: cobra.MinimumNArgs(1), Args: cobra.MinimumNArgs(1),
ValidArgsFunction: common.AutocompleteCreateRun,
Example: `podman create alpine ls Example: `podman create alpine ls
podman create --annotation HELLO=WORLD alpine ls podman create --annotation HELLO=WORLD alpine ls
podman create -t -i --name myctr alpine ls`, podman create -t -i --name myctr alpine ls`,
@ -43,6 +43,7 @@ var (
Short: createCommand.Short, Short: createCommand.Short,
Long: createCommand.Long, Long: createCommand.Long,
RunE: createCommand.RunE, RunE: createCommand.RunE,
ValidArgsFunction: createCommand.ValidArgsFunction,
Example: `podman container create alpine ls Example: `podman container create alpine ls
podman container create --annotation HELLO=WORLD alpine ls podman container create --annotation HELLO=WORLD alpine ls
podman container create -t -i --name myctr alpine ls`, podman container create -t -i --name myctr alpine ls`,
@ -53,10 +54,13 @@ var (
cliVals common.ContainerCLIOpts cliVals common.ContainerCLIOpts
) )
func createFlags(flags *pflag.FlagSet) { func createFlags(cmd *cobra.Command) {
flags := cmd.Flags()
flags.SetInterspersed(false) flags.SetInterspersed(false)
flags.AddFlagSet(common.GetCreateFlags(&cliVals)) common.DefineCreateFlags(cmd, &cliVals)
flags.AddFlagSet(common.GetNetFlags()) common.DefineNetFlags(cmd)
flags.SetNormalizeFunc(utils.AliasFlags) flags.SetNormalizeFunc(utils.AliasFlags)
_ = flags.MarkHidden("signature-policy") _ = flags.MarkHidden("signature-policy")
@ -70,18 +74,14 @@ func init() {
Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode}, Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode},
Command: createCommand, Command: createCommand,
}) })
// common.GetCreateFlags(createCommand) createFlags(createCommand)
flags := createCommand.Flags()
createFlags(flags)
registry.Commands = append(registry.Commands, registry.CliCommand{ registry.Commands = append(registry.Commands, registry.CliCommand{
Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode}, Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode},
Command: containerCreateCommand, Command: containerCreateCommand,
Parent: containerCmd, Parent: containerCmd,
}) })
createFlags(containerCreateCommand)
containerCreateFlags := containerCreateCommand.Flags()
createFlags(containerCreateFlags)
} }
func create(cmd *cobra.Command, args []string) error { func create(cmd *cobra.Command, args []string) error {

View File

@ -18,6 +18,7 @@ var (
Short: "Inspect changes to the container's file systems", Short: "Inspect changes to the container's file systems",
Long: `Displays changes to the container filesystem's'. The container will be compared to its parent layer.`, Long: `Displays changes to the container filesystem's'. The container will be compared to its parent layer.`,
RunE: diff, RunE: diff,
ValidArgsFunction: common.AutocompleteContainers,
Example: `podman container diff myCtr Example: `podman container diff myCtr
podman container diff -l --format json myCtr`, podman container diff -l --format json myCtr`,
} }
@ -35,7 +36,11 @@ func init() {
flags := diffCmd.Flags() flags := diffCmd.Flags()
flags.BoolVar(&diffOpts.Archive, "archive", true, "Save the diff as a tar archive") flags.BoolVar(&diffOpts.Archive, "archive", true, "Save the diff as a tar archive")
_ = flags.MarkHidden("archive") _ = flags.MarkHidden("archive")
flags.StringVar(&diffOpts.Format, "format", "", "Change the output format")
formatFlagName := "format"
flags.StringVar(&diffOpts.Format, formatFlagName, "", "Change the output format")
_ = diffCmd.RegisterFlagCompletionFunc(formatFlagName, common.AutocompleteJSONFormat)
validate.AddLatestFlag(diffCmd, &diffOpts.Latest) validate.AddLatestFlag(diffCmd, &diffOpts.Latest)
} }

View File

@ -5,6 +5,8 @@ import (
"fmt" "fmt"
"os" "os"
"github.com/containers/common/pkg/completion"
"github.com/containers/podman/v2/cmd/podman/common"
"github.com/containers/podman/v2/cmd/podman/registry" "github.com/containers/podman/v2/cmd/podman/registry"
"github.com/containers/podman/v2/cmd/podman/validate" "github.com/containers/podman/v2/cmd/podman/validate"
"github.com/containers/podman/v2/libpod/define" "github.com/containers/podman/v2/libpod/define"
@ -13,7 +15,6 @@ import (
"github.com/containers/podman/v2/pkg/rootless" "github.com/containers/podman/v2/pkg/rootless"
"github.com/pkg/errors" "github.com/pkg/errors"
"github.com/spf13/cobra" "github.com/spf13/cobra"
"github.com/spf13/pflag"
) )
var ( var (
@ -25,6 +26,7 @@ var (
Long: execDescription, Long: execDescription,
RunE: exec, RunE: exec,
DisableFlagsInUseLine: true, DisableFlagsInUseLine: true,
ValidArgsFunction: common.AutocompleteContainersRunning,
Example: `podman exec -it ctrID ls Example: `podman exec -it ctrID ls
podman exec -it -w /tmp myCtr pwd podman exec -it -w /tmp myCtr pwd
podman exec --user root ctrID ls`, podman exec --user root ctrID ls`,
@ -36,6 +38,7 @@ var (
Long: execCommand.Long, Long: execCommand.Long,
RunE: execCommand.RunE, RunE: execCommand.RunE,
DisableFlagsInUseLine: true, DisableFlagsInUseLine: true,
ValidArgsFunction: execCommand.ValidArgsFunction,
Example: `podman container exec -it ctrID ls Example: `podman container exec -it ctrID ls
podman container exec -it -w /tmp myCtr pwd podman container exec -it -w /tmp myCtr pwd
podman container exec --user root ctrID ls`, podman container exec --user root ctrID ls`,
@ -48,18 +51,39 @@ var (
execDetach bool execDetach bool
) )
func execFlags(flags *pflag.FlagSet) { func execFlags(cmd *cobra.Command) {
flags := cmd.Flags()
flags.SetInterspersed(false) flags.SetInterspersed(false)
flags.BoolVarP(&execDetach, "detach", "d", false, "Run the exec session in detached mode (backgrounded)") flags.BoolVarP(&execDetach, "detach", "d", false, "Run the exec session in detached mode (backgrounded)")
flags.StringVar(&execOpts.DetachKeys, "detach-keys", containerConfig.DetachKeys(), "Select the key sequence for detaching a container. Format is a single character [a-Z] or ctrl-<value> where <value> is one of: a-z, @, ^, [, , or _")
flags.StringArrayVarP(&envInput, "env", "e", []string{}, "Set environment variables") detachKeysFlagName := "detach-keys"
flags.StringSliceVar(&envFile, "env-file", []string{}, "Read in a file of environment variables") flags.StringVar(&execOpts.DetachKeys, detachKeysFlagName, containerConfig.DetachKeys(), "Select the key sequence for detaching a container. Format is a single character [a-Z] or ctrl-<value> where <value> is one of: a-z, @, ^, [, , or _")
_ = cmd.RegisterFlagCompletionFunc(detachKeysFlagName, common.AutocompleteDetachKeys)
envFlagName := "env"
flags.StringArrayVarP(&envInput, envFlagName, "e", []string{}, "Set environment variables")
_ = cmd.RegisterFlagCompletionFunc(envFlagName, completion.AutocompleteNone)
envFileFlagName := "env-file"
flags.StringSliceVar(&envFile, envFileFlagName, []string{}, "Read in a file of environment variables")
_ = cmd.RegisterFlagCompletionFunc(envFileFlagName, completion.AutocompleteDefault)
flags.BoolVarP(&execOpts.Interactive, "interactive", "i", false, "Keep STDIN open even if not attached") flags.BoolVarP(&execOpts.Interactive, "interactive", "i", false, "Keep STDIN open even if not attached")
flags.BoolVar(&execOpts.Privileged, "privileged", false, "Give the process extended Linux capabilities inside the container. The default is false") flags.BoolVar(&execOpts.Privileged, "privileged", false, "Give the process extended Linux capabilities inside the container. The default is false")
flags.BoolVarP(&execOpts.Tty, "tty", "t", false, "Allocate a pseudo-TTY. The default is false") flags.BoolVarP(&execOpts.Tty, "tty", "t", false, "Allocate a pseudo-TTY. The default is false")
flags.StringVarP(&execOpts.User, "user", "u", "", "Sets the username or UID used and optionally the groupname or GID for the specified command")
flags.UintVar(&execOpts.PreserveFDs, "preserve-fds", 0, "Pass N additional file descriptors to the container") userFlagName := "user"
flags.StringVarP(&execOpts.WorkDir, "workdir", "w", "", "Working directory inside the container") flags.StringVarP(&execOpts.User, userFlagName, "u", "", "Sets the username or UID used and optionally the groupname or GID for the specified command")
_ = cmd.RegisterFlagCompletionFunc(userFlagName, common.AutocompleteUserFlag)
preserveFdsFlagName := "preserve-fds"
flags.UintVar(&execOpts.PreserveFDs, preserveFdsFlagName, 0, "Pass N additional file descriptors to the container")
_ = cmd.RegisterFlagCompletionFunc(preserveFdsFlagName, completion.AutocompleteNone)
workdirFlagName := "workdir"
flags.StringVarP(&execOpts.WorkDir, workdirFlagName, "w", "", "Working directory inside the container")
_ = cmd.RegisterFlagCompletionFunc(workdirFlagName, completion.AutocompleteDefault)
if registry.IsRemote() { if registry.IsRemote() {
_ = flags.MarkHidden("preserve-fds") _ = flags.MarkHidden("preserve-fds")
@ -71,7 +95,7 @@ func init() {
Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode}, Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode},
Command: execCommand, Command: execCommand,
}) })
execFlags(execCommand.Flags()) execFlags(execCommand)
validate.AddLatestFlag(execCommand, &execOpts.Latest) validate.AddLatestFlag(execCommand, &execOpts.Latest)
registry.Commands = append(registry.Commands, registry.CliCommand{ registry.Commands = append(registry.Commands, registry.CliCommand{
@ -79,7 +103,7 @@ func init() {
Command: containerExecCommand, Command: containerExecCommand,
Parent: containerCmd, Parent: containerCmd,
}) })
execFlags(containerExecCommand.Flags()) execFlags(containerExecCommand)
validate.AddLatestFlag(containerExecCommand, &execOpts.Latest) validate.AddLatestFlag(containerExecCommand, &execOpts.Latest)
} }

View File

@ -3,6 +3,7 @@ package containers
import ( import (
"context" "context"
"github.com/containers/podman/v2/cmd/podman/common"
"github.com/containers/podman/v2/cmd/podman/registry" "github.com/containers/podman/v2/cmd/podman/registry"
"github.com/containers/podman/v2/pkg/domain/entities" "github.com/containers/podman/v2/pkg/domain/entities"
"github.com/spf13/cobra" "github.com/spf13/cobra"
@ -20,6 +21,7 @@ var (
RunE: exists, RunE: exists,
Args: cobra.ExactArgs(1), Args: cobra.ExactArgs(1),
DisableFlagsInUseLine: true, DisableFlagsInUseLine: true,
ValidArgsFunction: common.AutocompleteContainers,
} }
) )

View File

@ -4,12 +4,13 @@ import (
"context" "context"
"os" "os"
"github.com/containers/common/pkg/completion"
"github.com/containers/podman/v2/cmd/podman/common"
"github.com/containers/podman/v2/cmd/podman/parse" "github.com/containers/podman/v2/cmd/podman/parse"
"github.com/containers/podman/v2/cmd/podman/registry" "github.com/containers/podman/v2/cmd/podman/registry"
"github.com/containers/podman/v2/pkg/domain/entities" "github.com/containers/podman/v2/pkg/domain/entities"
"github.com/pkg/errors" "github.com/pkg/errors"
"github.com/spf13/cobra" "github.com/spf13/cobra"
"github.com/spf13/pflag"
"golang.org/x/crypto/ssh/terminal" "golang.org/x/crypto/ssh/terminal"
) )
@ -23,6 +24,7 @@ var (
Long: exportDescription, Long: exportDescription,
RunE: export, RunE: export,
Args: cobra.ExactArgs(1), Args: cobra.ExactArgs(1),
ValidArgsFunction: common.AutocompleteContainers,
Example: `podman export ctrID > myCtr.tar Example: `podman export ctrID > myCtr.tar
podman export --output="myCtr.tar" ctrID`, podman export --output="myCtr.tar" ctrID`,
} }
@ -33,6 +35,7 @@ var (
Short: exportCommand.Short, Short: exportCommand.Short,
Long: exportCommand.Long, Long: exportCommand.Long,
RunE: exportCommand.RunE, RunE: exportCommand.RunE,
ValidArgsFunction: exportCommand.ValidArgsFunction,
Example: `podman container export ctrID > myCtr.tar Example: `podman container export ctrID > myCtr.tar
podman container export --output="myCtr.tar" ctrID`, podman container export --output="myCtr.tar" ctrID`,
} }
@ -42,8 +45,12 @@ var (
exportOpts entities.ContainerExportOptions exportOpts entities.ContainerExportOptions
) )
func exportFlags(flags *pflag.FlagSet) { func exportFlags(cmd *cobra.Command) {
flags.StringVarP(&exportOpts.Output, "output", "o", "", "Write to a specified file (default: stdout, which must be redirected)") flags := cmd.Flags()
outputFlagName := "output"
flags.StringVarP(&exportOpts.Output, outputFlagName, "o", "", "Write to a specified file (default: stdout, which must be redirected)")
_ = cmd.RegisterFlagCompletionFunc(outputFlagName, completion.AutocompleteDefault)
} }
func init() { func init() {
@ -51,17 +58,14 @@ func init() {
Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode}, Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode},
Command: exportCommand, Command: exportCommand,
}) })
flags := exportCommand.Flags() exportFlags(exportCommand)
exportFlags(flags)
registry.Commands = append(registry.Commands, registry.CliCommand{ registry.Commands = append(registry.Commands, registry.CliCommand{
Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode}, Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode},
Command: containerExportCommand, Command: containerExportCommand,
Parent: containerCmd, Parent: containerCmd,
}) })
exportFlags(containerExportCommand)
containerExportFlags := containerExportCommand.Flags()
exportFlags(containerExportFlags)
} }
func export(cmd *cobra.Command, args []string) error { func export(cmd *cobra.Command, args []string) error {

View File

@ -3,6 +3,7 @@ package containers
import ( import (
"fmt" "fmt"
"github.com/containers/podman/v2/cmd/podman/common"
"github.com/containers/podman/v2/cmd/podman/registry" "github.com/containers/podman/v2/cmd/podman/registry"
"github.com/containers/podman/v2/cmd/podman/utils" "github.com/containers/podman/v2/cmd/podman/utils"
"github.com/containers/podman/v2/cmd/podman/validate" "github.com/containers/podman/v2/cmd/podman/validate"
@ -22,6 +23,7 @@ var (
Args: func(cmd *cobra.Command, args []string) error { Args: func(cmd *cobra.Command, args []string) error {
return validate.CheckAllLatestAndCIDFile(cmd, args, false, false) return validate.CheckAllLatestAndCIDFile(cmd, args, false, false)
}, },
ValidArgsFunction: common.AutocompleteContainersCreated,
Example: `podman init --latest Example: `podman init --latest
podman init 3c45ef19d893 podman init 3c45ef19d893
podman init test1`, podman init test1`,
@ -33,6 +35,7 @@ var (
Long: initCommand.Long, Long: initCommand.Long,
RunE: initCommand.RunE, RunE: initCommand.RunE,
Args: initCommand.Args, Args: initCommand.Args,
ValidArgsFunction: initCommand.ValidArgsFunction,
Example: `podman container init --latest Example: `podman container init --latest
podman container init 3c45ef19d893 podman container init 3c45ef19d893
podman container init test1`, podman container init test1`,

View File

@ -1,6 +1,7 @@
package containers package containers
import ( import (
"github.com/containers/podman/v2/cmd/podman/common"
"github.com/containers/podman/v2/cmd/podman/inspect" "github.com/containers/podman/v2/cmd/podman/inspect"
"github.com/containers/podman/v2/cmd/podman/registry" "github.com/containers/podman/v2/cmd/podman/registry"
"github.com/containers/podman/v2/cmd/podman/validate" "github.com/containers/podman/v2/cmd/podman/validate"
@ -15,6 +16,7 @@ var (
Short: "Display the configuration of a container", Short: "Display the configuration of a container",
Long: `Displays the low-level information on a container identified by name or ID.`, Long: `Displays the low-level information on a container identified by name or ID.`,
RunE: inspectExec, RunE: inspectExec,
ValidArgsFunction: common.AutocompleteContainers,
Example: `podman container inspect myCtr Example: `podman container inspect myCtr
podman container inspect -l --format '{{.Id}} {{.Config.Labels}}'`, podman container inspect -l --format '{{.Id}} {{.Config.Labels}}'`,
} }
@ -30,7 +32,11 @@ func init() {
inspectOpts = new(entities.InspectOptions) inspectOpts = new(entities.InspectOptions)
flags := inspectCmd.Flags() flags := inspectCmd.Flags()
flags.BoolVarP(&inspectOpts.Size, "size", "s", false, "Display total file size") flags.BoolVarP(&inspectOpts.Size, "size", "s", false, "Display total file size")
flags.StringVarP(&inspectOpts.Format, "format", "f", "json", "Format the output to a Go template or json")
formatFlagName := "format"
flags.StringVarP(&inspectOpts.Format, formatFlagName, "f", "json", "Format the output to a Go template or json")
_ = inspectCmd.RegisterFlagCompletionFunc(formatFlagName, common.AutocompleteJSONFormat)
validate.AddLatestFlag(inspectCmd, &inspectOpts.Latest) validate.AddLatestFlag(inspectCmd, &inspectOpts.Latest)
} }

View File

@ -5,13 +5,13 @@ import (
"errors" "errors"
"fmt" "fmt"
"github.com/containers/podman/v2/cmd/podman/common"
"github.com/containers/podman/v2/cmd/podman/registry" "github.com/containers/podman/v2/cmd/podman/registry"
"github.com/containers/podman/v2/cmd/podman/utils" "github.com/containers/podman/v2/cmd/podman/utils"
"github.com/containers/podman/v2/cmd/podman/validate" "github.com/containers/podman/v2/cmd/podman/validate"
"github.com/containers/podman/v2/pkg/domain/entities" "github.com/containers/podman/v2/pkg/domain/entities"
"github.com/containers/podman/v2/pkg/signal" "github.com/containers/podman/v2/pkg/signal"
"github.com/spf13/cobra" "github.com/spf13/cobra"
"github.com/spf13/pflag"
) )
var ( var (
@ -24,6 +24,7 @@ var (
Args: func(cmd *cobra.Command, args []string) error { Args: func(cmd *cobra.Command, args []string) error {
return validate.CheckAllLatestAndCIDFile(cmd, args, false, false) return validate.CheckAllLatestAndCIDFile(cmd, args, false, false)
}, },
ValidArgsFunction: common.AutocompleteContainersRunning,
Example: `podman kill mywebserver Example: `podman kill mywebserver
podman kill 860a4b23 podman kill 860a4b23
podman kill --signal TERM ctrID`, podman kill --signal TERM ctrID`,
@ -37,6 +38,7 @@ var (
Short: killCommand.Short, Short: killCommand.Short,
Long: killCommand.Long, Long: killCommand.Long,
RunE: killCommand.RunE, RunE: killCommand.RunE,
ValidArgsFunction: killCommand.ValidArgsFunction,
Example: `podman container kill mywebserver Example: `podman container kill mywebserver
podman container kill 860a4b23 podman container kill 860a4b23
podman container kill --signal TERM ctrID`, podman container kill --signal TERM ctrID`,
@ -47,9 +49,14 @@ var (
killOptions = entities.KillOptions{} killOptions = entities.KillOptions{}
) )
func killFlags(flags *pflag.FlagSet) { func killFlags(cmd *cobra.Command) {
flags := cmd.Flags()
flags.BoolVarP(&killOptions.All, "all", "a", false, "Signal all running containers") flags.BoolVarP(&killOptions.All, "all", "a", false, "Signal all running containers")
flags.StringVarP(&killOptions.Signal, "signal", "s", "KILL", "Signal to send to the container")
signalFlagName := "signal"
flags.StringVarP(&killOptions.Signal, signalFlagName, "s", "KILL", "Signal to send to the container")
_ = cmd.RegisterFlagCompletionFunc(signalFlagName, common.AutocompleteStopSignal)
} }
func init() { func init() {
@ -57,7 +64,7 @@ func init() {
Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode}, Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode},
Command: killCommand, Command: killCommand,
}) })
killFlags(killCommand.Flags()) killFlags(killCommand)
validate.AddLatestFlag(killCommand, &killOptions.Latest) validate.AddLatestFlag(killCommand, &killOptions.Latest)
registry.Commands = append(registry.Commands, registry.CliCommand{ registry.Commands = append(registry.Commands, registry.CliCommand{
@ -65,7 +72,7 @@ func init() {
Command: containerKillCommand, Command: containerKillCommand,
Parent: containerCmd, Parent: containerCmd,
}) })
killFlags(containerKillCommand.Flags()) killFlags(containerKillCommand)
validate.AddLatestFlag(containerKillCommand, &killOptions.Latest) validate.AddLatestFlag(containerKillCommand, &killOptions.Latest)
} }

View File

@ -1,6 +1,7 @@
package containers package containers
import ( import (
"github.com/containers/common/pkg/completion"
"github.com/containers/podman/v2/cmd/podman/registry" "github.com/containers/podman/v2/cmd/podman/registry"
"github.com/containers/podman/v2/cmd/podman/validate" "github.com/containers/podman/v2/cmd/podman/validate"
"github.com/containers/podman/v2/pkg/domain/entities" "github.com/containers/podman/v2/pkg/domain/entities"
@ -16,6 +17,7 @@ var (
Short: "List containers", Short: "List containers",
Long: "Prints out information about the containers", Long: "Prints out information about the containers",
RunE: ps, RunE: ps,
ValidArgsFunction: completion.AutocompleteNone,
Example: `podman container list -a Example: `podman container list -a
podman container list -a --format "{{.ID}} {{.Image}} {{.Labels}} {{.Mounts}}" podman container list -a --format "{{.ID}} {{.Image}} {{.Labels}} {{.Mounts}}"
podman container list --size --sort names`, podman container list --size --sort names`,
@ -28,6 +30,6 @@ func init() {
Command: listCmd, Command: listCmd,
Parent: containerCmd, Parent: containerCmd,
}) })
listFlagSet(listCmd.Flags()) listFlagSet(listCmd)
validate.AddLatestFlag(listCmd, &listOpts.Latest) validate.AddLatestFlag(listCmd, &listOpts.Latest)
} }

View File

@ -3,13 +3,14 @@ package containers
import ( import (
"os" "os"
"github.com/containers/common/pkg/completion"
"github.com/containers/podman/v2/cmd/podman/common"
"github.com/containers/podman/v2/cmd/podman/registry" "github.com/containers/podman/v2/cmd/podman/registry"
"github.com/containers/podman/v2/cmd/podman/validate" "github.com/containers/podman/v2/cmd/podman/validate"
"github.com/containers/podman/v2/pkg/domain/entities" "github.com/containers/podman/v2/pkg/domain/entities"
"github.com/containers/podman/v2/pkg/util" "github.com/containers/podman/v2/pkg/util"
"github.com/pkg/errors" "github.com/pkg/errors"
"github.com/spf13/cobra" "github.com/spf13/cobra"
"github.com/spf13/pflag"
) )
// logsOptionsWrapper wraps entities.LogsOptions and prevents leaking // logsOptionsWrapper wraps entities.LogsOptions and prevents leaking
@ -44,6 +45,7 @@ var (
return nil return nil
}, },
RunE: logs, RunE: logs,
ValidArgsFunction: common.AutocompleteContainers,
Example: `podman logs ctrID Example: `podman logs ctrID
podman logs --names ctrID1 ctrID2 podman logs --names ctrID1 ctrID2
podman logs --tail 2 mywebserver podman logs --tail 2 mywebserver
@ -57,6 +59,7 @@ var (
Long: logsCommand.Long, Long: logsCommand.Long,
Args: logsCommand.Args, Args: logsCommand.Args,
RunE: logsCommand.RunE, RunE: logsCommand.RunE,
ValidArgsFunction: logsCommand.ValidArgsFunction,
Example: `podman container logs ctrID Example: `podman container logs ctrID
podman container logs --names ctrID1 ctrID2 podman container logs --names ctrID1 ctrID2
podman container logs --tail 2 mywebserver podman container logs --tail 2 mywebserver
@ -71,7 +74,7 @@ func init() {
Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode}, Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode},
Command: logsCommand, Command: logsCommand,
}) })
logsFlags(logsCommand.Flags()) logsFlags(logsCommand)
validate.AddLatestFlag(logsCommand, &logsOptions.Latest) validate.AddLatestFlag(logsCommand, &logsOptions.Latest)
// container logs // container logs
@ -80,15 +83,24 @@ func init() {
Command: containerLogsCommand, Command: containerLogsCommand,
Parent: containerCmd, Parent: containerCmd,
}) })
logsFlags(containerLogsCommand.Flags()) logsFlags(containerLogsCommand)
validate.AddLatestFlag(containerLogsCommand, &logsOptions.Latest) validate.AddLatestFlag(containerLogsCommand, &logsOptions.Latest)
} }
func logsFlags(flags *pflag.FlagSet) { func logsFlags(cmd *cobra.Command) {
flags := cmd.Flags()
flags.BoolVar(&logsOptions.Details, "details", false, "Show extra details provided to the logs") flags.BoolVar(&logsOptions.Details, "details", false, "Show extra details provided to the logs")
flags.BoolVarP(&logsOptions.Follow, "follow", "f", false, "Follow log output. The default is false") flags.BoolVarP(&logsOptions.Follow, "follow", "f", false, "Follow log output. The default is false")
flags.StringVar(&logsOptions.SinceRaw, "since", "", "Show logs since TIMESTAMP")
flags.Int64Var(&logsOptions.Tail, "tail", -1, "Output the specified number of LINES at the end of the logs. Defaults to -1, which prints all lines") sinceFlagName := "since"
flags.StringVar(&logsOptions.SinceRaw, sinceFlagName, "", "Show logs since TIMESTAMP")
_ = cmd.RegisterFlagCompletionFunc(sinceFlagName, completion.AutocompleteNone)
tailFlagName := "tail"
flags.Int64Var(&logsOptions.Tail, tailFlagName, -1, "Output the specified number of LINES at the end of the logs. Defaults to -1, which prints all lines")
_ = cmd.RegisterFlagCompletionFunc(tailFlagName, completion.AutocompleteNone)
flags.BoolVarP(&logsOptions.Timestamps, "timestamps", "t", false, "Output the timestamps in the log") flags.BoolVarP(&logsOptions.Timestamps, "timestamps", "t", false, "Output the timestamps in the log")
flags.BoolVarP(&logsOptions.Names, "names", "n", false, "Output the container name in the log") flags.BoolVarP(&logsOptions.Names, "names", "n", false, "Output the container name in the log")
flags.SetInterspersed(false) flags.SetInterspersed(false)

View File

@ -7,13 +7,13 @@ import (
"text/template" "text/template"
"github.com/containers/common/pkg/report" "github.com/containers/common/pkg/report"
"github.com/containers/podman/v2/cmd/podman/common"
"github.com/containers/podman/v2/cmd/podman/registry" "github.com/containers/podman/v2/cmd/podman/registry"
"github.com/containers/podman/v2/cmd/podman/utils" "github.com/containers/podman/v2/cmd/podman/utils"
"github.com/containers/podman/v2/cmd/podman/validate" "github.com/containers/podman/v2/cmd/podman/validate"
"github.com/containers/podman/v2/pkg/domain/entities" "github.com/containers/podman/v2/pkg/domain/entities"
"github.com/pkg/errors" "github.com/pkg/errors"
"github.com/spf13/cobra" "github.com/spf13/cobra"
"github.com/spf13/pflag"
) )
var ( var (
@ -36,6 +36,7 @@ var (
registry.UnshareNSRequired: "", registry.UnshareNSRequired: "",
registry.ParentNSRequired: "", registry.ParentNSRequired: "",
}, },
ValidArgsFunction: common.AutocompleteContainers,
} }
containerMountCommmand = &cobra.Command{ containerMountCommmand = &cobra.Command{
@ -45,6 +46,7 @@ var (
RunE: mountCommand.RunE, RunE: mountCommand.RunE,
Args: mountCommand.Args, Args: mountCommand.Args,
Annotations: mountCommand.Annotations, Annotations: mountCommand.Annotations,
ValidArgsFunction: mountCommand.ValidArgsFunction,
} }
) )
@ -52,9 +54,15 @@ var (
mountOpts entities.ContainerMountOptions mountOpts entities.ContainerMountOptions
) )
func mountFlags(flags *pflag.FlagSet) { func mountFlags(cmd *cobra.Command) {
flags := cmd.Flags()
flags.BoolVarP(&mountOpts.All, "all", "a", false, "Mount all containers") flags.BoolVarP(&mountOpts.All, "all", "a", false, "Mount all containers")
flags.StringVar(&mountOpts.Format, "format", "", "Print the mounted containers in specified format (json)")
formatFlagName := "format"
flags.StringVar(&mountOpts.Format, formatFlagName, "", "Print the mounted containers in specified format (json)")
_ = cmd.RegisterFlagCompletionFunc(formatFlagName, common.AutocompleteJSONFormat)
flags.BoolVar(&mountOpts.NoTruncate, "notruncate", false, "Do not truncate output") flags.BoolVar(&mountOpts.NoTruncate, "notruncate", false, "Do not truncate output")
} }
@ -63,7 +71,7 @@ func init() {
Mode: []entities.EngineMode{entities.ABIMode}, Mode: []entities.EngineMode{entities.ABIMode},
Command: mountCommand, Command: mountCommand,
}) })
mountFlags(mountCommand.Flags()) mountFlags(mountCommand)
validate.AddLatestFlag(mountCommand, &mountOpts.Latest) validate.AddLatestFlag(mountCommand, &mountOpts.Latest)
registry.Commands = append(registry.Commands, registry.CliCommand{ registry.Commands = append(registry.Commands, registry.CliCommand{
@ -71,7 +79,7 @@ func init() {
Command: containerMountCommmand, Command: containerMountCommmand,
Parent: containerCmd, Parent: containerCmd,
}) })
mountFlags(containerMountCommmand.Flags()) mountFlags(containerMountCommmand)
validate.AddLatestFlag(containerMountCommmand, &mountOpts.Latest) validate.AddLatestFlag(containerMountCommmand, &mountOpts.Latest)
} }

View File

@ -4,6 +4,7 @@ import (
"context" "context"
"fmt" "fmt"
"github.com/containers/podman/v2/cmd/podman/common"
"github.com/containers/podman/v2/cmd/podman/registry" "github.com/containers/podman/v2/cmd/podman/registry"
"github.com/containers/podman/v2/cmd/podman/utils" "github.com/containers/podman/v2/cmd/podman/utils"
"github.com/containers/podman/v2/pkg/cgroups" "github.com/containers/podman/v2/pkg/cgroups"
@ -21,6 +22,7 @@ var (
Short: "Pause all the processes in one or more containers", Short: "Pause all the processes in one or more containers",
Long: pauseDescription, Long: pauseDescription,
RunE: pause, RunE: pause,
ValidArgsFunction: common.AutocompleteContainersRunning,
Example: `podman pause mywebserver Example: `podman pause mywebserver
podman pause 860a4b23 podman pause 860a4b23
podman pause -a`, podman pause -a`,
@ -31,6 +33,7 @@ var (
Short: pauseCommand.Short, Short: pauseCommand.Short,
Long: pauseCommand.Long, Long: pauseCommand.Long,
RunE: pauseCommand.RunE, RunE: pauseCommand.RunE,
ValidArgsFunction: pauseCommand.ValidArgsFunction,
Example: `podman container pause mywebserver Example: `podman container pause mywebserver
podman container pause 860a4b23 podman container pause 860a4b23
podman container pause -a`, podman container pause -a`,

View File

@ -5,6 +5,7 @@ import (
"strconv" "strconv"
"strings" "strings"
"github.com/containers/podman/v2/cmd/podman/common"
"github.com/containers/podman/v2/cmd/podman/registry" "github.com/containers/podman/v2/cmd/podman/registry"
"github.com/containers/podman/v2/cmd/podman/validate" "github.com/containers/podman/v2/cmd/podman/validate"
"github.com/containers/podman/v2/pkg/domain/entities" "github.com/containers/podman/v2/pkg/domain/entities"
@ -25,6 +26,7 @@ var (
Args: func(cmd *cobra.Command, args []string) error { Args: func(cmd *cobra.Command, args []string) error {
return validate.CheckAllLatestAndCIDFile(cmd, args, true, false) return validate.CheckAllLatestAndCIDFile(cmd, args, true, false)
}, },
ValidArgsFunction: common.AutocompleteContainers,
Example: `podman port --all Example: `podman port --all
podman port ctrID 80/tcp podman port ctrID 80/tcp
podman port --latest 80`, podman port --latest 80`,
@ -38,6 +40,7 @@ var (
Args: func(cmd *cobra.Command, args []string) error { Args: func(cmd *cobra.Command, args []string) error {
return validate.CheckAllLatestAndCIDFile(cmd, args, true, false) return validate.CheckAllLatestAndCIDFile(cmd, args, true, false)
}, },
ValidArgsFunction: portCommand.ValidArgsFunction,
Example: `podman container port --all Example: `podman container port --all
podman container port --latest 80`, podman container port --latest 80`,
} }

View File

@ -8,6 +8,7 @@ import (
"os" "os"
"strings" "strings"
"github.com/containers/common/pkg/completion"
"github.com/containers/podman/v2/cmd/podman/registry" "github.com/containers/podman/v2/cmd/podman/registry"
"github.com/containers/podman/v2/cmd/podman/utils" "github.com/containers/podman/v2/cmd/podman/utils"
"github.com/containers/podman/v2/cmd/podman/validate" "github.com/containers/podman/v2/cmd/podman/validate"
@ -25,6 +26,7 @@ var (
Short: "Remove all non running containers", Short: "Remove all non running containers",
Long: pruneDescription, Long: pruneDescription,
RunE: prune, RunE: prune,
ValidArgsFunction: completion.AutocompleteNone,
Example: `podman container prune`, Example: `podman container prune`,
Args: validate.NoArgs, Args: validate.NoArgs,
} }
@ -40,7 +42,9 @@ func init() {
}) })
flags := pruneCommand.Flags() flags := pruneCommand.Flags()
flags.BoolVarP(&force, "force", "f", false, "Do not prompt for confirmation. The default is false") flags.BoolVarP(&force, "force", "f", false, "Do not prompt for confirmation. The default is false")
flags.StringArrayVar(&filter, "filter", []string{}, "Provide filter values (e.g. 'label=<key>=<value>')") filterFlagName := "filter"
flags.StringArrayVar(&filter, filterFlagName, []string{}, "Provide filter values (e.g. 'label=<key>=<value>')")
_ = pruneCommand.RegisterFlagCompletionFunc(filterFlagName, completion.AutocompleteNone)
} }
func prune(cmd *cobra.Command, args []string) error { func prune(cmd *cobra.Command, args []string) error {

View File

@ -11,7 +11,9 @@ import (
"time" "time"
tm "github.com/buger/goterm" tm "github.com/buger/goterm"
"github.com/containers/common/pkg/completion"
"github.com/containers/common/pkg/report" "github.com/containers/common/pkg/report"
"github.com/containers/podman/v2/cmd/podman/common"
"github.com/containers/podman/v2/cmd/podman/parse" "github.com/containers/podman/v2/cmd/podman/parse"
"github.com/containers/podman/v2/cmd/podman/registry" "github.com/containers/podman/v2/cmd/podman/registry"
"github.com/containers/podman/v2/cmd/podman/utils" "github.com/containers/podman/v2/cmd/podman/utils"
@ -21,7 +23,6 @@ import (
"github.com/docker/go-units" "github.com/docker/go-units"
"github.com/pkg/errors" "github.com/pkg/errors"
"github.com/spf13/cobra" "github.com/spf13/cobra"
"github.com/spf13/pflag"
) )
var ( var (
@ -32,6 +33,7 @@ var (
Short: "List containers", Short: "List containers",
Long: psDescription, Long: psDescription,
RunE: ps, RunE: ps,
ValidArgsFunction: completion.AutocompleteNone,
Example: `podman ps -a Example: `podman ps -a
podman ps -a --format "{{.ID}} {{.Image}} {{.Labels}} {{.Mounts}}" podman ps -a --format "{{.ID}} {{.Image}} {{.Labels}} {{.Mounts}}"
podman ps --size --sort names`, podman ps --size --sort names`,
@ -50,26 +52,45 @@ func init() {
Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode}, Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode},
Command: psCommand, Command: psCommand,
}) })
listFlagSet(psCommand.Flags()) listFlagSet(psCommand)
validate.AddLatestFlag(psCommand, &listOpts.Latest) validate.AddLatestFlag(psCommand, &listOpts.Latest)
} }
func listFlagSet(flags *pflag.FlagSet) { func listFlagSet(cmd *cobra.Command) {
flags := cmd.Flags()
flags.BoolVarP(&listOpts.All, "all", "a", false, "Show all the containers, default is only running containers") flags.BoolVarP(&listOpts.All, "all", "a", false, "Show all the containers, default is only running containers")
flags.StringSliceVarP(&filters, "filter", "f", []string{}, "Filter output based on conditions given")
flags.BoolVar(&listOpts.Storage, "external", false, "Show containers in storage not controlled by Podman") flags.BoolVar(&listOpts.Storage, "external", false, "Show containers in storage not controlled by Podman")
flags.StringVar(&listOpts.Format, "format", "", "Pretty-print containers to JSON or using a Go template")
flags.IntVarP(&listOpts.Last, "last", "n", -1, "Print the n last created containers (all states)") filterFlagName := "filter"
flags.StringSliceVarP(&filters, filterFlagName, "f", []string{}, "Filter output based on conditions given")
//TODO add custom filter function
_ = cmd.RegisterFlagCompletionFunc(filterFlagName, completion.AutocompleteNone)
formatFlagName := "format"
flags.StringVar(&listOpts.Format, formatFlagName, "", "Pretty-print containers to JSON or using a Go template")
_ = cmd.RegisterFlagCompletionFunc(formatFlagName, common.AutocompleteJSONFormat)
lastFlagName := "last"
flags.IntVarP(&listOpts.Last, lastFlagName, "n", -1, "Print the n last created containers (all states)")
_ = cmd.RegisterFlagCompletionFunc(lastFlagName, completion.AutocompleteNone)
flags.BoolVar(&listOpts.Namespace, "ns", false, "Display namespace information") flags.BoolVar(&listOpts.Namespace, "ns", false, "Display namespace information")
flags.BoolVar(&noTrunc, "no-trunc", false, "Display the extended information") flags.BoolVar(&noTrunc, "no-trunc", false, "Display the extended information")
flags.BoolVarP(&listOpts.Pod, "pod", "p", false, "Print the ID and name of the pod the containers are associated with") flags.BoolVarP(&listOpts.Pod, "pod", "p", false, "Print the ID and name of the pod the containers are associated with")
flags.BoolVarP(&listOpts.Quiet, "quiet", "q", false, "Print the numeric IDs of the containers only") flags.BoolVarP(&listOpts.Quiet, "quiet", "q", false, "Print the numeric IDs of the containers only")
flags.BoolVarP(&listOpts.Size, "size", "s", false, "Display the total file sizes") flags.BoolVarP(&listOpts.Size, "size", "s", false, "Display the total file sizes")
flags.BoolVar(&listOpts.Sync, "sync", false, "Sync container state with OCI runtime") flags.BoolVar(&listOpts.Sync, "sync", false, "Sync container state with OCI runtime")
flags.UintVarP(&listOpts.Watch, "watch", "w", 0, "Watch the ps output on an interval in seconds")
watchFlagName := "watch"
flags.UintVarP(&listOpts.Watch, watchFlagName, "w", 0, "Watch the ps output on an interval in seconds")
_ = cmd.RegisterFlagCompletionFunc(watchFlagName, completion.AutocompleteNone)
sort := validate.Value(&listOpts.Sort, "command", "created", "id", "image", "names", "runningfor", "size", "status") sort := validate.Value(&listOpts.Sort, "command", "created", "id", "image", "names", "runningfor", "size", "status")
flags.Var(sort, "sort", "Sort output by: "+sort.Choices()) sortFlagName := "sort"
flags.Var(sort, sortFlagName, "Sort output by: "+sort.Choices())
_ = cmd.RegisterFlagCompletionFunc(sortFlagName, common.AutocompletePsSort)
flags.SetNormalizeFunc(utils.AliasFlags) flags.SetNormalizeFunc(utils.AliasFlags)
} }
func checkFlags(c *cobra.Command) error { func checkFlags(c *cobra.Command) error {

View File

@ -4,6 +4,8 @@ import (
"context" "context"
"fmt" "fmt"
"github.com/containers/common/pkg/completion"
"github.com/containers/podman/v2/cmd/podman/common"
"github.com/containers/podman/v2/cmd/podman/registry" "github.com/containers/podman/v2/cmd/podman/registry"
"github.com/containers/podman/v2/cmd/podman/utils" "github.com/containers/podman/v2/cmd/podman/utils"
"github.com/containers/podman/v2/cmd/podman/validate" "github.com/containers/podman/v2/cmd/podman/validate"
@ -11,7 +13,6 @@ import (
"github.com/containers/podman/v2/pkg/domain/entities" "github.com/containers/podman/v2/pkg/domain/entities"
"github.com/pkg/errors" "github.com/pkg/errors"
"github.com/spf13/cobra" "github.com/spf13/cobra"
"github.com/spf13/pflag"
) )
var ( var (
@ -27,6 +28,7 @@ var (
Args: func(cmd *cobra.Command, args []string) error { Args: func(cmd *cobra.Command, args []string) error {
return validate.CheckAllLatestAndCIDFile(cmd, args, false, false) return validate.CheckAllLatestAndCIDFile(cmd, args, false, false)
}, },
ValidArgsFunction: common.AutocompleteContainers,
Example: `podman restart ctrID Example: `podman restart ctrID
podman restart --latest podman restart --latest
podman restart ctrID1 ctrID2`, podman restart ctrID1 ctrID2`,
@ -37,6 +39,7 @@ var (
Short: restartCommand.Short, Short: restartCommand.Short,
Long: restartCommand.Long, Long: restartCommand.Long,
RunE: restartCommand.RunE, RunE: restartCommand.RunE,
ValidArgsFunction: restartCommand.ValidArgsFunction,
Example: `podman container restart ctrID Example: `podman container restart ctrID
podman container restart --latest podman container restart --latest
podman container restart ctrID1 ctrID2`, podman container restart ctrID1 ctrID2`,
@ -48,10 +51,15 @@ var (
restartTimeout uint restartTimeout uint
) )
func restartFlags(flags *pflag.FlagSet) { func restartFlags(cmd *cobra.Command) {
flags := cmd.Flags()
flags.BoolVarP(&restartOptions.All, "all", "a", false, "Restart all non-running containers") flags.BoolVarP(&restartOptions.All, "all", "a", false, "Restart all non-running containers")
flags.BoolVar(&restartOptions.Running, "running", false, "Restart only running containers when --all is used") flags.BoolVar(&restartOptions.Running, "running", false, "Restart only running containers when --all is used")
flags.UintVarP(&restartTimeout, "time", "t", containerConfig.Engine.StopTimeout, "Seconds to wait for stop before killing the container")
timeFlagName := "time"
flags.UintVarP(&restartTimeout, timeFlagName, "t", containerConfig.Engine.StopTimeout, "Seconds to wait for stop before killing the container")
_ = cmd.RegisterFlagCompletionFunc(timeFlagName, completion.AutocompleteNone)
flags.SetNormalizeFunc(utils.AliasFlags) flags.SetNormalizeFunc(utils.AliasFlags)
} }
@ -61,7 +69,7 @@ func init() {
Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode}, Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode},
Command: restartCommand, Command: restartCommand,
}) })
restartFlags(restartCommand.Flags()) restartFlags(restartCommand)
validate.AddLatestFlag(restartCommand, &restartOptions.Latest) validate.AddLatestFlag(restartCommand, &restartOptions.Latest)
registry.Commands = append(registry.Commands, registry.CliCommand{ registry.Commands = append(registry.Commands, registry.CliCommand{
@ -69,7 +77,7 @@ func init() {
Command: containerRestartCommand, Command: containerRestartCommand,
Parent: containerCmd, Parent: containerCmd,
}) })
restartFlags(containerRestartCommand.Flags()) restartFlags(containerRestartCommand)
validate.AddLatestFlag(containerRestartCommand, &restartOptions.Latest) validate.AddLatestFlag(containerRestartCommand, &restartOptions.Latest)
} }

View File

@ -4,6 +4,8 @@ import (
"context" "context"
"fmt" "fmt"
"github.com/containers/common/pkg/completion"
"github.com/containers/podman/v2/cmd/podman/common"
"github.com/containers/podman/v2/cmd/podman/registry" "github.com/containers/podman/v2/cmd/podman/registry"
"github.com/containers/podman/v2/cmd/podman/utils" "github.com/containers/podman/v2/cmd/podman/utils"
"github.com/containers/podman/v2/cmd/podman/validate" "github.com/containers/podman/v2/cmd/podman/validate"
@ -27,6 +29,7 @@ var (
Args: func(cmd *cobra.Command, args []string) error { Args: func(cmd *cobra.Command, args []string) error {
return validate.CheckAllLatestAndCIDFile(cmd, args, true, false) return validate.CheckAllLatestAndCIDFile(cmd, args, true, false)
}, },
ValidArgsFunction: common.AutocompleteContainers,
Example: `podman container restore ctrID Example: `podman container restore ctrID
podman container restore --latest podman container restore --latest
podman container restore --all`, podman container restore --all`,
@ -47,8 +50,15 @@ func init() {
flags.BoolVarP(&restoreOptions.All, "all", "a", false, "Restore all checkpointed containers") flags.BoolVarP(&restoreOptions.All, "all", "a", false, "Restore all checkpointed containers")
flags.BoolVarP(&restoreOptions.Keep, "keep", "k", false, "Keep all temporary checkpoint files") flags.BoolVarP(&restoreOptions.Keep, "keep", "k", false, "Keep all temporary checkpoint files")
flags.BoolVar(&restoreOptions.TCPEstablished, "tcp-established", false, "Restore a container with established TCP connections") flags.BoolVar(&restoreOptions.TCPEstablished, "tcp-established", false, "Restore a container with established TCP connections")
flags.StringVarP(&restoreOptions.Import, "import", "i", "", "Restore from exported checkpoint archive (tar.gz)")
flags.StringVarP(&restoreOptions.Name, "name", "n", "", "Specify new name for container restored from exported checkpoint (only works with --import)") importFlagName := "import"
flags.StringVarP(&restoreOptions.Import, importFlagName, "i", "", "Restore from exported checkpoint archive (tar.gz)")
_ = restoreCommand.RegisterFlagCompletionFunc(importFlagName, completion.AutocompleteDefault)
nameFlagName := "name"
flags.StringVarP(&restoreOptions.Name, nameFlagName, "n", "", "Specify new name for container restored from exported checkpoint (only works with --import)")
_ = restoreCommand.RegisterFlagCompletionFunc(nameFlagName, completion.AutocompleteNone)
flags.BoolVar(&restoreOptions.IgnoreRootFS, "ignore-rootfs", false, "Do not apply root file-system changes when importing from exported checkpoint") flags.BoolVar(&restoreOptions.IgnoreRootFS, "ignore-rootfs", false, "Do not apply root file-system changes when importing from exported checkpoint")
flags.BoolVar(&restoreOptions.IgnoreStaticIP, "ignore-static-ip", false, "Ignore IP address set via --static-ip") flags.BoolVar(&restoreOptions.IgnoreStaticIP, "ignore-static-ip", false, "Ignore IP address set via --static-ip")
flags.BoolVar(&restoreOptions.IgnoreStaticMAC, "ignore-static-mac", false, "Ignore MAC address set via --mac-address") flags.BoolVar(&restoreOptions.IgnoreStaticMAC, "ignore-static-mac", false, "Ignore MAC address set via --mac-address")

View File

@ -5,6 +5,8 @@ import (
"fmt" "fmt"
"strings" "strings"
"github.com/containers/common/pkg/completion"
"github.com/containers/podman/v2/cmd/podman/common"
"github.com/containers/podman/v2/cmd/podman/registry" "github.com/containers/podman/v2/cmd/podman/registry"
"github.com/containers/podman/v2/cmd/podman/utils" "github.com/containers/podman/v2/cmd/podman/utils"
"github.com/containers/podman/v2/cmd/podman/validate" "github.com/containers/podman/v2/cmd/podman/validate"
@ -13,7 +15,6 @@ import (
"github.com/pkg/errors" "github.com/pkg/errors"
"github.com/sirupsen/logrus" "github.com/sirupsen/logrus"
"github.com/spf13/cobra" "github.com/spf13/cobra"
"github.com/spf13/pflag"
) )
var ( var (
@ -28,6 +29,7 @@ var (
Args: func(cmd *cobra.Command, args []string) error { Args: func(cmd *cobra.Command, args []string) error {
return validate.CheckAllLatestAndCIDFile(cmd, args, false, true) return validate.CheckAllLatestAndCIDFile(cmd, args, false, true)
}, },
ValidArgsFunction: common.AutocompleteContainers,
Example: `podman rm imageID Example: `podman rm imageID
podman rm mywebserver myflaskserver 860a4b23 podman rm mywebserver myflaskserver 860a4b23
podman rm --force --all podman rm --force --all
@ -42,6 +44,7 @@ var (
Args: func(cmd *cobra.Command, args []string) error { Args: func(cmd *cobra.Command, args []string) error {
return validate.CheckAllLatestAndCIDFile(cmd, args, false, true) return validate.CheckAllLatestAndCIDFile(cmd, args, false, true)
}, },
ValidArgsFunction: rmCommand.ValidArgsFunction,
Example: `podman container rm imageID Example: `podman container rm imageID
podman container rm mywebserver myflaskserver 860a4b23 podman container rm mywebserver myflaskserver 860a4b23
podman container rm --force --all podman container rm --force --all
@ -53,12 +56,17 @@ var (
rmOptions = entities.RmOptions{} rmOptions = entities.RmOptions{}
) )
func rmFlags(flags *pflag.FlagSet) { func rmFlags(cmd *cobra.Command) {
flags := cmd.Flags()
flags.BoolVarP(&rmOptions.All, "all", "a", false, "Remove all containers") 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.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.Force, "force", "f", false, "Force removal of a running or unusable container. The default is false")
flags.BoolVarP(&rmOptions.Volumes, "volumes", "v", false, "Remove anonymous volumes associated with the container") 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")
cidfileFlagName := "cidfile"
flags.StringArrayVarP(&rmOptions.CIDFiles, cidfileFlagName, "", nil, "Read the container ID from the file")
_ = cmd.RegisterFlagCompletionFunc(cidfileFlagName, completion.AutocompleteDefault)
if !registry.IsRemote() { if !registry.IsRemote() {
// This option is deprecated, but needs to still exists for backwards compatibility // This option is deprecated, but needs to still exists for backwards compatibility
@ -72,7 +80,7 @@ func init() {
Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode}, Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode},
Command: rmCommand, Command: rmCommand,
}) })
rmFlags(rmCommand.Flags()) rmFlags(rmCommand)
validate.AddLatestFlag(rmCommand, &rmOptions.Latest) validate.AddLatestFlag(rmCommand, &rmOptions.Latest)
registry.Commands = append(registry.Commands, registry.CliCommand{ registry.Commands = append(registry.Commands, registry.CliCommand{
@ -80,7 +88,7 @@ func init() {
Command: containerRmCommand, Command: containerRmCommand,
Parent: containerCmd, Parent: containerCmd,
}) })
rmFlags(containerRmCommand.Flags()) rmFlags(containerRmCommand)
validate.AddLatestFlag(containerRmCommand, &rmOptions.Latest) validate.AddLatestFlag(containerRmCommand, &rmOptions.Latest)
} }

View File

@ -6,6 +6,7 @@ import (
"strconv" "strconv"
"strings" "strings"
"github.com/containers/common/pkg/completion"
"github.com/containers/podman/v2/cmd/podman/common" "github.com/containers/podman/v2/cmd/podman/common"
"github.com/containers/podman/v2/cmd/podman/registry" "github.com/containers/podman/v2/cmd/podman/registry"
"github.com/containers/podman/v2/cmd/podman/utils" "github.com/containers/podman/v2/cmd/podman/utils"
@ -18,7 +19,6 @@ import (
"github.com/pkg/errors" "github.com/pkg/errors"
"github.com/sirupsen/logrus" "github.com/sirupsen/logrus"
"github.com/spf13/cobra" "github.com/spf13/cobra"
"github.com/spf13/pflag"
) )
var ( var (
@ -29,6 +29,7 @@ var (
Short: "Run a command in a new container", Short: "Run a command in a new container",
Long: runDescription, Long: runDescription,
RunE: run, RunE: run,
ValidArgsFunction: common.AutocompleteCreateRun,
Example: `podman run imageID ls -alF /etc Example: `podman run imageID ls -alF /etc
podman run --network=host imageID dnf -y install java podman run --network=host imageID dnf -y install java
podman run --volume /var/hostdir:/var/ctrdir -i -t fedora /bin/bash`, podman run --volume /var/hostdir:/var/ctrdir -i -t fedora /bin/bash`,
@ -40,6 +41,7 @@ var (
Short: runCommand.Short, Short: runCommand.Short,
Long: runCommand.Long, Long: runCommand.Long,
RunE: runCommand.RunE, RunE: runCommand.RunE,
ValidArgsFunction: runCommand.ValidArgsFunction,
Example: `podman container run imageID ls -alF /etc Example: `podman container run imageID ls -alF /etc
podman container run --network=host imageID dnf -y install java 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 --volume /var/hostdir:/var/ctrdir -i -t fedora /bin/bash`,
@ -55,16 +57,26 @@ var (
runRmi bool runRmi bool
) )
func runFlags(flags *pflag.FlagSet) { func runFlags(cmd *cobra.Command) {
flags := cmd.Flags()
flags.SetInterspersed(false) flags.SetInterspersed(false)
flags.AddFlagSet(common.GetCreateFlags(&cliVals)) common.DefineCreateFlags(cmd, &cliVals)
flags.AddFlagSet(common.GetNetFlags()) common.DefineNetFlags(cmd)
flags.SetNormalizeFunc(utils.AliasFlags) flags.SetNormalizeFunc(utils.AliasFlags)
flags.BoolVar(&runOpts.SigProxy, "sig-proxy", true, "Proxy received signals to the process") flags.BoolVar(&runOpts.SigProxy, "sig-proxy", true, "Proxy received signals to the process")
flags.BoolVar(&runRmi, "rmi", false, "Remove container image unless used by other containers") flags.BoolVar(&runRmi, "rmi", false, "Remove container image unless used by other containers")
preserveFdsFlagName := "preserve-fds"
flags.UintVar(&runOpts.PreserveFDs, "preserve-fds", 0, "Pass a number of additional file descriptors into the container") flags.UintVar(&runOpts.PreserveFDs, "preserve-fds", 0, "Pass a number of additional file descriptors into the container")
_ = cmd.RegisterFlagCompletionFunc(preserveFdsFlagName, completion.AutocompleteNone)
flags.BoolVarP(&runOpts.Detach, "detach", "d", false, "Run container in background and print container ID") flags.BoolVarP(&runOpts.Detach, "detach", "d", false, "Run container in background and print container ID")
flags.StringVar(&runOpts.DetachKeys, "detach-keys", containerConfig.DetachKeys(), "Override 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-cf`, `@`, `^`, `[`, `\\`, `]`, `^` or `_`")
detachKeysFlagName := "detach-keys"
flags.StringVar(&runOpts.DetachKeys, detachKeysFlagName, containerConfig.DetachKeys(), "Override 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-cf`, `@`, `^`, `[`, `\\`, `]`, `^` or `_`")
_ = cmd.RegisterFlagCompletionFunc(detachKeysFlagName, common.AutocompleteDetachKeys)
_ = flags.MarkHidden("signature-policy") _ = flags.MarkHidden("signature-policy")
if registry.IsRemote() { if registry.IsRemote() {
@ -77,8 +89,8 @@ func init() {
Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode}, Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode},
Command: runCommand, Command: runCommand,
}) })
flags := runCommand.Flags()
runFlags(flags) runFlags(runCommand)
registry.Commands = append(registry.Commands, registry.CliCommand{ registry.Commands = append(registry.Commands, registry.CliCommand{
Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode}, Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode},
@ -86,8 +98,7 @@ func init() {
Parent: containerCmd, Parent: containerCmd,
}) })
containerRunFlags := containerRunCommand.Flags() runFlags(containerRunCommand)
runFlags(containerRunFlags)
} }
func run(cmd *cobra.Command, args []string) error { func run(cmd *cobra.Command, args []string) error {

View File

@ -5,7 +5,9 @@ import (
"os" "os"
"github.com/containers/common/pkg/auth" "github.com/containers/common/pkg/auth"
"github.com/containers/common/pkg/completion"
"github.com/containers/image/v5/types" "github.com/containers/image/v5/types"
"github.com/containers/podman/v2/cmd/podman/common"
"github.com/containers/podman/v2/cmd/podman/registry" "github.com/containers/podman/v2/cmd/podman/registry"
"github.com/containers/podman/v2/pkg/domain/entities" "github.com/containers/podman/v2/pkg/domain/entities"
"github.com/sirupsen/logrus" "github.com/sirupsen/logrus"
@ -28,6 +30,7 @@ var (
Long: runlabelDescription, Long: runlabelDescription,
RunE: runlabel, RunE: runlabel,
Args: cobra.MinimumNArgs(2), Args: cobra.MinimumNArgs(2),
ValidArgsFunction: common.AutocompleteImages,
Example: `podman container runlabel run imageID Example: `podman container runlabel run imageID
podman container runlabel install imageID arg1 arg2 podman container runlabel install imageID arg1 arg2
podman container runlabel --display run myImage`, podman container runlabel --display run myImage`,
@ -42,11 +45,25 @@ func init() {
}) })
flags := runlabelCommand.Flags() flags := runlabelCommand.Flags()
flags.StringVar(&runlabelOptions.Authfile, "authfile", auth.GetDefaultAuthFile(), "Path of the authentication file. Use REGISTRY_AUTH_FILE environment variable to override")
flags.StringVar(&runlabelOptions.CertDir, "cert-dir", "", "`Pathname` of a directory containing TLS certificates and keys") authfileflagName := "authfile"
flags.StringVar(&runlabelOptions.Credentials, "creds", "", "`Credentials` (USERNAME:PASSWORD) to use for authenticating to a registry") flags.StringVar(&runlabelOptions.Authfile, authfileflagName, auth.GetDefaultAuthFile(), "Path of the authentication file. Use REGISTRY_AUTH_FILE environment variable to override")
_ = runlabelCommand.RegisterFlagCompletionFunc(authfileflagName, completion.AutocompleteDefault)
certDirFlagName := "cert-dir"
flags.StringVar(&runlabelOptions.CertDir, certDirFlagName, "", "`Pathname` of a directory containing TLS certificates and keys")
_ = runlabelCommand.RegisterFlagCompletionFunc(certDirFlagName, completion.AutocompleteDefault)
credsFlagName := "creds"
flags.StringVar(&runlabelOptions.Credentials, credsFlagName, "", "`Credentials` (USERNAME:PASSWORD) to use for authenticating to a registry")
_ = runlabelCommand.RegisterFlagCompletionFunc(credsFlagName, completion.AutocompleteNone)
flags.BoolVar(&runlabelOptions.Display, "display", false, "Preview the command that the label would run") flags.BoolVar(&runlabelOptions.Display, "display", false, "Preview the command that the label would run")
flags.StringVarP(&runlabelOptions.Name, "name", "n", "", "Assign a name to the container")
nameFlagName := "name"
flags.StringVarP(&runlabelOptions.Name, nameFlagName, "n", "", "Assign a name to the container")
_ = runlabelCommand.RegisterFlagCompletionFunc(nameFlagName, completion.AutocompleteNone)
flags.StringVar(&runlabelOptions.Optional1, "opt1", "", "Optional parameter to pass for install") flags.StringVar(&runlabelOptions.Optional1, "opt1", "", "Optional parameter to pass for install")
flags.StringVar(&runlabelOptions.Optional2, "opt2", "", "Optional parameter to pass for install") flags.StringVar(&runlabelOptions.Optional2, "opt2", "", "Optional parameter to pass for install")
flags.StringVar(&runlabelOptions.Optional3, "opt3", "", "Optional parameter to pass for install") flags.StringVar(&runlabelOptions.Optional3, "opt3", "", "Optional parameter to pass for install")

View File

@ -4,6 +4,7 @@ import (
"fmt" "fmt"
"os" "os"
"github.com/containers/podman/v2/cmd/podman/common"
"github.com/containers/podman/v2/cmd/podman/registry" "github.com/containers/podman/v2/cmd/podman/registry"
"github.com/containers/podman/v2/cmd/podman/utils" "github.com/containers/podman/v2/cmd/podman/utils"
"github.com/containers/podman/v2/cmd/podman/validate" "github.com/containers/podman/v2/cmd/podman/validate"
@ -11,7 +12,6 @@ import (
"github.com/containers/podman/v2/pkg/domain/entities" "github.com/containers/podman/v2/pkg/domain/entities"
"github.com/pkg/errors" "github.com/pkg/errors"
"github.com/spf13/cobra" "github.com/spf13/cobra"
"github.com/spf13/pflag"
) )
var ( var (
@ -21,6 +21,7 @@ var (
Short: "Start one or more containers", Short: "Start one or more containers",
Long: startDescription, Long: startDescription,
RunE: start, RunE: start,
ValidArgsFunction: common.AutocompleteContainersStartable,
Example: `podman start --latest Example: `podman start --latest
podman start 860a4b231279 5421ab43b45 podman start 860a4b231279 5421ab43b45
podman start --interactive --attach imageID`, podman start --interactive --attach imageID`,
@ -31,6 +32,7 @@ var (
Short: startCommand.Short, Short: startCommand.Short,
Long: startCommand.Long, Long: startCommand.Long,
RunE: startCommand.RunE, RunE: startCommand.RunE,
ValidArgsFunction: startCommand.ValidArgsFunction,
Example: `podman container start --latest Example: `podman container start --latest
podman container start 860a4b231279 5421ab43b45 podman container start 860a4b231279 5421ab43b45
podman container start --interactive --attach imageID`, podman container start --interactive --attach imageID`,
@ -41,9 +43,15 @@ var (
startOptions entities.ContainerStartOptions startOptions entities.ContainerStartOptions
) )
func startFlags(flags *pflag.FlagSet) { func startFlags(cmd *cobra.Command) {
flags := cmd.Flags()
flags.BoolVarP(&startOptions.Attach, "attach", "a", false, "Attach container's STDOUT and STDERR") flags.BoolVarP(&startOptions.Attach, "attach", "a", false, "Attach container's STDOUT and STDERR")
flags.StringVar(&startOptions.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 `_`")
detachKeysFlagName := "detach-keys"
flags.StringVar(&startOptions.DetachKeys, detachKeysFlagName, 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 `_`")
_ = cmd.RegisterFlagCompletionFunc(detachKeysFlagName, common.AutocompleteDetachKeys)
flags.BoolVarP(&startOptions.Interactive, "interactive", "i", false, "Keep STDIN open even if not attached") flags.BoolVarP(&startOptions.Interactive, "interactive", "i", false, "Keep STDIN open even if not attached")
flags.BoolVar(&startOptions.SigProxy, "sig-proxy", false, "Proxy received signals to the process (default true if attaching, false otherwise)") flags.BoolVar(&startOptions.SigProxy, "sig-proxy", false, "Proxy received signals to the process (default true if attaching, false otherwise)")
@ -56,7 +64,7 @@ func init() {
Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode}, Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode},
Command: startCommand, Command: startCommand,
}) })
startFlags(startCommand.Flags()) startFlags(startCommand)
validate.AddLatestFlag(startCommand, &startOptions.Latest) validate.AddLatestFlag(startCommand, &startOptions.Latest)
registry.Commands = append(registry.Commands, registry.CliCommand{ registry.Commands = append(registry.Commands, registry.CliCommand{
@ -64,9 +72,8 @@ func init() {
Command: containerStartCommand, Command: containerStartCommand,
Parent: containerCmd, Parent: containerCmd,
}) })
startFlags(containerStartCommand.Flags()) startFlags(containerStartCommand)
validate.AddLatestFlag(containerStartCommand, &startOptions.Latest) validate.AddLatestFlag(containerStartCommand, &startOptions.Latest)
} }
func start(cmd *cobra.Command, args []string) error { func start(cmd *cobra.Command, args []string) error {

View File

@ -8,6 +8,7 @@ import (
tm "github.com/buger/goterm" tm "github.com/buger/goterm"
"github.com/containers/common/pkg/report" "github.com/containers/common/pkg/report"
"github.com/containers/podman/v2/cmd/podman/common"
"github.com/containers/podman/v2/cmd/podman/parse" "github.com/containers/podman/v2/cmd/podman/parse"
"github.com/containers/podman/v2/cmd/podman/registry" "github.com/containers/podman/v2/cmd/podman/registry"
"github.com/containers/podman/v2/cmd/podman/validate" "github.com/containers/podman/v2/cmd/podman/validate"
@ -20,7 +21,6 @@ import (
"github.com/pkg/errors" "github.com/pkg/errors"
"github.com/sirupsen/logrus" "github.com/sirupsen/logrus"
"github.com/spf13/cobra" "github.com/spf13/cobra"
"github.com/spf13/pflag"
) )
var ( var (
@ -31,6 +31,7 @@ var (
Long: statsDescription, Long: statsDescription,
RunE: stats, RunE: stats,
Args: checkStatOptions, Args: checkStatOptions,
ValidArgsFunction: common.AutocompleteContainersRunning,
Example: `podman stats --all --no-stream Example: `podman stats --all --no-stream
podman stats ctrID podman stats ctrID
podman stats --no-stream --format "table {{.ID}} {{.Name}} {{.MemUsage}}" ctrID`, podman stats --no-stream --format "table {{.ID}} {{.Name}} {{.MemUsage}}" ctrID`,
@ -42,6 +43,7 @@ var (
Long: statsCommand.Long, Long: statsCommand.Long,
RunE: statsCommand.RunE, RunE: statsCommand.RunE,
Args: checkStatOptions, Args: checkStatOptions,
ValidArgsFunction: statsCommand.ValidArgsFunction,
Example: `podman container stats --all --no-stream Example: `podman container stats --all --no-stream
podman container stats ctrID podman container stats ctrID
podman container stats --no-stream --format "table {{.ID}} {{.Name}} {{.MemUsage}}" ctrID`, podman container stats --no-stream --format "table {{.ID}} {{.Name}} {{.MemUsage}}" ctrID`,
@ -62,9 +64,15 @@ var (
statsOptions statsOptionsCLI statsOptions statsOptionsCLI
) )
func statFlags(flags *pflag.FlagSet) { func statFlags(cmd *cobra.Command) {
flags := cmd.Flags()
flags.BoolVarP(&statsOptions.All, "all", "a", false, "Show all containers. Only running containers are shown by default. The default is false") flags.BoolVarP(&statsOptions.All, "all", "a", false, "Show all containers. Only running containers are shown by default. The default is false")
flags.StringVar(&statsOptions.Format, "format", "", "Pretty-print container statistics to JSON or using a Go template")
formatFlagName := "format"
flags.StringVar(&statsOptions.Format, formatFlagName, "", "Pretty-print container statistics to JSON or using a Go template")
_ = cmd.RegisterFlagCompletionFunc(formatFlagName, common.AutocompleteJSONFormat)
flags.BoolVar(&statsOptions.NoReset, "no-reset", false, "Disable resetting the screen between intervals") flags.BoolVar(&statsOptions.NoReset, "no-reset", false, "Disable resetting the screen between intervals")
flags.BoolVar(&statsOptions.NoStream, "no-stream", false, "Disable streaming stats and only pull the first result, default setting is false") flags.BoolVar(&statsOptions.NoStream, "no-stream", false, "Disable streaming stats and only pull the first result, default setting is false")
} }
@ -74,7 +82,7 @@ func init() {
Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode}, Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode},
Command: statsCommand, Command: statsCommand,
}) })
statFlags(statsCommand.Flags()) statFlags(statsCommand)
validate.AddLatestFlag(statsCommand, &statsOptions.Latest) validate.AddLatestFlag(statsCommand, &statsOptions.Latest)
registry.Commands = append(registry.Commands, registry.CliCommand{ registry.Commands = append(registry.Commands, registry.CliCommand{
@ -82,7 +90,7 @@ func init() {
Command: containerStatsCommand, Command: containerStatsCommand,
Parent: containerCmd, Parent: containerCmd,
}) })
statFlags(containerStatsCommand.Flags()) statFlags(containerStatsCommand)
validate.AddLatestFlag(containerStatsCommand, &statsOptions.Latest) validate.AddLatestFlag(containerStatsCommand, &statsOptions.Latest)
} }

View File

@ -4,12 +4,13 @@ import (
"context" "context"
"fmt" "fmt"
"github.com/containers/common/pkg/completion"
"github.com/containers/podman/v2/cmd/podman/common"
"github.com/containers/podman/v2/cmd/podman/registry" "github.com/containers/podman/v2/cmd/podman/registry"
"github.com/containers/podman/v2/cmd/podman/utils" "github.com/containers/podman/v2/cmd/podman/utils"
"github.com/containers/podman/v2/cmd/podman/validate" "github.com/containers/podman/v2/cmd/podman/validate"
"github.com/containers/podman/v2/pkg/domain/entities" "github.com/containers/podman/v2/pkg/domain/entities"
"github.com/spf13/cobra" "github.com/spf13/cobra"
"github.com/spf13/pflag"
) )
var ( var (
@ -24,6 +25,7 @@ var (
Args: func(cmd *cobra.Command, args []string) error { Args: func(cmd *cobra.Command, args []string) error {
return validate.CheckAllLatestAndCIDFile(cmd, args, false, true) return validate.CheckAllLatestAndCIDFile(cmd, args, false, true)
}, },
ValidArgsFunction: common.AutocompleteContainersRunning,
Example: `podman stop ctrID Example: `podman stop ctrID
podman stop --latest podman stop --latest
podman stop --time 2 mywebserver 6e534f14da9d`, podman stop --time 2 mywebserver 6e534f14da9d`,
@ -37,6 +39,7 @@ var (
Args: func(cmd *cobra.Command, args []string) error { Args: func(cmd *cobra.Command, args []string) error {
return validate.CheckAllLatestAndCIDFile(cmd, args, false, true) return validate.CheckAllLatestAndCIDFile(cmd, args, false, true)
}, },
ValidArgsFunction: stopCommand.ValidArgsFunction,
Example: `podman container stop ctrID Example: `podman container stop ctrID
podman container stop --latest podman container stop --latest
podman container stop --time 2 mywebserver 6e534f14da9d`, podman container stop --time 2 mywebserver 6e534f14da9d`,
@ -48,11 +51,19 @@ var (
stopTimeout uint stopTimeout uint
) )
func stopFlags(flags *pflag.FlagSet) { func stopFlags(cmd *cobra.Command) {
flags := cmd.Flags()
flags.BoolVarP(&stopOptions.All, "all", "a", false, "Stop all running containers") 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.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.UintVarP(&stopTimeout, "time", "t", containerConfig.Engine.StopTimeout, "Seconds to wait for stop before killing the container") cidfileFlagName := "cidfile"
flags.StringArrayVarP(&stopOptions.CIDFiles, cidfileFlagName, "", nil, "Read the container ID from the file")
_ = cmd.RegisterFlagCompletionFunc(cidfileFlagName, completion.AutocompleteDefault)
timeFlagName := "time"
flags.UintVarP(&stopTimeout, timeFlagName, "t", containerConfig.Engine.StopTimeout, "Seconds to wait for stop before killing the container")
_ = cmd.RegisterFlagCompletionFunc(timeFlagName, completion.AutocompleteNone)
if registry.IsRemote() { if registry.IsRemote() {
_ = flags.MarkHidden("cidfile") _ = flags.MarkHidden("cidfile")
@ -66,7 +77,7 @@ func init() {
Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode}, Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode},
Command: stopCommand, Command: stopCommand,
}) })
stopFlags(stopCommand.Flags()) stopFlags(stopCommand)
validate.AddLatestFlag(stopCommand, &stopOptions.Latest) validate.AddLatestFlag(stopCommand, &stopOptions.Latest)
registry.Commands = append(registry.Commands, registry.CliCommand{ registry.Commands = append(registry.Commands, registry.CliCommand{
@ -74,8 +85,7 @@ func init() {
Command: containerStopCommand, Command: containerStopCommand,
Parent: containerCmd, Parent: containerCmd,
}) })
stopFlags(containerStopCommand)
stopFlags(containerStopCommand.Flags())
validate.AddLatestFlag(containerStopCommand, &stopOptions.Latest) validate.AddLatestFlag(containerStopCommand, &stopOptions.Latest)
} }

View File

@ -7,6 +7,7 @@ import (
"strings" "strings"
"text/tabwriter" "text/tabwriter"
"github.com/containers/podman/v2/cmd/podman/common"
"github.com/containers/podman/v2/cmd/podman/registry" "github.com/containers/podman/v2/cmd/podman/registry"
"github.com/containers/podman/v2/cmd/podman/validate" "github.com/containers/podman/v2/cmd/podman/validate"
"github.com/containers/podman/v2/pkg/domain/entities" "github.com/containers/podman/v2/pkg/domain/entities"
@ -31,6 +32,7 @@ var (
Long: topDescription, Long: topDescription,
RunE: top, RunE: top,
Args: cobra.ArbitraryArgs, Args: cobra.ArbitraryArgs,
ValidArgsFunction: common.AutocompleteContainersRunning,
Example: `podman top ctrID Example: `podman top ctrID
podman top --latest podman top --latest
podman top ctrID pid seccomp args %C podman top ctrID pid seccomp args %C
@ -42,6 +44,7 @@ podman top ctrID -eo user,pid,comm`,
Short: topCommand.Short, Short: topCommand.Short,
Long: topCommand.Long, Long: topCommand.Long,
RunE: topCommand.RunE, RunE: topCommand.RunE,
ValidArgsFunction: topCommand.ValidArgsFunction,
Example: `podman container top ctrID Example: `podman container top ctrID
podman container top --latest podman container top --latest
podman container top ctrID pid seccomp args %C podman container top ctrID pid seccomp args %C

View File

@ -3,6 +3,7 @@ package containers
import ( import (
"fmt" "fmt"
"github.com/containers/podman/v2/cmd/podman/common"
"github.com/containers/podman/v2/cmd/podman/registry" "github.com/containers/podman/v2/cmd/podman/registry"
"github.com/containers/podman/v2/cmd/podman/utils" "github.com/containers/podman/v2/cmd/podman/utils"
"github.com/containers/podman/v2/cmd/podman/validate" "github.com/containers/podman/v2/cmd/podman/validate"
@ -27,6 +28,7 @@ var (
Args: func(cmd *cobra.Command, args []string) error { Args: func(cmd *cobra.Command, args []string) error {
return validate.CheckAllLatestAndCIDFile(cmd, args, false, false) return validate.CheckAllLatestAndCIDFile(cmd, args, false, false)
}, },
ValidArgsFunction: common.AutocompleteContainers,
Example: `podman unmount ctrID Example: `podman unmount ctrID
podman unmount ctrID1 ctrID2 ctrID3 podman unmount ctrID1 ctrID2 ctrID3
podman unmount --all`, podman unmount --all`,
@ -41,6 +43,7 @@ var (
Args: func(cmd *cobra.Command, args []string) error { Args: func(cmd *cobra.Command, args []string) error {
return validate.CheckAllLatestAndCIDFile(cmd, args, false, false) return validate.CheckAllLatestAndCIDFile(cmd, args, false, false)
}, },
ValidArgsFunction: common.AutocompleteContainers,
Example: `podman container unmount ctrID Example: `podman container unmount ctrID
podman container unmount ctrID1 ctrID2 ctrID3 podman container unmount ctrID1 ctrID2 ctrID3
podman container unmount --all`, podman container unmount --all`,

View File

@ -4,6 +4,7 @@ import (
"context" "context"
"fmt" "fmt"
"github.com/containers/podman/v2/cmd/podman/common"
"github.com/containers/podman/v2/cmd/podman/registry" "github.com/containers/podman/v2/cmd/podman/registry"
"github.com/containers/podman/v2/cmd/podman/utils" "github.com/containers/podman/v2/cmd/podman/utils"
"github.com/containers/podman/v2/pkg/cgroups" "github.com/containers/podman/v2/pkg/cgroups"
@ -21,6 +22,7 @@ var (
Short: "Unpause the processes in one or more containers", Short: "Unpause the processes in one or more containers",
Long: unpauseDescription, Long: unpauseDescription,
RunE: unpause, RunE: unpause,
ValidArgsFunction: common.AutocompleteContainersPaused,
Example: `podman unpause ctrID Example: `podman unpause ctrID
podman unpause --all`, podman unpause --all`,
} }
@ -31,6 +33,7 @@ var (
Short: unpauseCommand.Short, Short: unpauseCommand.Short,
Long: unpauseCommand.Long, Long: unpauseCommand.Long,
RunE: unpauseCommand.RunE, RunE: unpauseCommand.RunE,
ValidArgsFunction: unpauseCommand.ValidArgsFunction,
Example: `podman container unpause ctrID Example: `podman container unpause ctrID
podman container unpause --all`, podman container unpause --all`,
} }

View File

@ -5,6 +5,8 @@ import (
"fmt" "fmt"
"time" "time"
"github.com/containers/common/pkg/completion"
"github.com/containers/podman/v2/cmd/podman/common"
"github.com/containers/podman/v2/cmd/podman/registry" "github.com/containers/podman/v2/cmd/podman/registry"
"github.com/containers/podman/v2/cmd/podman/utils" "github.com/containers/podman/v2/cmd/podman/utils"
"github.com/containers/podman/v2/cmd/podman/validate" "github.com/containers/podman/v2/cmd/podman/validate"
@ -12,7 +14,6 @@ import (
"github.com/containers/podman/v2/pkg/domain/entities" "github.com/containers/podman/v2/pkg/domain/entities"
"github.com/pkg/errors" "github.com/pkg/errors"
"github.com/spf13/cobra" "github.com/spf13/cobra"
"github.com/spf13/pflag"
) )
var ( var (
@ -23,6 +24,7 @@ var (
Short: "Block on one or more containers", Short: "Block on one or more containers",
Long: waitDescription, Long: waitDescription,
RunE: wait, RunE: wait,
ValidArgsFunction: common.AutocompleteContainers,
Example: `podman wait --interval 5s ctrID Example: `podman wait --interval 5s ctrID
podman wait ctrID1 ctrID2`, podman wait ctrID1 ctrID2`,
} }
@ -32,6 +34,7 @@ var (
Short: waitCommand.Short, Short: waitCommand.Short,
Long: waitCommand.Long, Long: waitCommand.Long,
RunE: waitCommand.RunE, RunE: waitCommand.RunE,
ValidArgsFunction: waitCommand.ValidArgsFunction,
Example: `podman container wait --interval 5s ctrID Example: `podman container wait --interval 5s ctrID
podman container wait ctrID1 ctrID2`, podman container wait ctrID1 ctrID2`,
} }
@ -43,9 +46,17 @@ var (
waitInterval string waitInterval string
) )
func waitFlags(flags *pflag.FlagSet) { func waitFlags(cmd *cobra.Command) {
flags.StringVarP(&waitInterval, "interval", "i", "250ns", "Time Interval to wait before polling for completion") flags := cmd.Flags()
flags.StringVar(&waitCondition, "condition", "stopped", "Condition to wait on")
intervalFlagName := "interval"
flags.StringVarP(&waitInterval, intervalFlagName, "i", "250ns", "Time Interval to wait before polling for completion")
_ = cmd.RegisterFlagCompletionFunc(intervalFlagName, completion.AutocompleteNone)
conditionFlagName := "condition"
flags.StringVar(&waitCondition, conditionFlagName, "stopped", "Condition to wait on")
_ = cmd.RegisterFlagCompletionFunc(conditionFlagName, common.AutocompleteWaitCondition)
} }
func init() { func init() {
@ -53,7 +64,7 @@ func init() {
Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode}, Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode},
Command: waitCommand, Command: waitCommand,
}) })
waitFlags(waitCommand.Flags()) waitFlags(waitCommand)
validate.AddLatestFlag(waitCommand, &waitOptions.Latest) validate.AddLatestFlag(waitCommand, &waitOptions.Latest)
registry.Commands = append(registry.Commands, registry.CliCommand{ registry.Commands = append(registry.Commands, registry.CliCommand{
@ -61,9 +72,8 @@ func init() {
Command: containerWaitCommand, Command: containerWaitCommand,
Parent: containerCmd, Parent: containerCmd,
}) })
waitFlags(containerWaitCommand.Flags()) waitFlags(containerWaitCommand)
validate.AddLatestFlag(containerWaitCommand, &waitOptions.Latest) validate.AddLatestFlag(containerWaitCommand, &waitOptions.Latest)
} }
func wait(cmd *cobra.Command, args []string) error { func wait(cmd *cobra.Command, args []string) error {

View File

@ -3,6 +3,7 @@ package main
import ( import (
"fmt" "fmt"
"github.com/containers/podman/v2/cmd/podman/common"
"github.com/containers/podman/v2/cmd/podman/containers" "github.com/containers/podman/v2/cmd/podman/containers"
"github.com/containers/podman/v2/cmd/podman/images" "github.com/containers/podman/v2/cmd/podman/images"
"github.com/containers/podman/v2/cmd/podman/registry" "github.com/containers/podman/v2/cmd/podman/registry"
@ -22,6 +23,7 @@ var (
Short: "Display the changes to the object's file system", Short: "Display the changes to the object's file system",
Long: diffDescription, Long: diffDescription,
RunE: diff, RunE: diff,
ValidArgsFunction: common.AutocompleteContainersAndImages,
Example: `podman diff imageID Example: `podman diff imageID
podman diff ctrID podman diff ctrID
podman diff --format json redis:alpine`, podman diff --format json redis:alpine`,
@ -38,7 +40,11 @@ func init() {
flags := diffCmd.Flags() flags := diffCmd.Flags()
flags.BoolVar(&diffOpts.Archive, "archive", true, "Save the diff as a tar archive") flags.BoolVar(&diffOpts.Archive, "archive", true, "Save the diff as a tar archive")
_ = flags.MarkHidden("archive") _ = flags.MarkHidden("archive")
flags.StringVar(&diffOpts.Format, "format", "", "Change the output format")
formatFlagName := "format"
flags.StringVar(&diffOpts.Format, formatFlagName, "", "Change the output format")
_ = diffCmd.RegisterFlagCompletionFunc(formatFlagName, common.AutocompleteJSONFormat)
validate.AddLatestFlag(diffCmd, &diffOpts.Latest) validate.AddLatestFlag(diffCmd, &diffOpts.Latest)
} }

View File

@ -5,6 +5,8 @@ import (
"io/ioutil" "io/ioutil"
"os" "os"
"github.com/containers/common/pkg/completion"
"github.com/containers/podman/v2/cmd/podman/common"
"github.com/containers/podman/v2/cmd/podman/registry" "github.com/containers/podman/v2/cmd/podman/registry"
"github.com/containers/podman/v2/cmd/podman/utils" "github.com/containers/podman/v2/cmd/podman/utils"
"github.com/containers/podman/v2/pkg/domain/entities" "github.com/containers/podman/v2/pkg/domain/entities"
@ -25,6 +27,7 @@ Whether the input is for a container or pod, Podman will always generate the spe
Long: kubeDescription, Long: kubeDescription,
RunE: kube, RunE: kube,
Args: cobra.ExactArgs(1), Args: cobra.ExactArgs(1),
ValidArgsFunction: common.AutocompleteContainersAndPods,
Example: `podman generate kube ctrID Example: `podman generate kube ctrID
podman generate kube podID podman generate kube podID
podman generate kube --service podID`, podman generate kube --service podID`,
@ -39,7 +42,11 @@ func init() {
}) })
flags := kubeCmd.Flags() flags := kubeCmd.Flags()
flags.BoolVarP(&kubeOptions.Service, "service", "s", false, "Generate YAML for a Kubernetes service object") flags.BoolVarP(&kubeOptions.Service, "service", "s", false, "Generate YAML for a Kubernetes service object")
flags.StringVarP(&kubeFile, "filename", "f", "", "Write output to the specified path")
filenameFlagName := "filename"
flags.StringVarP(&kubeFile, filenameFlagName, "f", "", "Write output to the specified path")
_ = kubeCmd.RegisterFlagCompletionFunc(filenameFlagName, completion.AutocompleteDefault)
flags.SetNormalizeFunc(utils.AliasFlags) flags.SetNormalizeFunc(utils.AliasFlags)
} }

View File

@ -6,7 +6,9 @@ import (
"os" "os"
"path/filepath" "path/filepath"
"github.com/containers/common/pkg/completion"
"github.com/containers/common/pkg/report" "github.com/containers/common/pkg/report"
"github.com/containers/podman/v2/cmd/podman/common"
"github.com/containers/podman/v2/cmd/podman/registry" "github.com/containers/podman/v2/cmd/podman/registry"
"github.com/containers/podman/v2/cmd/podman/utils" "github.com/containers/podman/v2/cmd/podman/utils"
"github.com/containers/podman/v2/pkg/domain/entities" "github.com/containers/podman/v2/pkg/domain/entities"
@ -29,6 +31,7 @@ var (
Long: systemdDescription, Long: systemdDescription,
RunE: systemd, RunE: systemd,
Args: cobra.ExactArgs(1), Args: cobra.ExactArgs(1),
ValidArgsFunction: common.AutocompleteContainersAndPods,
Example: `podman generate systemd CTR Example: `podman generate systemd CTR
podman generate systemd --new --time 10 CTR podman generate systemd --new --time 10 CTR
podman generate systemd --files --name POD`, podman generate systemd --files --name POD`,
@ -44,13 +47,32 @@ func init() {
flags := systemdCmd.Flags() flags := systemdCmd.Flags()
flags.BoolVarP(&systemdOptions.Name, "name", "n", false, "Use container/pod names instead of IDs") flags.BoolVarP(&systemdOptions.Name, "name", "n", false, "Use container/pod names instead of IDs")
flags.BoolVarP(&files, "files", "f", false, "Generate .service files instead of printing to stdout") flags.BoolVarP(&files, "files", "f", false, "Generate .service files instead of printing to stdout")
flags.UintVarP(&systemdTimeout, "time", "t", containerConfig.Engine.StopTimeout, "Stop timeout override")
flags.StringVar(&systemdOptions.RestartPolicy, "restart-policy", "on-failure", "Systemd restart-policy") timeFlagName := "time"
flags.UintVarP(&systemdTimeout, timeFlagName, "t", containerConfig.Engine.StopTimeout, "Stop timeout override")
_ = systemdCmd.RegisterFlagCompletionFunc(timeFlagName, completion.AutocompleteNone)
flags.BoolVarP(&systemdOptions.New, "new", "", false, "Create a new container instead of starting an existing one") flags.BoolVarP(&systemdOptions.New, "new", "", false, "Create a new container instead of starting an existing one")
flags.StringVar(&systemdOptions.ContainerPrefix, "container-prefix", "container", "Systemd unit name prefix for containers")
flags.StringVar(&systemdOptions.PodPrefix, "pod-prefix", "pod", "Systemd unit name prefix for pods") containerPrefixFlagName := "container-prefix"
flags.StringVar(&systemdOptions.Separator, "separator", "-", "Systemd unit name separator between name/id and prefix") flags.StringVar(&systemdOptions.ContainerPrefix, containerPrefixFlagName, "container", "Systemd unit name prefix for containers")
flags.StringVar(&format, "format", "", "Print the created units in specified format (json)") _ = systemdCmd.RegisterFlagCompletionFunc(containerPrefixFlagName, completion.AutocompleteNone)
podPrefixFlagName := "pod-prefix"
flags.StringVar(&systemdOptions.PodPrefix, podPrefixFlagName, "pod", "Systemd unit name prefix for pods")
_ = systemdCmd.RegisterFlagCompletionFunc(podPrefixFlagName, completion.AutocompleteNone)
separatorFlagName := "separator"
flags.StringVar(&systemdOptions.Separator, separatorFlagName, "-", "Systemd unit name separator between name/id and prefix")
_ = systemdCmd.RegisterFlagCompletionFunc(separatorFlagName, completion.AutocompleteNone)
restartPolicyFlagName := "restart-policy"
flags.StringVar(&systemdOptions.RestartPolicy, restartPolicyFlagName, "on-failure", "Systemd restart-policy")
_ = systemdCmd.RegisterFlagCompletionFunc(restartPolicyFlagName, common.AutocompleteSystemdRestartOptions)
formatFlagName := "format"
flags.StringVar(&format, formatFlagName, "", "Print the created units in specified format (json)")
_ = systemdCmd.RegisterFlagCompletionFunc(formatFlagName, common.AutocompleteJSONFormat)
flags.SetNormalizeFunc(utils.AliasFlags) flags.SetNormalizeFunc(utils.AliasFlags)
} }

View File

@ -4,6 +4,7 @@ import (
"context" "context"
"fmt" "fmt"
"github.com/containers/podman/v2/cmd/podman/common"
"github.com/containers/podman/v2/cmd/podman/registry" "github.com/containers/podman/v2/cmd/podman/registry"
"github.com/containers/podman/v2/pkg/domain/entities" "github.com/containers/podman/v2/pkg/domain/entities"
"github.com/spf13/cobra" "github.com/spf13/cobra"
@ -18,6 +19,7 @@ var (
Example: `podman healthcheck run mywebapp`, Example: `podman healthcheck run mywebapp`,
RunE: run, RunE: run,
Args: cobra.ExactArgs(1), Args: cobra.ExactArgs(1),
ValidArgsFunction: common.AutocompleteContainersRunning,
DisableFlagsInUseLine: true, DisableFlagsInUseLine: true,
} }
) )

View File

@ -9,6 +9,7 @@ import (
"github.com/containers/buildah/imagebuildah" "github.com/containers/buildah/imagebuildah"
buildahCLI "github.com/containers/buildah/pkg/cli" buildahCLI "github.com/containers/buildah/pkg/cli"
"github.com/containers/buildah/pkg/parse" "github.com/containers/buildah/pkg/parse"
"github.com/containers/common/pkg/completion"
"github.com/containers/common/pkg/config" "github.com/containers/common/pkg/config"
"github.com/containers/podman/v2/cmd/podman/registry" "github.com/containers/podman/v2/cmd/podman/registry"
"github.com/containers/podman/v2/cmd/podman/utils" "github.com/containers/podman/v2/cmd/podman/utils"
@ -18,7 +19,6 @@ import (
"github.com/pkg/errors" "github.com/pkg/errors"
"github.com/sirupsen/logrus" "github.com/sirupsen/logrus"
"github.com/spf13/cobra" "github.com/spf13/cobra"
"github.com/spf13/pflag"
) )
// buildFlagsWrapper are local to cmd/ as the build code is using Buildah-internal // buildFlagsWrapper are local to cmd/ as the build code is using Buildah-internal
@ -45,6 +45,7 @@ var (
Long: buildDescription, Long: buildDescription,
Args: cobra.MaximumNArgs(1), Args: cobra.MaximumNArgs(1),
RunE: build, RunE: build,
ValidArgsFunction: completion.AutocompleteDefault,
Example: `podman build . Example: `podman build .
podman build --creds=username:password -t imageName -f Containerfile.simple . podman build --creds=username:password -t imageName -f Containerfile.simple .
podman build --layers --force-rm --tag imageName .`, podman build --layers --force-rm --tag imageName .`,
@ -56,6 +57,7 @@ var (
Short: buildCmd.Short, Short: buildCmd.Short,
Long: buildCmd.Long, Long: buildCmd.Long,
RunE: buildCmd.RunE, RunE: buildCmd.RunE,
ValidArgsFunction: buildCmd.ValidArgsFunction,
Example: `podman image build . Example: `podman image build .
podman image build --creds=username:password -t imageName -f Containerfile.simple . podman image build --creds=username:password -t imageName -f Containerfile.simple .
podman image build --layers --force-rm --tag imageName .`, podman image build --layers --force-rm --tag imageName .`,
@ -79,22 +81,25 @@ func init() {
Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode}, Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode},
Command: buildCmd, Command: buildCmd,
}) })
buildFlags(buildCmd.Flags()) buildFlags(buildCmd)
registry.Commands = append(registry.Commands, registry.CliCommand{ registry.Commands = append(registry.Commands, registry.CliCommand{
Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode}, Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode},
Command: imageBuildCmd, Command: imageBuildCmd,
Parent: imageCmd, Parent: imageCmd,
}) })
buildFlags(imageBuildCmd.Flags()) buildFlags(imageBuildCmd)
} }
func buildFlags(flags *pflag.FlagSet) { func buildFlags(cmd *cobra.Command) {
flags := cmd.Flags()
// Podman flags // Podman flags
flags.BoolVarP(&buildOpts.SquashAll, "squash-all", "", false, "Squash all layers into a single layer") flags.BoolVarP(&buildOpts.SquashAll, "squash-all", "", false, "Squash all layers into a single layer")
// Bud flags // Bud flags
budFlags := buildahCLI.GetBudFlags(&buildOpts.BudResults) budFlags := buildahCLI.GetBudFlags(&buildOpts.BudResults)
// --pull flag // --pull flag
flag := budFlags.Lookup("pull") flag := budFlags.Lookup("pull")
if err := flag.Value.Set("true"); err != nil { if err := flag.Value.Set("true"); err != nil {
@ -102,6 +107,9 @@ func buildFlags(flags *pflag.FlagSet) {
} }
flag.DefValue = "true" flag.DefValue = "true"
flags.AddFlagSet(&budFlags) flags.AddFlagSet(&budFlags)
// Add the completion functions
budCompletions := buildahCLI.GetBudFlagsCompletions()
completion.CompleteCommandFlags(cmd, budCompletions)
// Layer flags // Layer flags
layerFlags := buildahCLI.GetLayerFlags(&buildOpts.LayerResults) layerFlags := buildahCLI.GetLayerFlags(&buildOpts.LayerResults)
@ -127,6 +135,9 @@ func buildFlags(flags *pflag.FlagSet) {
os.Exit(1) os.Exit(1)
} }
flags.AddFlagSet(&fromAndBudFlags) flags.AddFlagSet(&fromAndBudFlags)
// Add the completion functions
fromAndBudFlagsCompletions := buildahCLI.GetFromAndBudFlagsCompletions()
completion.CompleteCommandFlags(cmd, fromAndBudFlagsCompletions)
_ = flags.MarkHidden("signature-policy") _ = flags.MarkHidden("signature-policy")
} }

View File

@ -18,6 +18,7 @@ var (
Short: "Inspect changes to the image's file systems", Short: "Inspect changes to the image's file systems",
Long: `Displays changes to the image's filesystem. The image will be compared to its parent layer.`, Long: `Displays changes to the image's filesystem. The image will be compared to its parent layer.`,
RunE: diff, RunE: diff,
ValidArgsFunction: common.AutocompleteImages,
Example: `podman image diff myImage Example: `podman image diff myImage
podman image diff --format json redis:alpine`, podman image diff --format json redis:alpine`,
} }
@ -37,7 +38,10 @@ func diffFlags(flags *pflag.FlagSet) {
diffOpts = &entities.DiffOptions{} diffOpts = &entities.DiffOptions{}
flags.BoolVar(&diffOpts.Archive, "archive", true, "Save the diff as a tar archive") flags.BoolVar(&diffOpts.Archive, "archive", true, "Save the diff as a tar archive")
_ = flags.MarkDeprecated("archive", "Provided for backwards compatibility, has no impact on output.") _ = flags.MarkDeprecated("archive", "Provided for backwards compatibility, has no impact on output.")
flags.StringVar(&diffOpts.Format, "format", "", "Change the output format")
formatFlagName := "format"
flags.StringVar(&diffOpts.Format, formatFlagName, "", "Change the output format")
_ = diffCmd.RegisterFlagCompletionFunc(formatFlagName, common.AutocompleteJSONFormat)
} }
func diff(cmd *cobra.Command, args []string) error { func diff(cmd *cobra.Command, args []string) error {

View File

@ -1,6 +1,7 @@
package images package images
import ( import (
"github.com/containers/podman/v2/cmd/podman/common"
"github.com/containers/podman/v2/cmd/podman/registry" "github.com/containers/podman/v2/cmd/podman/registry"
"github.com/containers/podman/v2/pkg/domain/entities" "github.com/containers/podman/v2/pkg/domain/entities"
"github.com/spf13/cobra" "github.com/spf13/cobra"
@ -13,6 +14,7 @@ var (
Long: `If the named image exists in local storage, podman image exists exits with 0, otherwise the exit code will be 1.`, 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), Args: cobra.ExactArgs(1),
RunE: exists, RunE: exists,
ValidArgsFunction: common.AutocompleteImages,
Example: `podman image exists ID Example: `podman image exists ID
podman image exists IMAGE && podman pull IMAGE`, podman image exists IMAGE && podman pull IMAGE`,
DisableFlagsInUseLine: true, DisableFlagsInUseLine: true,

View File

@ -11,13 +11,13 @@ import (
"unicode" "unicode"
"github.com/containers/common/pkg/report" "github.com/containers/common/pkg/report"
"github.com/containers/podman/v2/cmd/podman/common"
"github.com/containers/podman/v2/cmd/podman/parse" "github.com/containers/podman/v2/cmd/podman/parse"
"github.com/containers/podman/v2/cmd/podman/registry" "github.com/containers/podman/v2/cmd/podman/registry"
"github.com/containers/podman/v2/pkg/domain/entities" "github.com/containers/podman/v2/pkg/domain/entities"
"github.com/docker/go-units" "github.com/docker/go-units"
"github.com/pkg/errors" "github.com/pkg/errors"
"github.com/spf13/cobra" "github.com/spf13/cobra"
"github.com/spf13/pflag"
) )
var ( var (
@ -32,6 +32,7 @@ var (
Long: long, Long: long,
Args: cobra.ExactArgs(1), Args: cobra.ExactArgs(1),
RunE: history, RunE: history,
ValidArgsFunction: common.AutocompleteImages,
Example: "podman history quay.io/fedora/fedora", Example: "podman history quay.io/fedora/fedora",
} }
@ -40,6 +41,7 @@ var (
Use: historyCmd.Use, Use: historyCmd.Use,
Short: historyCmd.Short, Short: historyCmd.Short,
Long: historyCmd.Long, Long: historyCmd.Long,
ValidArgsFunction: historyCmd.ValidArgsFunction,
RunE: historyCmd.RunE, RunE: historyCmd.RunE,
Example: `podman image history quay.io/fedora/fedora`, Example: `podman image history quay.io/fedora/fedora`,
} }
@ -57,18 +59,23 @@ func init() {
Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode}, Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode},
Command: historyCmd, Command: historyCmd,
}) })
historyFlags(historyCmd.Flags()) historyFlags(historyCmd)
registry.Commands = append(registry.Commands, registry.CliCommand{ registry.Commands = append(registry.Commands, registry.CliCommand{
Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode}, Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode},
Command: imageHistoryCmd, Command: imageHistoryCmd,
Parent: imageCmd, Parent: imageCmd,
}) })
historyFlags(imageHistoryCmd.Flags()) historyFlags(imageHistoryCmd)
} }
func historyFlags(flags *pflag.FlagSet) { func historyFlags(cmd *cobra.Command) {
flags.StringVar(&opts.format, "format", "", "Change the output to JSON or a Go template") flags := cmd.Flags()
formatFlagName := "format"
flags.StringVar(&opts.format, formatFlagName, "", "Change the output to JSON or a Go template")
_ = cmd.RegisterFlagCompletionFunc(formatFlagName, common.AutocompleteJSONFormat)
flags.BoolVarP(&opts.human, "human", "H", true, "Display sizes and dates in human readable format") flags.BoolVarP(&opts.human, "human", "H", true, "Display sizes and dates in human readable format")
flags.BoolVar(&opts.noTrunc, "no-trunc", false, "Do not truncate the output") flags.BoolVar(&opts.noTrunc, "no-trunc", false, "Do not truncate the output")
flags.BoolVar(&opts.noTrunc, "notruncate", false, "Do not truncate the output") flags.BoolVar(&opts.noTrunc, "notruncate", false, "Do not truncate the output")

View File

@ -16,6 +16,7 @@ var (
Short: listCmd.Short, Short: listCmd.Short,
Long: listCmd.Long, Long: listCmd.Long,
RunE: listCmd.RunE, RunE: listCmd.RunE,
ValidArgsFunction: listCmd.ValidArgsFunction,
Example: strings.Replace(listCmd.Example, "podman image list", "podman images", -1), Example: strings.Replace(listCmd.Example, "podman image list", "podman images", -1),
DisableFlagsInUseLine: true, DisableFlagsInUseLine: true,
} }
@ -27,5 +28,5 @@ func init() {
Command: imagesCmd, Command: imagesCmd,
}) })
imageListFlagSet(imagesCmd.Flags()) imageListFlagSet(imagesCmd)
} }

View File

@ -3,14 +3,16 @@ package images
import ( import (
"context" "context"
"fmt" "fmt"
"strings"
"github.com/containers/common/pkg/completion"
"github.com/containers/podman/v2/cmd/podman/common"
"github.com/containers/podman/v2/cmd/podman/parse" "github.com/containers/podman/v2/cmd/podman/parse"
"github.com/containers/podman/v2/cmd/podman/registry" "github.com/containers/podman/v2/cmd/podman/registry"
"github.com/containers/podman/v2/pkg/domain/entities" "github.com/containers/podman/v2/pkg/domain/entities"
"github.com/hashicorp/go-multierror" "github.com/hashicorp/go-multierror"
"github.com/pkg/errors" "github.com/pkg/errors"
"github.com/spf13/cobra" "github.com/spf13/cobra"
"github.com/spf13/pflag"
) )
var ( var (
@ -23,6 +25,7 @@ var (
Short: "Import a tarball to create a filesystem image", Short: "Import a tarball to create a filesystem image",
Long: importDescription, Long: importDescription,
RunE: importCon, RunE: importCon,
ValidArgsFunction: completion.AutocompleteDefault,
Example: `podman import http://example.com/ctr.tar url-image 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 -q import --message "importing the ctr.tar tarball" - image-imported
cat ctr.tar | podman import -`, cat ctr.tar | podman import -`,
@ -34,6 +37,7 @@ var (
Short: importCommand.Short, Short: importCommand.Short,
Long: importCommand.Long, Long: importCommand.Long,
RunE: importCommand.RunE, RunE: importCommand.RunE,
ValidArgsFunction: importCommand.ValidArgsFunction,
Example: `podman image import http://example.com/ctr.tar url-image Example: `podman image import http://example.com/ctr.tar url-image
cat ctr.tar | podman -q image import --message "importing the ctr.tar tarball" - image-imported cat ctr.tar | podman -q image import --message "importing the ctr.tar tarball" - image-imported
cat ctr.tar | podman image import -`, cat ctr.tar | podman image import -`,
@ -49,19 +53,27 @@ func init() {
Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode}, Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode},
Command: importCommand, Command: importCommand,
}) })
importFlags(importCommand.Flags()) importFlags(importCommand)
registry.Commands = append(registry.Commands, registry.CliCommand{ registry.Commands = append(registry.Commands, registry.CliCommand{
Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode}, Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode},
Command: imageImportCommand, Command: imageImportCommand,
Parent: imageCmd, Parent: imageCmd,
}) })
importFlags(imageImportCommand.Flags()) importFlags(imageImportCommand)
} }
func importFlags(flags *pflag.FlagSet) { func importFlags(cmd *cobra.Command) {
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 := cmd.Flags()
flags.StringVarP(&importOpts.Message, "message", "m", "", "Set commit message for imported image")
changeFlagName := "change"
flags.StringArrayVarP(&importOpts.Changes, changeFlagName, "c", []string{}, "Apply the following possible instructions to the created image (default []): "+strings.Join(common.ChangeCmds, " | "))
_ = cmd.RegisterFlagCompletionFunc(changeFlagName, common.AutocompleteChangeInstructions)
messageFlagName := "message"
flags.StringVarP(&importOpts.Message, messageFlagName, "m", "", "Set commit message for imported image")
_ = cmd.RegisterFlagCompletionFunc(messageFlagName, completion.AutocompleteNone)
flags.BoolVarP(&importOpts.Quiet, "quiet", "q", false, "Suppress output") flags.BoolVarP(&importOpts.Quiet, "quiet", "q", false, "Suppress output")
flags.StringVar(&importOpts.SignaturePolicy, "signature-policy", "", "Path to a signature-policy file") flags.StringVar(&importOpts.SignaturePolicy, "signature-policy", "", "Path to a signature-policy file")
_ = flags.MarkHidden("signature-policy") _ = flags.MarkHidden("signature-policy")

View File

@ -1,6 +1,7 @@
package images package images
import ( import (
"github.com/containers/podman/v2/cmd/podman/common"
"github.com/containers/podman/v2/cmd/podman/inspect" "github.com/containers/podman/v2/cmd/podman/inspect"
"github.com/containers/podman/v2/cmd/podman/registry" "github.com/containers/podman/v2/cmd/podman/registry"
"github.com/containers/podman/v2/pkg/domain/entities" "github.com/containers/podman/v2/pkg/domain/entities"
@ -14,6 +15,7 @@ var (
Short: "Display the configuration of an image", Short: "Display the configuration of an image",
Long: `Displays the low-level information of an image identified by name or ID.`, Long: `Displays the low-level information of an image identified by name or ID.`,
RunE: inspectExec, RunE: inspectExec,
ValidArgsFunction: common.AutocompleteImages,
Example: `podman inspect alpine Example: `podman inspect alpine
podman inspect --format "imageId: {{.Id}} size: {{.Size}}" alpine podman inspect --format "imageId: {{.Id}} size: {{.Size}}" alpine
podman inspect --format "image: {{.ImageName}} driver: {{.Driver}}" myctr`, podman inspect --format "image: {{.ImageName}} driver: {{.Driver}}" myctr`,
@ -29,7 +31,10 @@ func init() {
}) })
inspectOpts = new(entities.InspectOptions) inspectOpts = new(entities.InspectOptions)
flags := inspectCmd.Flags() flags := inspectCmd.Flags()
flags.StringVarP(&inspectOpts.Format, "format", "f", "json", "Format the output to a Go template or json")
formatFlagName := "format"
flags.StringVarP(&inspectOpts.Format, formatFlagName, "f", "json", "Format the output to a Go template or json")
_ = inspectCmd.RegisterFlagCompletionFunc(formatFlagName, common.AutocompleteJSONFormat)
} }
func inspectExec(cmd *cobra.Command, args []string) error { func inspectExec(cmd *cobra.Command, args []string) error {

View File

@ -10,15 +10,16 @@ import (
"time" "time"
"unicode" "unicode"
"github.com/containers/common/pkg/completion"
"github.com/containers/common/pkg/report" "github.com/containers/common/pkg/report"
"github.com/containers/image/v5/docker/reference" "github.com/containers/image/v5/docker/reference"
"github.com/containers/podman/v2/cmd/podman/common"
"github.com/containers/podman/v2/cmd/podman/parse" "github.com/containers/podman/v2/cmd/podman/parse"
"github.com/containers/podman/v2/cmd/podman/registry" "github.com/containers/podman/v2/cmd/podman/registry"
"github.com/containers/podman/v2/pkg/domain/entities" "github.com/containers/podman/v2/pkg/domain/entities"
"github.com/docker/go-units" "github.com/docker/go-units"
"github.com/pkg/errors" "github.com/pkg/errors"
"github.com/spf13/cobra" "github.com/spf13/cobra"
"github.com/spf13/pflag"
) )
type listFlagType struct { type listFlagType struct {
@ -41,6 +42,7 @@ var (
Short: "List images in local storage", Short: "List images in local storage",
Long: "Lists images previously pulled to the system or created on the system.", Long: "Lists images previously pulled to the system or created on the system.",
RunE: images, RunE: images,
ValidArgsFunction: common.AutocompleteImages,
Example: `podman image list --format json Example: `podman image list --format json
podman image list --sort repository --format "table {{.ID}} {{.Repository}} {{.Tag}}" podman image list --sort repository --format "table {{.ID}} {{.Repository}} {{.Tag}}"
podman image list --filter dangling=true`, podman image list --filter dangling=true`,
@ -67,18 +69,32 @@ func init() {
Command: listCmd, Command: listCmd,
Parent: imageCmd, Parent: imageCmd,
}) })
imageListFlagSet(listCmd.Flags()) imageListFlagSet(listCmd)
} }
func imageListFlagSet(flags *pflag.FlagSet) { func imageListFlagSet(cmd *cobra.Command) {
flags := cmd.Flags()
flags.BoolVarP(&listOptions.All, "all", "a", false, "Show all images (default hides intermediate images)") 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") filterFlagName := "filter"
flags.StringSliceVarP(&listOptions.Filter, filterFlagName, "f", []string{}, "Filter output based on conditions provided (default [])")
// TODO: add completion function for filters
_ = cmd.RegisterFlagCompletionFunc(filterFlagName, completion.AutocompleteNone)
formatFlagName := "format"
flags.StringVar(&listFlag.format, formatFlagName, "", "Change the output format to JSON or a Go template")
_ = cmd.RegisterFlagCompletionFunc(formatFlagName, common.AutocompleteJSONFormat)
flags.BoolVar(&listFlag.digests, "digests", false, "Show digests") flags.BoolVar(&listFlag.digests, "digests", false, "Show digests")
flags.BoolVarP(&listFlag.noHeading, "noheading", "n", false, "Do not print column headings") 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, "no-trunc", false, "Do not truncate output")
flags.BoolVarP(&listFlag.quiet, "quiet", "q", false, "Display only image IDs") flags.BoolVarP(&listFlag.quiet, "quiet", "q", false, "Display only image IDs")
flags.StringVar(&listFlag.sort, "sort", "created", "Sort by "+sortFields.String())
sortFlagName := "sort"
flags.StringVar(&listFlag.sort, sortFlagName, "created", "Sort by "+sortFields.String())
_ = cmd.RegisterFlagCompletionFunc(sortFlagName, completion.AutocompleteNone)
flags.BoolVarP(&listFlag.history, "history", "", false, "Display the image name history") flags.BoolVarP(&listFlag.history, "history", "", false, "Display the image name history")
} }

View File

@ -8,6 +8,7 @@ import (
"os" "os"
"strings" "strings"
"github.com/containers/common/pkg/completion"
"github.com/containers/image/v5/docker/reference" "github.com/containers/image/v5/docker/reference"
"github.com/containers/podman/v2/cmd/podman/parse" "github.com/containers/podman/v2/cmd/podman/parse"
"github.com/containers/podman/v2/cmd/podman/registry" "github.com/containers/podman/v2/cmd/podman/registry"
@ -15,7 +16,6 @@ import (
"github.com/containers/podman/v2/pkg/util" "github.com/containers/podman/v2/pkg/util"
"github.com/pkg/errors" "github.com/pkg/errors"
"github.com/spf13/cobra" "github.com/spf13/cobra"
"github.com/spf13/pflag"
"golang.org/x/crypto/ssh/terminal" "golang.org/x/crypto/ssh/terminal"
) )
@ -27,6 +27,7 @@ var (
Long: loadDescription, Long: loadDescription,
RunE: load, RunE: load,
Args: cobra.MaximumNArgs(1), Args: cobra.MaximumNArgs(1),
ValidArgsFunction: completion.AutocompleteNone,
} }
imageLoadCommand = &cobra.Command{ imageLoadCommand = &cobra.Command{
@ -34,6 +35,7 @@ var (
Use: loadCommand.Use, Use: loadCommand.Use,
Short: loadCommand.Short, Short: loadCommand.Short,
Long: loadCommand.Long, Long: loadCommand.Long,
ValidArgsFunction: loadCommand.ValidArgsFunction,
RunE: loadCommand.RunE, RunE: loadCommand.RunE,
} }
) )
@ -47,17 +49,22 @@ func init() {
Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode}, Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode},
Command: loadCommand, Command: loadCommand,
}) })
loadFlags(loadCommand.Flags()) loadFlags(loadCommand)
registry.Commands = append(registry.Commands, registry.CliCommand{ registry.Commands = append(registry.Commands, registry.CliCommand{
Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode}, Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode},
Command: imageLoadCommand, Command: imageLoadCommand,
Parent: imageCmd, Parent: imageCmd,
}) })
loadFlags(imageLoadCommand.Flags()) loadFlags(imageLoadCommand)
} }
func loadFlags(flags *pflag.FlagSet) { func loadFlags(cmd *cobra.Command) {
flags.StringVarP(&loadOpts.Input, "input", "i", "", "Read from specified archive file (default: stdin)") flags := cmd.Flags()
inputFlagName := "input"
flags.StringVarP(&loadOpts.Input, inputFlagName, "i", "", "Read from specified archive file (default: stdin)")
_ = cmd.RegisterFlagCompletionFunc(inputFlagName, completion.AutocompleteDefault)
flags.BoolVarP(&loadOpts.Quiet, "quiet", "q", false, "Suppress the output") flags.BoolVarP(&loadOpts.Quiet, "quiet", "q", false, "Suppress the output")
flags.StringVar(&loadOpts.SignaturePolicy, "signature-policy", "", "Pathname of signature policy file") flags.StringVar(&loadOpts.SignaturePolicy, "signature-policy", "", "Pathname of signature policy file")
_ = flags.MarkHidden("signature-policy") _ = flags.MarkHidden("signature-policy")

View File

@ -7,12 +7,12 @@ import (
"text/template" "text/template"
"github.com/containers/common/pkg/report" "github.com/containers/common/pkg/report"
"github.com/containers/podman/v2/cmd/podman/common"
"github.com/containers/podman/v2/cmd/podman/registry" "github.com/containers/podman/v2/cmd/podman/registry"
"github.com/containers/podman/v2/cmd/podman/utils" "github.com/containers/podman/v2/cmd/podman/utils"
"github.com/containers/podman/v2/pkg/domain/entities" "github.com/containers/podman/v2/pkg/domain/entities"
"github.com/pkg/errors" "github.com/pkg/errors"
"github.com/spf13/cobra" "github.com/spf13/cobra"
"github.com/spf13/pflag"
) )
var ( var (
@ -28,6 +28,7 @@ var (
Short: "Mount an image's root filesystem", Short: "Mount an image's root filesystem",
Long: mountDescription, Long: mountDescription,
RunE: mount, RunE: mount,
ValidArgsFunction: common.AutocompleteImages,
Example: `podman image mount imgID Example: `podman image mount imgID
podman image mount imgID1 imgID2 imgID3 podman image mount imgID1 imgID2 imgID3
podman image mount podman image mount
@ -43,9 +44,14 @@ var (
mountOpts entities.ImageMountOptions mountOpts entities.ImageMountOptions
) )
func mountFlags(flags *pflag.FlagSet) { func mountFlags(cmd *cobra.Command) {
flags := cmd.Flags()
flags.BoolVarP(&mountOpts.All, "all", "a", false, "Mount all images") flags.BoolVarP(&mountOpts.All, "all", "a", false, "Mount all images")
flags.StringVar(&mountOpts.Format, "format", "", "Print the mounted images in specified format (json)")
formatFlagName := "format"
flags.StringVar(&mountOpts.Format, formatFlagName, "", "Print the mounted images in specified format (json)")
_ = cmd.RegisterFlagCompletionFunc(formatFlagName, common.AutocompleteJSONFormat)
} }
func init() { func init() {
@ -54,7 +60,7 @@ func init() {
Command: mountCommand, Command: mountCommand,
Parent: imageCmd, Parent: imageCmd,
}) })
mountFlags(mountCommand.Flags()) mountFlags(mountCommand)
} }
func mount(cmd *cobra.Command, args []string) error { func mount(cmd *cobra.Command, args []string) error {

View File

@ -6,6 +6,7 @@ import (
"os" "os"
"strings" "strings"
"github.com/containers/common/pkg/completion"
"github.com/containers/podman/v2/cmd/podman/registry" "github.com/containers/podman/v2/cmd/podman/registry"
"github.com/containers/podman/v2/cmd/podman/utils" "github.com/containers/podman/v2/cmd/podman/utils"
"github.com/containers/podman/v2/cmd/podman/validate" "github.com/containers/podman/v2/cmd/podman/validate"
@ -24,6 +25,7 @@ var (
Short: "Remove unused images", Short: "Remove unused images",
Long: pruneDescription, Long: pruneDescription,
RunE: prune, RunE: prune,
ValidArgsFunction: completion.AutocompleteNone,
Example: `podman image prune`, Example: `podman image prune`,
} }
@ -42,7 +44,11 @@ func init() {
flags := pruneCmd.Flags() flags := pruneCmd.Flags()
flags.BoolVarP(&pruneOpts.All, "all", "a", false, "Remove all unused images, not just dangling ones") 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.BoolVarP(&force, "force", "f", false, "Do not prompt for confirmation")
flags.StringArrayVar(&filter, "filter", []string{}, "Provide filter values (e.g. 'label=<key>=<value>')")
filterFlagName := "filter"
flags.StringArrayVar(&filter, filterFlagName, []string{}, "Provide filter values (e.g. 'label=<key>=<value>')")
//TODO: add completion for filters
_ = pruneCmd.RegisterFlagCompletionFunc(filterFlagName, completion.AutocompleteNone)
} }

View File

@ -5,12 +5,13 @@ import (
"os" "os"
"github.com/containers/common/pkg/auth" "github.com/containers/common/pkg/auth"
"github.com/containers/common/pkg/completion"
"github.com/containers/image/v5/types" "github.com/containers/image/v5/types"
"github.com/containers/podman/v2/cmd/podman/common"
"github.com/containers/podman/v2/cmd/podman/registry" "github.com/containers/podman/v2/cmd/podman/registry"
"github.com/containers/podman/v2/pkg/domain/entities" "github.com/containers/podman/v2/pkg/domain/entities"
"github.com/containers/podman/v2/pkg/util" "github.com/containers/podman/v2/pkg/util"
"github.com/spf13/cobra" "github.com/spf13/cobra"
"github.com/spf13/pflag"
) )
// pullOptionsWrapper wraps entities.ImagePullOptions and prevents leaking // pullOptionsWrapper wraps entities.ImagePullOptions and prevents leaking
@ -34,6 +35,7 @@ var (
Short: "Pull an image from a registry", Short: "Pull an image from a registry",
Long: pullDescription, Long: pullDescription,
RunE: imagePull, RunE: imagePull,
ValidArgsFunction: common.AutocompleteImages,
Example: `podman pull imageName Example: `podman pull imageName
podman pull fedora:latest`, podman pull fedora:latest`,
} }
@ -47,6 +49,7 @@ var (
Short: pullCmd.Short, Short: pullCmd.Short,
Long: pullCmd.Long, Long: pullCmd.Long,
RunE: pullCmd.RunE, RunE: pullCmd.RunE,
ValidArgsFunction: pullCmd.ValidArgsFunction,
Example: `podman image pull imageName Example: `podman image pull imageName
podman image pull fedora:latest`, podman image pull fedora:latest`,
} }
@ -58,9 +61,7 @@ func init() {
Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode}, Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode},
Command: pullCmd, Command: pullCmd,
}) })
pullFlags(pullCmd)
flags := pullCmd.Flags()
pullFlags(flags)
// images pull // images pull
registry.Commands = append(registry.Commands, registry.CliCommand{ registry.Commands = append(registry.Commands, registry.CliCommand{
@ -68,26 +69,46 @@ func init() {
Command: imagesPullCmd, Command: imagesPullCmd,
Parent: imageCmd, Parent: imageCmd,
}) })
pullFlags(imagesPullCmd)
imagesPullFlags := imagesPullCmd.Flags()
pullFlags(imagesPullFlags)
} }
// pullFlags set the flags for the pull command. // pullFlags set the flags for the pull command.
func pullFlags(flags *pflag.FlagSet) { func pullFlags(cmd *cobra.Command) {
flags := cmd.Flags()
flags.BoolVar(&pullOptions.AllTags, "all-tags", false, "All tagged images in the repository will be pulled") flags.BoolVar(&pullOptions.AllTags, "all-tags", false, "All tagged images in the repository will be pulled")
flags.StringVar(&pullOptions.CredentialsCLI, "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") credsFlagName := "creds"
flags.StringVar(&pullOptions.OverrideOS, "override-os", "", "Use `OS` instead of the running OS for choosing images") flags.StringVar(&pullOptions.CredentialsCLI, credsFlagName, "", "`Credentials` (USERNAME:PASSWORD) to use for authenticating to a registry")
flags.StringVar(&pullOptions.OverrideVariant, "override-variant", "", " use VARIANT instead of the running architecture variant for choosing images") _ = cmd.RegisterFlagCompletionFunc(credsFlagName, completion.AutocompleteNone)
overrideArchFlagName := "override-arch"
flags.StringVar(&pullOptions.OverrideArch, overrideArchFlagName, "", "Use `ARCH` instead of the architecture of the machine for choosing images")
_ = cmd.RegisterFlagCompletionFunc(overrideArchFlagName, completion.AutocompleteNone)
overrideOsFlagName := "override-os"
flags.StringVar(&pullOptions.OverrideOS, overrideOsFlagName, "", "Use `OS` instead of the running OS for choosing images")
_ = cmd.RegisterFlagCompletionFunc(overrideOsFlagName, completion.AutocompleteNone)
overrideVariantFlagName := "override-variant"
flags.StringVar(&pullOptions.OverrideVariant, overrideVariantFlagName, "", " use VARIANT instead of the running architecture variant for choosing images")
_ = cmd.RegisterFlagCompletionFunc(overrideVariantFlagName, completion.AutocompleteNone)
flags.Bool("disable-content-trust", false, "This is a Docker specific option and is a NOOP") flags.Bool("disable-content-trust", false, "This is a Docker specific option and is a NOOP")
flags.BoolVarP(&pullOptions.Quiet, "quiet", "q", false, "Suppress output information when pulling 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.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") flags.BoolVar(&pullOptions.TLSVerifyCLI, "tls-verify", true, "Require HTTPS and verify certificates when contacting registries")
flags.StringVar(&pullOptions.Authfile, "authfile", auth.GetDefaultAuthFile(), "Path of the authentication file. Use REGISTRY_AUTH_FILE environment variable to override")
authfileFlagName := "authfile"
flags.StringVar(&pullOptions.Authfile, authfileFlagName, auth.GetDefaultAuthFile(), "Path of the authentication file. Use REGISTRY_AUTH_FILE environment variable to override")
_ = cmd.RegisterFlagCompletionFunc(authfileFlagName, completion.AutocompleteDefault)
if !registry.IsRemote() { if !registry.IsRemote() {
flags.StringVar(&pullOptions.CertDir, "cert-dir", "", "`Pathname` of a directory containing TLS certificates and keys")
certDirFlagName := "cert-dir"
flags.StringVar(&pullOptions.CertDir, certDirFlagName, "", "`Pathname` of a directory containing TLS certificates and keys")
_ = cmd.RegisterFlagCompletionFunc(certDirFlagName, completion.AutocompleteDefault)
} }
_ = flags.MarkHidden("signature-policy") _ = flags.MarkHidden("signature-policy")
} }

View File

@ -4,12 +4,13 @@ import (
"os" "os"
"github.com/containers/common/pkg/auth" "github.com/containers/common/pkg/auth"
"github.com/containers/common/pkg/completion"
"github.com/containers/image/v5/types" "github.com/containers/image/v5/types"
"github.com/containers/podman/v2/cmd/podman/common"
"github.com/containers/podman/v2/cmd/podman/registry" "github.com/containers/podman/v2/cmd/podman/registry"
"github.com/containers/podman/v2/pkg/domain/entities" "github.com/containers/podman/v2/pkg/domain/entities"
"github.com/containers/podman/v2/pkg/util" "github.com/containers/podman/v2/pkg/util"
"github.com/spf13/cobra" "github.com/spf13/cobra"
"github.com/spf13/pflag"
) )
// pushOptionsWrapper wraps entities.ImagepushOptions and prevents leaking // pushOptionsWrapper wraps entities.ImagepushOptions and prevents leaking
@ -33,6 +34,7 @@ var (
Long: pushDescription, Long: pushDescription,
RunE: imagePush, RunE: imagePush,
Args: cobra.RangeArgs(1, 2), Args: cobra.RangeArgs(1, 2),
ValidArgsFunction: common.AutocompleteImages,
Example: `podman push imageID docker://registry.example.com/repository:tag Example: `podman push imageID docker://registry.example.com/repository:tag
podman push imageID oci-archive:/path/to/layout:image:tag`, podman push imageID oci-archive:/path/to/layout:image:tag`,
} }
@ -46,6 +48,7 @@ var (
Long: pushCmd.Long, Long: pushCmd.Long,
RunE: pushCmd.RunE, RunE: pushCmd.RunE,
Args: pushCmd.Args, Args: pushCmd.Args,
ValidArgsFunction: pushCmd.ValidArgsFunction,
Example: `podman image push imageID docker://registry.example.com/repository:tag Example: `podman image push imageID docker://registry.example.com/repository:tag
podman image push imageID oci-archive:/path/to/layout:image:tag`, podman image push imageID oci-archive:/path/to/layout:image:tag`,
} }
@ -57,9 +60,7 @@ func init() {
Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode}, Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode},
Command: pushCmd, Command: pushCmd,
}) })
pushFlags(pushCmd)
flags := pushCmd.Flags()
pushFlags(flags)
// images push // images push
registry.Commands = append(registry.Commands, registry.CliCommand{ registry.Commands = append(registry.Commands, registry.CliCommand{
@ -67,23 +68,45 @@ func init() {
Command: imagePushCmd, Command: imagePushCmd,
Parent: imageCmd, Parent: imageCmd,
}) })
pushFlags(imagePushCmd)
pushFlags(imagePushCmd.Flags())
} }
// pushFlags set the flags for the push command. // pushFlags set the flags for the push command.
func pushFlags(flags *pflag.FlagSet) { func pushFlags(cmd *cobra.Command) {
flags.StringVar(&pushOptions.Authfile, "authfile", auth.GetDefaultAuthFile(), "Path of the authentication file. Use REGISTRY_AUTH_FILE environment variable to override") flags := cmd.Flags()
flags.StringVar(&pushOptions.CertDir, "cert-dir", "", "Path to a directory containing TLS certificates and keys")
authfileFlagName := "authfile"
flags.StringVar(&pushOptions.Authfile, authfileFlagName, auth.GetDefaultAuthFile(), "Path of the authentication file. Use REGISTRY_AUTH_FILE environment variable to override")
_ = cmd.RegisterFlagCompletionFunc(authfileFlagName, completion.AutocompleteDefault)
certDirFlagName := "cert-dir"
flags.StringVar(&pushOptions.CertDir, certDirFlagName, "", "Path to a directory containing TLS certificates and keys")
_ = cmd.RegisterFlagCompletionFunc(certDirFlagName, completion.AutocompleteDefault)
flags.BoolVar(&pushOptions.Compress, "compress", false, "Compress tarball image layers when pushing to a directory using the 'dir' transport. (default is same compression type as source)") flags.BoolVar(&pushOptions.Compress, "compress", false, "Compress tarball image layers when pushing to a directory using the 'dir' transport. (default is same compression type as source)")
flags.StringVar(&pushOptions.CredentialsCLI, "creds", "", "`Credentials` (USERNAME:PASSWORD) to use for authenticating to a registry")
flags.StringVar(&pushOptions.DigestFile, "digestfile", "", "Write the digest of the pushed image to the specified file") credsFlagName := "creds"
flags.StringVar(&pushOptions.CredentialsCLI, credsFlagName, "", "`Credentials` (USERNAME:PASSWORD) to use for authenticating to a registry")
_ = cmd.RegisterFlagCompletionFunc(credsFlagName, completion.AutocompleteNone)
flags.Bool("disable-content-trust", false, "This is a Docker specific option and is a NOOP") flags.Bool("disable-content-trust", false, "This is a Docker specific option and is a NOOP")
flags.StringVarP(&pushOptions.Format, "format", "f", "", "Manifest type (oci, v2s1, or v2s2) to use when pushing an image using the 'dir' transport (default is manifest type of source)")
digestfileFlagName := "digestfile"
flags.StringVar(&pushOptions.DigestFile, digestfileFlagName, "", "Write the digest of the pushed image to the specified file")
_ = cmd.RegisterFlagCompletionFunc(digestfileFlagName, completion.AutocompleteDefault)
formatFlagName := "format"
flags.StringVarP(&pushOptions.Format, formatFlagName, "f", "", "Manifest type (oci, v2s1, or v2s2) to use when pushing an image using the 'dir' transport (default is manifest type of source)")
_ = cmd.RegisterFlagCompletionFunc(formatFlagName, common.AutocompleteManifestFormat)
flags.BoolVarP(&pushOptions.Quiet, "quiet", "q", false, "Suppress output information when pushing images") flags.BoolVarP(&pushOptions.Quiet, "quiet", "q", false, "Suppress output information when pushing images")
flags.BoolVar(&pushOptions.RemoveSignatures, "remove-signatures", false, "Discard any pre-existing signatures in the image") flags.BoolVar(&pushOptions.RemoveSignatures, "remove-signatures", false, "Discard any pre-existing signatures in the image")
flags.StringVar(&pushOptions.SignaturePolicy, "signature-policy", "", "Path to a signature-policy file") flags.StringVar(&pushOptions.SignaturePolicy, "signature-policy", "", "Path to a signature-policy file")
flags.StringVar(&pushOptions.SignBy, "sign-by", "", "Add a signature at the destination using the specified key")
signByFlagName := "sign-by"
flags.StringVar(&pushOptions.SignBy, signByFlagName, "", "Add a signature at the destination using the specified key")
_ = cmd.RegisterFlagCompletionFunc(signByFlagName, completion.AutocompleteNone)
flags.BoolVar(&pushOptions.TLSVerifyCLI, "tls-verify", true, "Require HTTPS and verify certificates when contacting registries") flags.BoolVar(&pushOptions.TLSVerifyCLI, "tls-verify", true, "Require HTTPS and verify certificates when contacting registries")
if registry.IsRemote() { if registry.IsRemote() {

View File

@ -3,6 +3,7 @@ package images
import ( import (
"fmt" "fmt"
"github.com/containers/podman/v2/cmd/podman/common"
"github.com/containers/podman/v2/cmd/podman/registry" "github.com/containers/podman/v2/cmd/podman/registry"
"github.com/containers/podman/v2/pkg/domain/entities" "github.com/containers/podman/v2/pkg/domain/entities"
"github.com/containers/podman/v2/pkg/errorhandling" "github.com/containers/podman/v2/pkg/errorhandling"
@ -18,6 +19,7 @@ var (
Short: "Removes one or more images from local storage", Short: "Removes one or more images from local storage",
Long: rmDescription, Long: rmDescription,
RunE: rm, RunE: rm,
ValidArgsFunction: common.AutocompleteImages,
Example: `podman image rm imageID Example: `podman image rm imageID
podman image rm --force alpine podman image rm --force alpine
podman image rm c4dfb1609ee2 93fd78260bd1 c0ed59d05ff7`, podman image rm c4dfb1609ee2 93fd78260bd1 c0ed59d05ff7`,

View File

@ -15,6 +15,7 @@ var (
Short: rmCmd.Short, Short: rmCmd.Short,
Long: rmCmd.Long, Long: rmCmd.Long,
RunE: rmCmd.RunE, RunE: rmCmd.RunE,
ValidArgsFunction: rmCmd.ValidArgsFunction,
Example: strings.Replace(rmCmd.Example, "podman image rm", "podman rmi", -1), Example: strings.Replace(rmCmd.Example, "podman image rm", "podman rmi", -1),
} }
) )

View File

@ -5,6 +5,8 @@ import (
"os" "os"
"strings" "strings"
"github.com/containers/common/pkg/completion"
"github.com/containers/podman/v2/cmd/podman/common"
"github.com/containers/podman/v2/cmd/podman/parse" "github.com/containers/podman/v2/cmd/podman/parse"
"github.com/containers/podman/v2/cmd/podman/registry" "github.com/containers/podman/v2/cmd/podman/registry"
"github.com/containers/podman/v2/libpod/define" "github.com/containers/podman/v2/libpod/define"
@ -12,7 +14,6 @@ import (
"github.com/containers/podman/v2/pkg/util" "github.com/containers/podman/v2/pkg/util"
"github.com/pkg/errors" "github.com/pkg/errors"
"github.com/spf13/cobra" "github.com/spf13/cobra"
"github.com/spf13/pflag"
"golang.org/x/crypto/ssh/terminal" "golang.org/x/crypto/ssh/terminal"
) )
@ -42,6 +43,7 @@ var (
} }
return nil return nil
}, },
ValidArgsFunction: completion.AutocompleteNone,
Example: `podman save --quiet -o myimage.tar imageID Example: `podman save --quiet -o myimage.tar imageID
podman save --format docker-dir -o ubuntu-dir ubuntu podman save --format docker-dir -o ubuntu-dir ubuntu
podman save > alpine-all.tar alpine:latest`, podman save > alpine-all.tar alpine:latest`,
@ -52,6 +54,7 @@ var (
Short: saveCommand.Short, Short: saveCommand.Short,
Long: saveCommand.Long, Long: saveCommand.Long,
RunE: saveCommand.RunE, RunE: saveCommand.RunE,
ValidArgsFunction: saveCommand.ValidArgsFunction,
Example: `podman image save --quiet -o myimage.tar imageID Example: `podman image save --quiet -o myimage.tar imageID
podman image save --format docker-dir -o ubuntu-dir ubuntu podman image save --format docker-dir -o ubuntu-dir ubuntu
podman image save > alpine-all.tar alpine:latest`, podman image save > alpine-all.tar alpine:latest`,
@ -67,20 +70,29 @@ func init() {
Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode}, Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode},
Command: saveCommand, Command: saveCommand,
}) })
saveFlags(saveCommand.Flags()) saveFlags(saveCommand)
registry.Commands = append(registry.Commands, registry.CliCommand{ registry.Commands = append(registry.Commands, registry.CliCommand{
Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode}, Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode},
Command: imageSaveCommand, Command: imageSaveCommand,
Parent: imageCmd, Parent: imageCmd,
}) })
saveFlags(imageSaveCommand.Flags()) saveFlags(imageSaveCommand)
} }
func saveFlags(flags *pflag.FlagSet) { func saveFlags(cmd *cobra.Command) {
flags := cmd.Flags()
flags.BoolVar(&saveOpts.Compress, "compress", false, "Compress tarball image layers when saving to a directory using the 'dir' transport. (default is same compression type as source)") flags.BoolVar(&saveOpts.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(&saveOpts.Format, "format", define.V2s2Archive, "Save image to oci-archive, oci-dir (directory with oci manifest type), docker-archive, docker-dir (directory with v2s2 manifest type)")
flags.StringVarP(&saveOpts.Output, "output", "o", "", "Write to a specified file (default: stdout, which must be redirected)") formatFlagName := "format"
flags.StringVar(&saveOpts.Format, formatFlagName, define.V2s2Archive, "Save image to oci-archive, oci-dir (directory with oci manifest type), docker-archive, docker-dir (directory with v2s2 manifest type)")
_ = cmd.RegisterFlagCompletionFunc(formatFlagName, common.AutocompleteImageSaveFormat)
outputFlagName := "output"
flags.StringVarP(&saveOpts.Output, outputFlagName, "o", "", "Write to a specified file (default: stdout, which must be redirected)")
_ = cmd.RegisterFlagCompletionFunc(outputFlagName, completion.AutocompleteDefault)
flags.BoolVarP(&saveOpts.Quiet, "quiet", "q", false, "Suppress the output") flags.BoolVarP(&saveOpts.Quiet, "quiet", "q", false, "Suppress the output")
flags.BoolVarP(&saveOpts.MultiImageArchive, "multi-image-archive", "m", containerConfig.Engine.MultiImageArchive, "Interpret additional arguments as images not tags and create a multi-image-archive (only for docker-archive)") flags.BoolVarP(&saveOpts.MultiImageArchive, "multi-image-archive", "m", containerConfig.Engine.MultiImageArchive, "Interpret additional arguments as images not tags and create a multi-image-archive (only for docker-archive)")
} }

View File

@ -7,6 +7,7 @@ import (
"text/template" "text/template"
"github.com/containers/common/pkg/auth" "github.com/containers/common/pkg/auth"
"github.com/containers/common/pkg/completion"
"github.com/containers/common/pkg/report" "github.com/containers/common/pkg/report"
"github.com/containers/image/v5/types" "github.com/containers/image/v5/types"
"github.com/containers/podman/v2/cmd/podman/parse" "github.com/containers/podman/v2/cmd/podman/parse"
@ -14,7 +15,6 @@ import (
"github.com/containers/podman/v2/pkg/domain/entities" "github.com/containers/podman/v2/pkg/domain/entities"
"github.com/pkg/errors" "github.com/pkg/errors"
"github.com/spf13/cobra" "github.com/spf13/cobra"
"github.com/spf13/pflag"
) )
// searchOptionsWrapper wraps entities.ImagePullOptions and prevents leaking // searchOptionsWrapper wraps entities.ImagePullOptions and prevents leaking
@ -39,6 +39,7 @@ var (
Long: searchDescription, Long: searchDescription,
RunE: imageSearch, RunE: imageSearch,
Args: cobra.ExactArgs(1), Args: cobra.ExactArgs(1),
ValidArgsFunction: completion.AutocompleteNone,
Example: `podman search --filter=is-official --limit 3 alpine Example: `podman search --filter=is-official --limit 3 alpine
podman search registry.fedoraproject.org/ # only works with v2 registries podman search registry.fedoraproject.org/ # only works with v2 registries
podman search --format "table {{.Index}} {{.Name}}" registry.fedoraproject.org/fedora`, podman search --format "table {{.Index}} {{.Name}}" registry.fedoraproject.org/fedora`,
@ -52,6 +53,7 @@ var (
RunE: searchCmd.RunE, RunE: searchCmd.RunE,
Args: searchCmd.Args, Args: searchCmd.Args,
Annotations: searchCmd.Annotations, Annotations: searchCmd.Annotations,
ValidArgsFunction: searchCmd.ValidArgsFunction,
Example: `podman image search --filter=is-official --limit 3 alpine Example: `podman image search --filter=is-official --limit 3 alpine
podman image search registry.fedoraproject.org/ # only works with v2 registries podman image search registry.fedoraproject.org/ # only works with v2 registries
podman image search --format "table {{.Index}} {{.Name}}" registry.fedoraproject.org/fedora`, podman image search --format "table {{.Index}} {{.Name}}" registry.fedoraproject.org/fedora`,
@ -64,9 +66,7 @@ func init() {
Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode}, Mode: []entities.EngineMode{entities.ABIMode, entities.TunnelMode},
Command: searchCmd, Command: searchCmd,
}) })
searchFlags(searchCmd)
flags := searchCmd.Flags()
searchFlags(flags)
// images search // images search
registry.Commands = append(registry.Commands, registry.CliCommand{ registry.Commands = append(registry.Commands, registry.CliCommand{
@ -74,18 +74,32 @@ func init() {
Command: imageSearchCmd, Command: imageSearchCmd,
Parent: imageCmd, Parent: imageCmd,
}) })
searchFlags(imageSearchCmd)
imageSearchFlags := imageSearchCmd.Flags()
searchFlags(imageSearchFlags)
} }
// searchFlags set the flags for the pull command. // searchFlags set the flags for the pull command.
func searchFlags(flags *pflag.FlagSet) { func searchFlags(cmd *cobra.Command) {
flags.StringSliceVarP(&searchOptions.Filters, "filter", "f", []string{}, "Filter output based on conditions provided (default [])") flags := cmd.Flags()
flags.StringVar(&searchOptions.Format, "format", "", "Change the output format to JSON or a Go template")
flags.IntVar(&searchOptions.Limit, "limit", 0, "Limit the number of results") filterFlagName := "filter"
flags.StringSliceVarP(&searchOptions.Filters, filterFlagName, "f", []string{}, "Filter output based on conditions provided (default [])")
//TODO add custom filter function
_ = cmd.RegisterFlagCompletionFunc(filterFlagName, completion.AutocompleteNone)
formatFlagName := "format"
flags.StringVar(&searchOptions.Format, formatFlagName, "", "Change the output format to JSON or a Go template")
_ = cmd.RegisterFlagCompletionFunc(formatFlagName, completion.AutocompleteNone)
limitFlagName := "limit"
flags.IntVar(&searchOptions.Limit, limitFlagName, 0, "Limit the number of results")
_ = cmd.RegisterFlagCompletionFunc(limitFlagName, completion.AutocompleteNone)
flags.BoolVar(&searchOptions.NoTrunc, "no-trunc", false, "Do not truncate the output") flags.BoolVar(&searchOptions.NoTrunc, "no-trunc", false, "Do not truncate the output")
flags.StringVar(&searchOptions.Authfile, "authfile", auth.GetDefaultAuthFile(), "Path of the authentication file. Use REGISTRY_AUTH_FILE environment variable to override")
authfileFlagName := "authfile"
flags.StringVar(&searchOptions.Authfile, authfileFlagName, auth.GetDefaultAuthFile(), "Path of the authentication file. Use REGISTRY_AUTH_FILE environment variable to override")
_ = cmd.RegisterFlagCompletionFunc(authfileFlagName, completion.AutocompleteDefault)
flags.BoolVar(&searchOptions.TLSVerifyCLI, "tls-verify", true, "Require HTTPS and verify certificates when contacting registries") flags.BoolVar(&searchOptions.TLSVerifyCLI, "tls-verify", true, "Require HTTPS and verify certificates when contacting registries")
flags.BoolVar(&searchOptions.ListTags, "list-tags", false, "List the tags of the input registry") flags.BoolVar(&searchOptions.ListTags, "list-tags", false, "List the tags of the input registry")
} }

View File

@ -3,6 +3,8 @@ package images
import ( import (
"os" "os"
"github.com/containers/common/pkg/completion"
"github.com/containers/podman/v2/cmd/podman/common"
"github.com/containers/podman/v2/cmd/podman/registry" "github.com/containers/podman/v2/cmd/podman/registry"
"github.com/containers/podman/v2/pkg/domain/entities" "github.com/containers/podman/v2/pkg/domain/entities"
"github.com/pkg/errors" "github.com/pkg/errors"
@ -17,6 +19,7 @@ var (
Long: signDescription, Long: signDescription,
RunE: sign, RunE: sign,
Args: cobra.MinimumNArgs(1), Args: cobra.MinimumNArgs(1),
ValidArgsFunction: common.AutocompleteImages,
Example: `podman image sign --sign-by mykey imageID Example: `podman image sign --sign-by mykey imageID
podman image sign --sign-by mykey --directory ./mykeydir imageID`, podman image sign --sign-by mykey --directory ./mykeydir imageID`,
} }
@ -33,9 +36,17 @@ func init() {
Parent: imageCmd, Parent: imageCmd,
}) })
flags := signCommand.Flags() flags := signCommand.Flags()
flags.StringVarP(&signOptions.Directory, "directory", "d", "", "Define an alternate directory to store signatures") directoryFlagName := "directory"
flags.StringVar(&signOptions.SignBy, "sign-by", "", "Name of the signing key") flags.StringVarP(&signOptions.Directory, directoryFlagName, "d", "", "Define an alternate directory to store signatures")
flags.StringVar(&signOptions.CertDir, "cert-dir", "", "`Pathname` of a directory containing TLS certificates and keys") _ = signCommand.RegisterFlagCompletionFunc(directoryFlagName, completion.AutocompleteDefault)
signByFlagName := "sign-by"
flags.StringVar(&signOptions.SignBy, signByFlagName, "", "Name of the signing key")
_ = signCommand.RegisterFlagCompletionFunc(signByFlagName, completion.AutocompleteNone)
certDirFlagName := "cert-dir"
flags.StringVar(&signOptions.CertDir, certDirFlagName, "", "`Pathname` of a directory containing TLS certificates and keys")
_ = signCommand.RegisterFlagCompletionFunc(certDirFlagName, completion.AutocompleteDefault)
} }
func sign(cmd *cobra.Command, args []string) error { func sign(cmd *cobra.Command, args []string) error {

View File

@ -1,6 +1,7 @@
package images package images
import ( import (
"github.com/containers/podman/v2/cmd/podman/common"
"github.com/containers/podman/v2/cmd/podman/registry" "github.com/containers/podman/v2/cmd/podman/registry"
"github.com/containers/podman/v2/pkg/domain/entities" "github.com/containers/podman/v2/pkg/domain/entities"
"github.com/spf13/cobra" "github.com/spf13/cobra"
@ -15,6 +16,7 @@ var (
RunE: tag, RunE: tag,
Args: cobra.MinimumNArgs(2), Args: cobra.MinimumNArgs(2),
DisableFlagsInUseLine: true, DisableFlagsInUseLine: true,
ValidArgsFunction: common.AutocompleteImages,
Example: `podman tag 0e3bbc2 fedora:latest Example: `podman tag 0e3bbc2 fedora:latest
podman tag imageID:latest myNewImage:newTag podman tag imageID:latest myNewImage:newTag
podman tag httpd myregistryhost:5000/fedora/httpd:v2`, podman tag httpd myregistryhost:5000/fedora/httpd:v2`,
@ -27,6 +29,7 @@ var (
Short: tagCommand.Short, Short: tagCommand.Short,
Long: tagCommand.Long, Long: tagCommand.Long,
RunE: tagCommand.RunE, RunE: tagCommand.RunE,
ValidArgsFunction: tagCommand.ValidArgsFunction,
Example: `podman image tag 0e3bbc2 fedora:latest Example: `podman image tag 0e3bbc2 fedora:latest
podman image tag imageID:latest myNewImage:newTag podman image tag imageID:latest myNewImage:newTag
podman image tag httpd myregistryhost:5000/fedora/httpd:v2`, podman image tag httpd myregistryhost:5000/fedora/httpd:v2`,

View File

@ -3,6 +3,7 @@ package images
import ( import (
"fmt" "fmt"
"github.com/containers/podman/v2/cmd/podman/common"
"github.com/containers/podman/v2/cmd/podman/registry" "github.com/containers/podman/v2/cmd/podman/registry"
"github.com/containers/podman/v2/pkg/domain/entities" "github.com/containers/podman/v2/pkg/domain/entities"
"github.com/spf13/cobra" "github.com/spf13/cobra"
@ -16,6 +17,7 @@ var (
Short: treeDescription, Short: treeDescription,
Long: treeDescription, Long: treeDescription,
RunE: tree, RunE: tree,
ValidArgsFunction: common.AutocompleteImages,
Example: "podman image tree alpine:latest", Example: "podman image tree alpine:latest",
} }
treeOpts entities.ImageTreeOptions treeOpts entities.ImageTreeOptions

View File

@ -1,6 +1,8 @@
package images package images
import ( import (
"github.com/containers/common/pkg/completion"
"github.com/containers/podman/v2/cmd/podman/common"
"github.com/containers/podman/v2/cmd/podman/registry" "github.com/containers/podman/v2/cmd/podman/registry"
"github.com/containers/podman/v2/libpod/image" "github.com/containers/podman/v2/libpod/image"
"github.com/containers/podman/v2/pkg/domain/entities" "github.com/containers/podman/v2/pkg/domain/entities"
@ -18,6 +20,7 @@ var (
Example: "", Example: "",
RunE: setTrust, RunE: setTrust,
Args: cobra.ExactArgs(1), Args: cobra.ExactArgs(1),
ValidArgsFunction: common.AutocompleteRegistries,
} }
) )
@ -34,11 +37,17 @@ func init() {
setFlags := setTrustCommand.Flags() setFlags := setTrustCommand.Flags()
setFlags.StringVar(&setOptions.PolicyPath, "policypath", "", "") setFlags.StringVar(&setOptions.PolicyPath, "policypath", "", "")
_ = setFlags.MarkHidden("policypath") _ = setFlags.MarkHidden("policypath")
setFlags.StringSliceVarP(&setOptions.PubKeysFile, "pubkeysfile", "f", []string{}, `Path of installed public key(s) to trust for TARGET.
pubkeysfileFlagName := "pubkeysfile"
setFlags.StringSliceVarP(&setOptions.PubKeysFile, pubkeysfileFlagName, "f", []string{}, `Path of installed public key(s) to trust for TARGET.
Absolute path to keys is added to policy.json. May Absolute path to keys is added to policy.json. May
used multiple times to define multiple public keys. used multiple times to define multiple public keys.
File(s) must exist before using this command`) File(s) must exist before using this command`)
setFlags.StringVarP(&setOptions.Type, "type", "t", "signedBy", "Trust type, accept values: signedBy(default), accept, reject") _ = setTrustCommand.RegisterFlagCompletionFunc(pubkeysfileFlagName, completion.AutocompleteDefault)
typeFlagName := "type"
setFlags.StringVarP(&setOptions.Type, typeFlagName, "t", "signedBy", "Trust type, accept values: signedBy(default), accept, reject")
_ = setTrustCommand.RegisterFlagCompletionFunc(typeFlagName, common.AutocompleteTrustType)
} }
func setTrust(cmd *cobra.Command, args []string) error { func setTrust(cmd *cobra.Command, args []string) error {

View File

@ -6,6 +6,7 @@ import (
"text/tabwriter" "text/tabwriter"
"text/template" "text/template"
"github.com/containers/podman/v2/cmd/podman/common"
"github.com/containers/podman/v2/cmd/podman/registry" "github.com/containers/podman/v2/cmd/podman/registry"
"github.com/containers/podman/v2/pkg/domain/entities" "github.com/containers/podman/v2/pkg/domain/entities"
"github.com/spf13/cobra" "github.com/spf13/cobra"
@ -19,6 +20,7 @@ var (
Long: showTrustDescription, Long: showTrustDescription,
RunE: showTrust, RunE: showTrust,
Args: cobra.MaximumNArgs(1), Args: cobra.MaximumNArgs(1),
ValidArgsFunction: common.AutocompleteRegistries,
Example: "", Example: "",
} }
) )

View File

@ -3,6 +3,7 @@ package images
import ( import (
"fmt" "fmt"
"github.com/containers/podman/v2/cmd/podman/common"
"github.com/containers/podman/v2/cmd/podman/registry" "github.com/containers/podman/v2/cmd/podman/registry"
"github.com/containers/podman/v2/cmd/podman/utils" "github.com/containers/podman/v2/cmd/podman/utils"
"github.com/containers/podman/v2/pkg/domain/entities" "github.com/containers/podman/v2/pkg/domain/entities"
@ -24,6 +25,7 @@ var (
Short: "Unmount an image's root filesystem", Short: "Unmount an image's root filesystem",
Long: description, Long: description,
RunE: unmount, RunE: unmount,
ValidArgsFunction: common.AutocompleteImages,
Example: `podman unmount imgID Example: `podman unmount imgID
podman unmount imgID1 imgID2 imgID3 podman unmount imgID1 imgID2 imgID3
podman unmount --all`, podman unmount --all`,

View File

@ -1,6 +1,7 @@
package images package images
import ( import (
"github.com/containers/podman/v2/cmd/podman/common"
"github.com/containers/podman/v2/cmd/podman/registry" "github.com/containers/podman/v2/cmd/podman/registry"
"github.com/containers/podman/v2/pkg/domain/entities" "github.com/containers/podman/v2/pkg/domain/entities"
"github.com/spf13/cobra" "github.com/spf13/cobra"
@ -14,6 +15,7 @@ var (
RunE: untag, RunE: untag,
Args: cobra.MinimumNArgs(1), Args: cobra.MinimumNArgs(1),
DisableFlagsInUseLine: true, DisableFlagsInUseLine: true,
ValidArgsFunction: common.AutocompleteImages,
Example: `podman untag 0e3bbc2 Example: `podman untag 0e3bbc2
podman untag imageID:latest otherImageName:latest podman untag imageID:latest otherImageName:latest
podman untag httpd myregistryhost:5000/fedora/httpd:v2`, podman untag httpd myregistryhost:5000/fedora/httpd:v2`,
@ -26,6 +28,7 @@ var (
Short: untagCommand.Short, Short: untagCommand.Short,
Long: untagCommand.Long, Long: untagCommand.Long,
RunE: untagCommand.RunE, RunE: untagCommand.RunE,
ValidArgsFunction: untagCommand.ValidArgsFunction,
Example: `podman image untag 0e3bbc2 Example: `podman image untag 0e3bbc2
podman image untag imageID:latest otherImageName:latest podman image untag imageID:latest otherImageName:latest
podman image untag httpd myregistryhost:5000/fedora/httpd:v2`, podman image untag httpd myregistryhost:5000/fedora/httpd:v2`,

View File

@ -1,6 +1,7 @@
package main package main
import ( import (
"github.com/containers/podman/v2/cmd/podman/common"
"github.com/containers/podman/v2/cmd/podman/inspect" "github.com/containers/podman/v2/cmd/podman/inspect"
"github.com/containers/podman/v2/cmd/podman/registry" "github.com/containers/podman/v2/cmd/podman/registry"
"github.com/containers/podman/v2/pkg/domain/entities" "github.com/containers/podman/v2/pkg/domain/entities"
@ -24,6 +25,7 @@ var (
RunE: inspectExec, RunE: inspectExec,
Long: inspectDescription, Long: inspectDescription,
TraverseChildren: true, TraverseChildren: true,
ValidArgsFunction: common.AutocompleteContainersAndImages,
Example: `podman inspect fedora Example: `podman inspect fedora
podman inspect --type image fedora podman inspect --type image fedora
podman inspect CtrID ImgID podman inspect CtrID ImgID

View File

@ -9,7 +9,9 @@ import (
"text/tabwriter" "text/tabwriter"
"text/template" "text/template"
"github.com/containers/common/pkg/completion"
"github.com/containers/common/pkg/report" "github.com/containers/common/pkg/report"
"github.com/containers/podman/v2/cmd/podman/common"
"github.com/containers/podman/v2/cmd/podman/registry" "github.com/containers/podman/v2/cmd/podman/registry"
"github.com/containers/podman/v2/cmd/podman/validate" "github.com/containers/podman/v2/cmd/podman/validate"
"github.com/containers/podman/v2/libpod/define" "github.com/containers/podman/v2/libpod/define"
@ -44,8 +46,14 @@ func AddInspectFlagSet(cmd *cobra.Command) *entities.InspectOptions {
flags := cmd.Flags() flags := cmd.Flags()
flags.BoolVarP(&opts.Size, "size", "s", false, "Display total file size") flags.BoolVarP(&opts.Size, "size", "s", false, "Display total file size")
flags.StringVarP(&opts.Format, "format", "f", "json", "Format the output to a Go template or json")
flags.StringVarP(&opts.Type, "type", "t", AllType, fmt.Sprintf("Specify inspect-oject type (%q, %q or %q)", ImageType, ContainerType, AllType)) formatFlagName := "format"
flags.StringVarP(&opts.Format, formatFlagName, "f", "json", "Format the output to a Go template or json")
_ = cmd.RegisterFlagCompletionFunc(formatFlagName, completion.AutocompleteNone)
typeFlagName := "type"
flags.StringVarP(&opts.Type, typeFlagName, "t", AllType, fmt.Sprintf("Specify inspect-oject type (%q, %q or %q)", ImageType, ContainerType, AllType))
_ = cmd.RegisterFlagCompletionFunc(typeFlagName, common.AutocompleteInspectType)
validate.AddLatestFlag(cmd, &opts.Latest) validate.AddLatestFlag(cmd, &opts.Latest)
return &opts return &opts

View File

@ -5,7 +5,9 @@ import (
"os" "os"
"github.com/containers/common/pkg/auth" "github.com/containers/common/pkg/auth"
"github.com/containers/common/pkg/completion"
"github.com/containers/image/v5/types" "github.com/containers/image/v5/types"
"github.com/containers/podman/v2/cmd/podman/common"
"github.com/containers/podman/v2/cmd/podman/registry" "github.com/containers/podman/v2/cmd/podman/registry"
"github.com/containers/podman/v2/pkg/domain/entities" "github.com/containers/podman/v2/pkg/domain/entities"
"github.com/containers/podman/v2/pkg/registries" "github.com/containers/podman/v2/pkg/registries"
@ -25,6 +27,7 @@ var (
Long: "Login to a container registry on a specified server.", Long: "Login to a container registry on a specified server.",
RunE: login, RunE: login,
Args: cobra.MaximumNArgs(1), Args: cobra.MaximumNArgs(1),
ValidArgsFunction: common.AutocompleteRegistries,
Example: `podman login quay.io Example: `podman login quay.io
podman login --username ... --password ... quay.io podman login --username ... --password ... quay.io
podman login --authfile dir/auth.json quay.io`, podman login --authfile dir/auth.json quay.io`,
@ -44,6 +47,9 @@ func init() {
// Flags from the auth package. // Flags from the auth package.
flags.AddFlagSet(auth.GetLoginFlags(&loginOptions.LoginOptions)) flags.AddFlagSet(auth.GetLoginFlags(&loginOptions.LoginOptions))
// Add flag completion
completion.CompleteCommandFlags(loginCommand, auth.GetLoginFlagsCompletions())
// Podman flags. // Podman flags.
flags.BoolVarP(&loginOptions.tlsVerify, "tls-verify", "", false, "Require HTTPS and verify certificates when contacting registries") flags.BoolVarP(&loginOptions.tlsVerify, "tls-verify", "", false, "Require HTTPS and verify certificates when contacting registries")
loginOptions.Stdin = os.Stdin loginOptions.Stdin = os.Stdin

View File

@ -4,7 +4,9 @@ import (
"os" "os"
"github.com/containers/common/pkg/auth" "github.com/containers/common/pkg/auth"
"github.com/containers/common/pkg/completion"
"github.com/containers/image/v5/types" "github.com/containers/image/v5/types"
"github.com/containers/podman/v2/cmd/podman/common"
"github.com/containers/podman/v2/cmd/podman/registry" "github.com/containers/podman/v2/cmd/podman/registry"
"github.com/containers/podman/v2/pkg/domain/entities" "github.com/containers/podman/v2/pkg/domain/entities"
"github.com/containers/podman/v2/pkg/registries" "github.com/containers/podman/v2/pkg/registries"
@ -19,6 +21,7 @@ var (
Long: "Remove the cached username and password for the registry.", Long: "Remove the cached username and password for the registry.",
RunE: logout, RunE: logout,
Args: cobra.MaximumNArgs(1), Args: cobra.MaximumNArgs(1),
ValidArgsFunction: common.AutocompleteRegistries,
Example: `podman logout quay.io Example: `podman logout quay.io
podman logout --authfile dir/auth.json quay.io podman logout --authfile dir/auth.json quay.io
podman logout --all`, podman logout --all`,
@ -37,6 +40,10 @@ func init() {
// Flags from the auth package. // Flags from the auth package.
flags.AddFlagSet(auth.GetLogoutFlags(&logoutOptions)) flags.AddFlagSet(auth.GetLogoutFlags(&logoutOptions))
// Add flag completion
completion.CompleteCommandFlags(logoutCommand, auth.GetLogoutFlagsCompletions())
logoutOptions.Stdout = os.Stdout logoutOptions.Stdout = os.Stdout
logoutOptions.AcceptUnspecifiedRegistry = true logoutOptions.AcceptUnspecifiedRegistry = true
} }

View File

@ -4,6 +4,7 @@ import (
"fmt" "fmt"
"os" "os"
_ "github.com/containers/podman/v2/cmd/podman/completion"
_ "github.com/containers/podman/v2/cmd/podman/containers" _ "github.com/containers/podman/v2/cmd/podman/containers"
_ "github.com/containers/podman/v2/cmd/podman/generate" _ "github.com/containers/podman/v2/cmd/podman/generate"
_ "github.com/containers/podman/v2/cmd/podman/healthcheck" _ "github.com/containers/podman/v2/cmd/podman/healthcheck"
@ -35,6 +36,13 @@ func main() {
os.Setenv("TMPDIR", "/var/tmp") os.Setenv("TMPDIR", "/var/tmp")
} }
rootCmd = parseCommands()
Execute()
os.Exit(0)
}
func parseCommands() *cobra.Command {
cfg := registry.PodmanConfig() cfg := registry.PodmanConfig()
for _, c := range registry.Commands { for _, c := range registry.Commands {
for _, m := range c.Mode { for _, m := range c.Mode {
@ -75,6 +83,5 @@ func main() {
os.Exit(1) os.Exit(1)
} }
Execute() return rootCmd
os.Exit(0)
} }

View File

@ -5,7 +5,9 @@ import (
"fmt" "fmt"
"github.com/containers/common/pkg/auth" "github.com/containers/common/pkg/auth"
"github.com/containers/common/pkg/completion"
"github.com/containers/image/v5/types" "github.com/containers/image/v5/types"
"github.com/containers/podman/v2/cmd/podman/common"
"github.com/containers/podman/v2/cmd/podman/registry" "github.com/containers/podman/v2/cmd/podman/registry"
"github.com/containers/podman/v2/pkg/domain/entities" "github.com/containers/podman/v2/pkg/domain/entities"
"github.com/containers/podman/v2/pkg/util" "github.com/containers/podman/v2/pkg/util"
@ -29,6 +31,7 @@ var (
Short: "Add images to a manifest list or image index", Short: "Add images to a manifest list or image index",
Long: "Adds an image to a manifest list or image index.", Long: "Adds an image to a manifest list or image index.",
RunE: add, RunE: add,
ValidArgsFunction: common.AutocompleteImages,
Example: `podman manifest add mylist:v1.11 image:v1.11-amd64 Example: `podman manifest add mylist:v1.11 image:v1.11-amd64
podman manifest add mylist:v1.11 transport:imageName`, podman manifest add mylist:v1.11 transport:imageName`,
Args: cobra.ExactArgs(2), Args: cobra.ExactArgs(2),
@ -43,17 +46,44 @@ func init() {
}) })
flags := addCmd.Flags() flags := addCmd.Flags()
flags.BoolVar(&manifestAddOpts.All, "all", false, "add all of the list's images if the image is a list") flags.BoolVar(&manifestAddOpts.All, "all", false, "add all of the list's images if the image is a list")
flags.StringSliceVar(&manifestAddOpts.Annotation, "annotation", nil, "set an `annotation` for the specified image")
flags.StringVar(&manifestAddOpts.Arch, "arch", "", "override the `architecture` of the specified image")
flags.StringVar(&manifestAddOpts.Authfile, "authfile", auth.GetDefaultAuthFile(), "path of the authentication file. Use REGISTRY_AUTH_FILE environment variable to override")
flags.StringVar(&manifestAddOpts.CertDir, "cert-dir", "", "use certificates at the specified path to access the registry")
flags.StringVar(&manifestAddOpts.CredentialsCLI, "creds", "", "use `[username[:password]]` for accessing the registry")
flags.StringSliceVar(&manifestAddOpts.Features, "features", nil, "override the `features` of the specified image") annotationFlagName := "annotation"
flags.StringVar(&manifestAddOpts.OS, "os", "", "override the `OS` of the specified image") flags.StringSliceVar(&manifestAddOpts.Annotation, annotationFlagName, nil, "set an `annotation` for the specified image")
flags.StringVar(&manifestAddOpts.OSVersion, "os-version", "", "override the OS `version` of the specified image") _ = addCmd.RegisterFlagCompletionFunc(annotationFlagName, completion.AutocompleteNone)
archFlagName := "arch"
flags.StringVar(&manifestAddOpts.Arch, archFlagName, "", "override the `architecture` of the specified image")
_ = addCmd.RegisterFlagCompletionFunc(archFlagName, completion.AutocompleteNone)
authfileFlagName := "authfile"
flags.StringVar(&manifestAddOpts.Authfile, authfileFlagName, auth.GetDefaultAuthFile(), "path of the authentication file. Use REGISTRY_AUTH_FILE environment variable to override")
_ = addCmd.RegisterFlagCompletionFunc(authfileFlagName, completion.AutocompleteDefault)
certDirFlagName := "cert-dir"
flags.StringVar(&manifestAddOpts.CertDir, certDirFlagName, "", "use certificates at the specified path to access the registry")
_ = addCmd.RegisterFlagCompletionFunc(certDirFlagName, completion.AutocompleteDefault)
credsFlagName := "creds"
flags.StringVar(&manifestAddOpts.CredentialsCLI, credsFlagName, "", "use `[username[:password]]` for accessing the registry")
_ = addCmd.RegisterFlagCompletionFunc(credsFlagName, completion.AutocompleteNone)
featuresFlagName := "features"
flags.StringSliceVar(&manifestAddOpts.Features, featuresFlagName, nil, "override the `features` of the specified image")
_ = addCmd.RegisterFlagCompletionFunc(featuresFlagName, completion.AutocompleteNone)
osFlagName := "os"
flags.StringVar(&manifestAddOpts.OS, osFlagName, "", "override the `OS` of the specified image")
_ = addCmd.RegisterFlagCompletionFunc(osFlagName, completion.AutocompleteNone)
osVersionFlagName := "os-version"
flags.StringVar(&manifestAddOpts.OSVersion, osVersionFlagName, "", "override the OS `version` of the specified image")
_ = addCmd.RegisterFlagCompletionFunc(osVersionFlagName, completion.AutocompleteNone)
flags.BoolVar(&manifestAddOpts.TLSVerifyCLI, "tls-verify", true, "require HTTPS and verify certificates when accessing the registry") flags.BoolVar(&manifestAddOpts.TLSVerifyCLI, "tls-verify", true, "require HTTPS and verify certificates when accessing the registry")
flags.StringVar(&manifestAddOpts.Variant, "variant", "", "override the `Variant` of the specified image")
variantFlagName := "variant"
flags.StringVar(&manifestAddOpts.Variant, variantFlagName, "", "override the `Variant` of the specified image")
_ = addCmd.RegisterFlagCompletionFunc(variantFlagName, completion.AutocompleteNone)
if registry.IsRemote() { if registry.IsRemote() {
_ = flags.MarkHidden("cert-dir") _ = flags.MarkHidden("cert-dir")

View File

@ -4,6 +4,8 @@ import (
"context" "context"
"fmt" "fmt"
"github.com/containers/common/pkg/completion"
"github.com/containers/podman/v2/cmd/podman/common"
"github.com/containers/podman/v2/cmd/podman/registry" "github.com/containers/podman/v2/cmd/podman/registry"
"github.com/containers/podman/v2/pkg/domain/entities" "github.com/containers/podman/v2/pkg/domain/entities"
"github.com/pkg/errors" "github.com/pkg/errors"
@ -19,6 +21,7 @@ var (
RunE: annotate, RunE: annotate,
Example: `podman manifest annotate --annotation left=right mylist:v1.11 image:v1.11-amd64`, Example: `podman manifest annotate --annotation left=right mylist:v1.11 image:v1.11-amd64`,
Args: cobra.ExactArgs(2), Args: cobra.ExactArgs(2),
ValidArgsFunction: common.AutocompleteImages,
} }
) )
@ -29,13 +32,34 @@ func init() {
Parent: manifestCmd, Parent: manifestCmd,
}) })
flags := annotateCmd.Flags() flags := annotateCmd.Flags()
flags.StringSliceVar(&manifestAnnotateOpts.Annotation, "annotation", nil, "set an `annotation` for the specified image")
flags.StringVar(&manifestAnnotateOpts.Arch, "arch", "", "override the `architecture` of the specified image") annotationFlagName := "annotation"
flags.StringSliceVar(&manifestAnnotateOpts.Features, "features", nil, "override the `features` of the specified image") flags.StringSliceVar(&manifestAnnotateOpts.Annotation, annotationFlagName, nil, "set an `annotation` for the specified image")
flags.StringVar(&manifestAnnotateOpts.OS, "os", "", "override the `OS` of the specified image") _ = annotateCmd.RegisterFlagCompletionFunc(annotationFlagName, completion.AutocompleteNone)
flags.StringSliceVar(&manifestAnnotateOpts.OSFeatures, "os-features", nil, "override the OS `features` of the specified image")
flags.StringVar(&manifestAnnotateOpts.OSVersion, "os-version", "", "override the OS `version` of the specified image") archFlagName := "arch"
flags.StringVar(&manifestAnnotateOpts.Variant, "variant", "", "override the `variant` of the specified image") flags.StringVar(&manifestAnnotateOpts.Arch, archFlagName, "", "override the `architecture` of the specified image")
_ = annotateCmd.RegisterFlagCompletionFunc(archFlagName, completion.AutocompleteNone)
featuresFlagName := "features"
flags.StringSliceVar(&manifestAnnotateOpts.Features, featuresFlagName, nil, "override the `features` of the specified image")
_ = annotateCmd.RegisterFlagCompletionFunc(featuresFlagName, completion.AutocompleteNone)
osFlagName := "os"
flags.StringVar(&manifestAnnotateOpts.OS, osFlagName, "", "override the `OS` of the specified image")
_ = annotateCmd.RegisterFlagCompletionFunc(osFlagName, completion.AutocompleteNone)
osFeaturesFlagName := "os-features"
flags.StringSliceVar(&manifestAnnotateOpts.OSFeatures, osFeaturesFlagName, nil, "override the OS `features` of the specified image")
_ = annotateCmd.RegisterFlagCompletionFunc(osFeaturesFlagName, completion.AutocompleteNone)
osVersionFlagName := "os-version"
flags.StringVar(&manifestAnnotateOpts.OSVersion, osVersionFlagName, "", "override the OS `version` of the specified image")
_ = annotateCmd.RegisterFlagCompletionFunc(osVersionFlagName, completion.AutocompleteNone)
variantFlagName := "variant"
flags.StringVar(&manifestAnnotateOpts.Variant, variantFlagName, "", "override the `Variant` of the specified image")
_ = annotateCmd.RegisterFlagCompletionFunc(variantFlagName, completion.AutocompleteNone)
} }
func annotate(cmd *cobra.Command, args []string) error { func annotate(cmd *cobra.Command, args []string) error {

View File

@ -4,6 +4,7 @@ import (
"context" "context"
"fmt" "fmt"
"github.com/containers/podman/v2/cmd/podman/common"
"github.com/containers/podman/v2/cmd/podman/registry" "github.com/containers/podman/v2/cmd/podman/registry"
"github.com/containers/podman/v2/pkg/domain/entities" "github.com/containers/podman/v2/pkg/domain/entities"
"github.com/pkg/errors" "github.com/pkg/errors"
@ -17,6 +18,7 @@ var (
Short: "Create manifest list or image index", Short: "Create manifest list or image index",
Long: "Creates manifest lists or image indexes.", Long: "Creates manifest lists or image indexes.",
RunE: create, RunE: create,
ValidArgsFunction: common.AutocompleteImages,
Example: `podman manifest create mylist:v1.11 Example: `podman manifest create mylist:v1.11
podman manifest create mylist:v1.11 arch-specific-image-to-add podman manifest create mylist:v1.11 arch-specific-image-to-add
podman manifest create --all mylist:v1.11 transport:tagged-image-to-add`, podman manifest create --all mylist:v1.11 transport:tagged-image-to-add`,

View File

@ -4,6 +4,7 @@ import (
"context" "context"
"fmt" "fmt"
"github.com/containers/podman/v2/cmd/podman/common"
"github.com/containers/podman/v2/cmd/podman/registry" "github.com/containers/podman/v2/cmd/podman/registry"
"github.com/containers/podman/v2/pkg/domain/entities" "github.com/containers/podman/v2/pkg/domain/entities"
"github.com/pkg/errors" "github.com/pkg/errors"
@ -16,6 +17,7 @@ var (
Short: "Display the contents of a manifest list or image index", Short: "Display the contents of a manifest list or image index",
Long: "Display the contents of a manifest list or image index.", Long: "Display the contents of a manifest list or image index.",
RunE: inspect, RunE: inspect,
ValidArgsFunction: common.AutocompleteImages,
Example: "podman manifest inspect localhost/list", Example: "podman manifest inspect localhost/list",
Args: cobra.ExactArgs(1), Args: cobra.ExactArgs(1),
DisableFlagsInUseLine: true, DisableFlagsInUseLine: true,

View File

@ -2,7 +2,9 @@ package manifest
import ( import (
"github.com/containers/common/pkg/auth" "github.com/containers/common/pkg/auth"
"github.com/containers/common/pkg/completion"
"github.com/containers/image/v5/types" "github.com/containers/image/v5/types"
"github.com/containers/podman/v2/cmd/podman/common"
"github.com/containers/podman/v2/cmd/podman/registry" "github.com/containers/podman/v2/cmd/podman/registry"
"github.com/containers/podman/v2/pkg/domain/entities" "github.com/containers/podman/v2/pkg/domain/entities"
"github.com/containers/podman/v2/pkg/util" "github.com/containers/podman/v2/pkg/util"
@ -28,6 +30,7 @@ var (
RunE: push, RunE: push,
Example: `podman manifest push mylist:v1.11 quay.io/myimagelist`, Example: `podman manifest push mylist:v1.11 quay.io/myimagelist`,
Args: cobra.ExactArgs(2), Args: cobra.ExactArgs(2),
ValidArgsFunction: common.AutocompleteImages,
} }
) )
@ -40,13 +43,33 @@ func init() {
flags := pushCmd.Flags() flags := pushCmd.Flags()
flags.BoolVar(&manifestPushOpts.Purge, "purge", false, "remove the manifest list if push succeeds") flags.BoolVar(&manifestPushOpts.Purge, "purge", false, "remove the manifest list if push succeeds")
flags.BoolVar(&manifestPushOpts.All, "all", false, "also push the images in the list") flags.BoolVar(&manifestPushOpts.All, "all", false, "also push the images in the list")
flags.StringVar(&manifestPushOpts.Authfile, "authfile", auth.GetDefaultAuthFile(), "path of the authentication file. Use REGISTRY_AUTH_FILE environment variable to override")
flags.StringVar(&manifestPushOpts.CertDir, "cert-dir", "", "use certificates at the specified path to access the registry") authfileFlagName := "authfile"
flags.StringVar(&manifestPushOpts.CredentialsCLI, "creds", "", "use `[username[:password]]` for accessing the registry") flags.StringVar(&manifestPushOpts.Authfile, authfileFlagName, auth.GetDefaultAuthFile(), "path of the authentication file. Use REGISTRY_AUTH_FILE environment variable to override")
flags.StringVar(&manifestPushOpts.DigestFile, "digestfile", "", "after copying the image, write the digest of the resulting digest to the file") _ = pushCmd.RegisterFlagCompletionFunc(authfileFlagName, completion.AutocompleteDefault)
flags.StringVarP(&manifestPushOpts.Format, "format", "f", "", "manifest type (oci or v2s2) to attempt to use when pushing the manifest list (default is manifest type of source)")
certDirFlagName := "cert-dir"
flags.StringVar(&manifestPushOpts.CertDir, certDirFlagName, "", "use certificates at the specified path to access the registry")
_ = pushCmd.RegisterFlagCompletionFunc(certDirFlagName, completion.AutocompleteDefault)
credsFlagName := "creds"
flags.StringVar(&manifestPushOpts.CredentialsCLI, credsFlagName, "", "use `[username[:password]]` for accessing the registry")
_ = pushCmd.RegisterFlagCompletionFunc(credsFlagName, completion.AutocompleteNone)
digestfileFlagName := "digestfile"
flags.StringVar(&manifestPushOpts.DigestFile, digestfileFlagName, "", "after copying the image, write the digest of the resulting digest to the file")
_ = pushCmd.RegisterFlagCompletionFunc(digestfileFlagName, completion.AutocompleteDefault)
formatFlagName := "format"
flags.StringVarP(&manifestPushOpts.Format, formatFlagName, "f", "", "manifest type (oci or v2s2) to attempt to use when pushing the manifest list (default is manifest type of source)")
_ = pushCmd.RegisterFlagCompletionFunc(formatFlagName, common.AutocompleteManifestFormat)
flags.BoolVarP(&manifestPushOpts.RemoveSignatures, "remove-signatures", "", false, "don't copy signatures when pushing images") flags.BoolVarP(&manifestPushOpts.RemoveSignatures, "remove-signatures", "", false, "don't copy signatures when pushing images")
flags.StringVar(&manifestPushOpts.SignBy, "sign-by", "", "sign the image using a GPG key with the specified `FINGERPRINT`")
signByFlagName := "sign-by"
flags.StringVar(&manifestPushOpts.SignBy, signByFlagName, "", "sign the image using a GPG key with the specified `FINGERPRINT`")
_ = pushCmd.RegisterFlagCompletionFunc(signByFlagName, completion.AutocompleteNone)
flags.BoolVar(&manifestPushOpts.TLSVerifyCLI, "tls-verify", true, "require HTTPS and verify certificates when accessing the registry") flags.BoolVar(&manifestPushOpts.TLSVerifyCLI, "tls-verify", true, "require HTTPS and verify certificates when accessing the registry")
flags.BoolVarP(&manifestPushOpts.Quiet, "quiet", "q", false, "don't output progress information when pushing lists") flags.BoolVarP(&manifestPushOpts.Quiet, "quiet", "q", false, "don't output progress information when pushing lists")

View File

@ -4,6 +4,7 @@ import (
"context" "context"
"fmt" "fmt"
"github.com/containers/podman/v2/cmd/podman/common"
"github.com/containers/podman/v2/cmd/podman/registry" "github.com/containers/podman/v2/cmd/podman/registry"
"github.com/containers/podman/v2/pkg/domain/entities" "github.com/containers/podman/v2/pkg/domain/entities"
"github.com/pkg/errors" "github.com/pkg/errors"
@ -16,6 +17,7 @@ var (
Short: "Remove an entry from a manifest list or image index", Short: "Remove an entry from a manifest list or image index",
Long: "Removes an image from a manifest list or image index.", Long: "Removes an image from a manifest list or image index.",
RunE: remove, RunE: remove,
ValidArgsFunction: common.AutocompleteImages,
Example: `podman manifest remove mylist:v1.11 sha256:15352d97781ffdf357bf3459c037be3efac4133dc9070c2dce7eca7c05c3e736`, Example: `podman manifest remove mylist:v1.11 sha256:15352d97781ffdf357bf3459c037be3efac4133dc9070c2dce7eca7c05c3e736`,
Args: cobra.ExactArgs(2), Args: cobra.ExactArgs(2),
DisableFlagsInUseLine: true, DisableFlagsInUseLine: true,

View File

@ -4,11 +4,12 @@ import (
"fmt" "fmt"
"net" "net"
"github.com/containers/common/pkg/completion"
"github.com/containers/podman/v2/cmd/podman/common"
"github.com/containers/podman/v2/cmd/podman/registry" "github.com/containers/podman/v2/cmd/podman/registry"
"github.com/containers/podman/v2/libpod/define" "github.com/containers/podman/v2/libpod/define"
"github.com/containers/podman/v2/pkg/domain/entities" "github.com/containers/podman/v2/pkg/domain/entities"
"github.com/spf13/cobra" "github.com/spf13/cobra"
"github.com/spf13/pflag"
) )
var ( var (
@ -19,6 +20,7 @@ var (
Long: networkCreateDescription, Long: networkCreateDescription,
RunE: networkCreate, RunE: networkCreate,
Args: cobra.MaximumNArgs(1), Args: cobra.MaximumNArgs(1),
ValidArgsFunction: completion.AutocompleteNone,
Example: `podman network create podman1`, Example: `podman network create podman1`,
} }
) )
@ -27,16 +29,36 @@ var (
networkCreateOptions entities.NetworkCreateOptions networkCreateOptions entities.NetworkCreateOptions
) )
func networkCreateFlags(flags *pflag.FlagSet) { func networkCreateFlags(cmd *cobra.Command) {
flags.StringVarP(&networkCreateOptions.Driver, "driver", "d", "bridge", "driver to manage the network") flags := cmd.Flags()
flags.IPVar(&networkCreateOptions.Gateway, "gateway", nil, "IPv4 or IPv6 gateway for the subnet")
driverFlagName := "driver"
flags.StringVarP(&networkCreateOptions.Driver, driverFlagName, "d", "bridge", "driver to manage the network")
_ = cmd.RegisterFlagCompletionFunc(driverFlagName, common.AutocompleteNetworkDriver)
gatewayFlagName := "gateway"
flags.IPVar(&networkCreateOptions.Gateway, gatewayFlagName, nil, "IPv4 or IPv6 gateway for the subnet")
_ = cmd.RegisterFlagCompletionFunc(gatewayFlagName, completion.AutocompleteNone)
flags.BoolVar(&networkCreateOptions.Internal, "internal", false, "restrict external access from this network") flags.BoolVar(&networkCreateOptions.Internal, "internal", false, "restrict external access from this network")
flags.IPNetVar(&networkCreateOptions.Range, "ip-range", net.IPNet{}, "allocate container IP from range")
flags.StringVar(&networkCreateOptions.MacVLAN, "macvlan", "", "create a Macvlan connection based on this device") ipRangeFlagName := "ip-range"
flags.IPNetVar(&networkCreateOptions.Range, ipRangeFlagName, net.IPNet{}, "allocate container IP from range")
_ = cmd.RegisterFlagCompletionFunc(ipRangeFlagName, completion.AutocompleteNone)
macvlanFlagName := "macvlan"
flags.StringVar(&networkCreateOptions.MacVLAN, macvlanFlagName, "", "create a Macvlan connection based on this device")
_ = cmd.RegisterFlagCompletionFunc(macvlanFlagName, completion.AutocompleteNone)
// TODO not supported yet // TODO not supported yet
// flags.StringVar(&networkCreateOptions.IPamDriver, "ipam-driver", "", "IP Address Management Driver") // flags.StringVar(&networkCreateOptions.IPamDriver, "ipam-driver", "", "IP Address Management Driver")
flags.BoolVar(&networkCreateOptions.IPv6, "ipv6", false, "enable IPv6 networking") flags.BoolVar(&networkCreateOptions.IPv6, "ipv6", false, "enable IPv6 networking")
flags.IPNetVar(&networkCreateOptions.Subnet, "subnet", net.IPNet{}, "subnet in CIDR format")
subnetFlagName := "subnet"
flags.IPNetVar(&networkCreateOptions.Subnet, subnetFlagName, net.IPNet{}, "subnet in CIDR format")
_ = cmd.RegisterFlagCompletionFunc(subnetFlagName, completion.AutocompleteNone)
flags.BoolVar(&networkCreateOptions.DisableDNS, "disable-dns", false, "disable dns plugin") flags.BoolVar(&networkCreateOptions.DisableDNS, "disable-dns", false, "disable dns plugin")
} }
func init() { func init() {
@ -45,8 +67,7 @@ func init() {
Command: networkCreateCommand, Command: networkCreateCommand,
Parent: networkCmd, Parent: networkCmd,
}) })
flags := networkCreateCommand.Flags() networkCreateFlags(networkCreateCommand)
networkCreateFlags(flags)
} }

View File

@ -1,6 +1,7 @@
package network package network
import ( import (
"github.com/containers/podman/v2/cmd/podman/common"
"github.com/containers/podman/v2/cmd/podman/inspect" "github.com/containers/podman/v2/cmd/podman/inspect"
"github.com/containers/podman/v2/cmd/podman/registry" "github.com/containers/podman/v2/cmd/podman/registry"
"github.com/containers/podman/v2/pkg/domain/entities" "github.com/containers/podman/v2/pkg/domain/entities"
@ -16,6 +17,7 @@ var (
RunE: networkInspect, RunE: networkInspect,
Example: `podman network inspect podman`, Example: `podman network inspect podman`,
Args: cobra.MinimumNArgs(1), Args: cobra.MinimumNArgs(1),
ValidArgsFunction: common.AutocompleteNetworks,
} }
inspectOpts *entities.InspectOptions inspectOpts *entities.InspectOptions
) )
@ -28,7 +30,10 @@ func init() {
}) })
inspectOpts = new(entities.InspectOptions) inspectOpts = new(entities.InspectOptions)
flags := networkinspectCommand.Flags() flags := networkinspectCommand.Flags()
flags.StringVarP(&inspectOpts.Format, "format", "f", "", "Pretty-print network to JSON or using a Go template")
formatFlagName := "format"
flags.StringVarP(&inspectOpts.Format, formatFlagName, "f", "", "Pretty-print network to JSON or using a Go template")
_ = networkinspectCommand.RegisterFlagCompletionFunc(formatFlagName, common.AutocompleteJSONFormat)
} }
func networkInspect(_ *cobra.Command, args []string) error { func networkInspect(_ *cobra.Command, args []string) error {

View File

@ -8,7 +8,9 @@ import (
"text/tabwriter" "text/tabwriter"
"text/template" "text/template"
"github.com/containers/common/pkg/completion"
"github.com/containers/common/pkg/report" "github.com/containers/common/pkg/report"
"github.com/containers/podman/v2/cmd/podman/common"
"github.com/containers/podman/v2/cmd/podman/parse" "github.com/containers/podman/v2/cmd/podman/parse"
"github.com/containers/podman/v2/cmd/podman/registry" "github.com/containers/podman/v2/cmd/podman/registry"
"github.com/containers/podman/v2/cmd/podman/validate" "github.com/containers/podman/v2/cmd/podman/validate"
@ -26,6 +28,7 @@ var (
Short: "network list", Short: "network list",
Long: networklistDescription, Long: networklistDescription,
RunE: networkList, RunE: networkList,
ValidArgsFunction: completion.AutocompleteNone,
Example: `podman network list`, Example: `podman network list`,
} }
) )
@ -35,11 +38,16 @@ var (
) )
func networkListFlags(flags *pflag.FlagSet) { func networkListFlags(flags *pflag.FlagSet) {
// TODO enable filters based on something formatFlagName := "format"
// flags.StringSliceVarP(&networklistCommand.Filter, "filter", "f", []string{}, "Pause all running containers") flags.StringVarP(&networkListOptions.Format, formatFlagName, "f", "", "Pretty-print networks to JSON or using a Go template")
flags.StringVarP(&networkListOptions.Format, "format", "f", "", "Pretty-print networks to JSON or using a Go template") _ = networklistCommand.RegisterFlagCompletionFunc(formatFlagName, common.AutocompleteJSONFormat)
flags.BoolVarP(&networkListOptions.Quiet, "quiet", "q", false, "display only names") flags.BoolVarP(&networkListOptions.Quiet, "quiet", "q", false, "display only names")
flags.StringVarP(&networkListOptions.Filter, "filter", "", "", "Provide filter values (e.g. 'name=podman')")
filterFlagName := "filter"
flags.StringVarP(&networkListOptions.Filter, filterFlagName, "", "", "Provide filter values (e.g. 'name=podman')")
_ = networklistCommand.RegisterFlagCompletionFunc(filterFlagName, completion.AutocompleteNone)
} }
func init() { func init() {

View File

@ -4,6 +4,7 @@ import (
"fmt" "fmt"
"strings" "strings"
"github.com/containers/podman/v2/cmd/podman/common"
"github.com/containers/podman/v2/cmd/podman/registry" "github.com/containers/podman/v2/cmd/podman/registry"
"github.com/containers/podman/v2/cmd/podman/utils" "github.com/containers/podman/v2/cmd/podman/utils"
"github.com/containers/podman/v2/libpod/define" "github.com/containers/podman/v2/libpod/define"
@ -22,6 +23,7 @@ var (
RunE: networkRm, RunE: networkRm,
Example: `podman network rm podman`, Example: `podman network rm podman`,
Args: cobra.MinimumNArgs(1), Args: cobra.MinimumNArgs(1),
ValidArgsFunction: common.AutocompleteNetworks,
} }
) )

View File

@ -5,7 +5,9 @@ import (
"os" "os"
"github.com/containers/common/pkg/auth" "github.com/containers/common/pkg/auth"
"github.com/containers/common/pkg/completion"
"github.com/containers/image/v5/types" "github.com/containers/image/v5/types"
"github.com/containers/podman/v2/cmd/podman/common"
"github.com/containers/podman/v2/cmd/podman/registry" "github.com/containers/podman/v2/cmd/podman/registry"
"github.com/containers/podman/v2/cmd/podman/utils" "github.com/containers/podman/v2/cmd/podman/utils"
"github.com/containers/podman/v2/pkg/domain/entities" "github.com/containers/podman/v2/pkg/domain/entities"
@ -36,6 +38,7 @@ var (
Long: kubeDescription, Long: kubeDescription,
RunE: kube, RunE: kube,
Args: cobra.ExactArgs(1), Args: cobra.ExactArgs(1),
ValidArgsFunction: completion.AutocompleteDefault,
Example: `podman play kube nginx.yml Example: `podman play kube nginx.yml
podman play kube --creds user:password --seccomp-profile-root /custom/path apache.yml`, podman play kube --creds user:password --seccomp-profile-root /custom/path apache.yml`,
} }
@ -50,17 +53,41 @@ func init() {
flags := kubeCmd.Flags() flags := kubeCmd.Flags()
flags.SetNormalizeFunc(utils.AliasFlags) flags.SetNormalizeFunc(utils.AliasFlags)
flags.StringVar(&kubeOptions.CredentialsCLI, "creds", "", "`Credentials` (USERNAME:PASSWORD) to use for authenticating to a registry")
flags.StringVar(&kubeOptions.Network, "network", "", "Connect pod to CNI network(s)") credsFlagName := "creds"
flags.StringVar(&kubeOptions.LogDriver, "log-driver", "", "Logging driver for the container") flags.StringVar(&kubeOptions.CredentialsCLI, credsFlagName, "", "`Credentials` (USERNAME:PASSWORD) to use for authenticating to a registry")
_ = kubeCmd.RegisterFlagCompletionFunc(credsFlagName, completion.AutocompleteNone)
networkFlagName := "network"
flags.StringVar(&kubeOptions.Network, networkFlagName, "", "Connect pod to CNI network(s)")
_ = kubeCmd.RegisterFlagCompletionFunc(networkFlagName, common.AutocompleteNetworks)
logDriverFlagName := "log-driver"
flags.StringVar(&kubeOptions.LogDriver, logDriverFlagName, "", "Logging driver for the container")
_ = kubeCmd.RegisterFlagCompletionFunc(logDriverFlagName, common.AutocompleteLogDriver)
flags.BoolVarP(&kubeOptions.Quiet, "quiet", "q", false, "Suppress output information when pulling images") flags.BoolVarP(&kubeOptions.Quiet, "quiet", "q", false, "Suppress output information when pulling images")
flags.BoolVar(&kubeOptions.TLSVerifyCLI, "tls-verify", true, "Require HTTPS and verify certificates when contacting registries") flags.BoolVar(&kubeOptions.TLSVerifyCLI, "tls-verify", true, "Require HTTPS and verify certificates when contacting registries")
flags.StringVar(&kubeOptions.Authfile, "authfile", auth.GetDefaultAuthFile(), "Path of the authentication file. Use REGISTRY_AUTH_FILE environment variable to override")
authfileFlagName := "authfile"
flags.StringVar(&kubeOptions.Authfile, authfileFlagName, auth.GetDefaultAuthFile(), "Path of the authentication file. Use REGISTRY_AUTH_FILE environment variable to override")
_ = kubeCmd.RegisterFlagCompletionFunc(authfileFlagName, completion.AutocompleteDefault)
if !registry.IsRemote() { if !registry.IsRemote() {
flags.StringVar(&kubeOptions.CertDir, "cert-dir", "", "`Pathname` of a directory containing TLS certificates and keys")
certDirFlagName := "cert-dir"
flags.StringVar(&kubeOptions.CertDir, certDirFlagName, "", "`Pathname` of a directory containing TLS certificates and keys")
_ = kubeCmd.RegisterFlagCompletionFunc(certDirFlagName, completion.AutocompleteDefault)
flags.StringVar(&kubeOptions.SignaturePolicy, "signature-policy", "", "`Pathname` of signature policy file (not usually used)") flags.StringVar(&kubeOptions.SignaturePolicy, "signature-policy", "", "`Pathname` of signature policy file (not usually used)")
flags.StringVar(&kubeOptions.SeccompProfileRoot, "seccomp-profile-root", defaultSeccompRoot, "Directory path for seccomp profiles")
flags.StringSliceVar(&kubeOptions.ConfigMaps, "configmap", []string{}, "`Pathname` of a YAML file containing a kubernetes configmap") seccompProfileRootFlagName := "seccomp-profile-root"
flags.StringVar(&kubeOptions.SeccompProfileRoot, seccompProfileRootFlagName, defaultSeccompRoot, "Directory path for seccomp profiles")
_ = kubeCmd.RegisterFlagCompletionFunc(seccompProfileRootFlagName, completion.AutocompleteDefault)
configmapFlagName := "configmap"
flags.StringSliceVar(&kubeOptions.ConfigMaps, configmapFlagName, []string{}, "`Pathname` of a YAML file containing a kubernetes configmap")
_ = kubeCmd.RegisterFlagCompletionFunc(configmapFlagName, completion.AutocompleteDefault)
} }
_ = flags.MarkHidden("signature-policy") _ = flags.MarkHidden("signature-policy")
} }

View File

@ -7,6 +7,7 @@ import (
"os" "os"
"strings" "strings"
"github.com/containers/common/pkg/completion"
"github.com/containers/podman/v2/cmd/podman/common" "github.com/containers/podman/v2/cmd/podman/common"
"github.com/containers/podman/v2/cmd/podman/parse" "github.com/containers/podman/v2/cmd/podman/parse"
"github.com/containers/podman/v2/cmd/podman/registry" "github.com/containers/podman/v2/cmd/podman/registry"
@ -32,6 +33,7 @@ var (
Short: "Create a new empty pod", Short: "Create a new empty pod",
Long: podCreateDescription, Long: podCreateDescription,
RunE: create, RunE: create,
ValidArgsFunction: completion.AutocompleteNone,
} }
) )
@ -51,19 +53,53 @@ func init() {
}) })
flags := createCommand.Flags() flags := createCommand.Flags()
flags.SetInterspersed(false) flags.SetInterspersed(false)
flags.AddFlagSet(common.GetNetFlags())
flags.StringVar(&createOptions.CGroupParent, "cgroup-parent", "", "Set parent cgroup for the pod") common.DefineNetFlags(createCommand)
cgroupParentflagName := "cgroup-parent"
flags.StringVar(&createOptions.CGroupParent, cgroupParentflagName, "", "Set parent cgroup for the pod")
_ = createCommand.RegisterFlagCompletionFunc(cgroupParentflagName, completion.AutocompleteDefault)
flags.BoolVar(&createOptions.Infra, "infra", true, "Create an infra container associated with the pod to share namespaces with") flags.BoolVar(&createOptions.Infra, "infra", true, "Create an infra container associated with the pod to share namespaces with")
flags.StringVar(&createOptions.InfraConmonPidFile, "infra-conmon-pidfile", "", "Path to the file that will receive the POD of the infra container's conmon")
flags.String("infra-image", containerConfig.Engine.InfraImage, "The image of the infra container to associate with the pod") infraConmonPidfileFlagName := "infra-conmon-pidfile"
flags.String("infra-command", containerConfig.Engine.InfraCommand, "The command to run on the infra container when the pod is started") flags.StringVar(&createOptions.InfraConmonPidFile, infraConmonPidfileFlagName, "", "Path to the file that will receive the POD of the infra container's conmon")
flags.StringSliceVar(&labelFile, "label-file", []string{}, "Read in a line delimited file of labels") _ = createCommand.RegisterFlagCompletionFunc(infraConmonPidfileFlagName, completion.AutocompleteDefault)
flags.StringSliceVarP(&labels, "label", "l", []string{}, "Set metadata on pod (default [])")
flags.StringVarP(&createOptions.Name, "name", "n", "", "Assign a name to the pod") infraImageFlagName := "infra-image"
flags.StringVarP(&createOptions.Hostname, "hostname", "", "", "Set a hostname to the pod") flags.String(infraImageFlagName, containerConfig.Engine.InfraImage, "The image of the infra container to associate with the pod")
flags.StringVar(&podIDFile, "pod-id-file", "", "Write the pod ID to the file") _ = createCommand.RegisterFlagCompletionFunc(infraImageFlagName, common.AutocompleteImages)
infraCommandFlagName := "infra-command"
flags.String(infraCommandFlagName, containerConfig.Engine.InfraCommand, "The command to run on the infra container when the pod is started")
_ = createCommand.RegisterFlagCompletionFunc(infraCommandFlagName, completion.AutocompleteNone)
labelFileFlagName := "label-file"
flags.StringSliceVar(&labelFile, labelFileFlagName, []string{}, "Read in a line delimited file of labels")
_ = createCommand.RegisterFlagCompletionFunc(labelFileFlagName, completion.AutocompleteDefault)
labelFlagName := "label"
flags.StringSliceVarP(&labels, labelFlagName, "l", []string{}, "Set metadata on pod (default [])")
_ = createCommand.RegisterFlagCompletionFunc(labelFlagName, completion.AutocompleteNone)
nameFlagName := "name"
flags.StringVarP(&createOptions.Name, nameFlagName, "n", "", "Assign a name to the pod")
_ = createCommand.RegisterFlagCompletionFunc(nameFlagName, completion.AutocompleteNone)
hostnameFlagName := "hostname"
flags.StringVarP(&createOptions.Hostname, hostnameFlagName, "", "", "Set a hostname to the pod")
_ = createCommand.RegisterFlagCompletionFunc(hostnameFlagName, completion.AutocompleteNone)
podIDFileFlagName := "pod-id-file"
flags.StringVar(&podIDFile, podIDFileFlagName, "", "Write the pod ID to the file")
_ = createCommand.RegisterFlagCompletionFunc(podIDFileFlagName, completion.AutocompleteDefault)
flags.BoolVar(&replace, "replace", false, "If a pod with the same exists, replace it") flags.BoolVar(&replace, "replace", false, "If a pod with the same exists, replace it")
flags.StringVar(&share, "share", specgen.DefaultKernelNamespaces, "A comma delimited list of kernel namespaces the pod will share")
shareFlagName := "share"
flags.StringVar(&share, shareFlagName, specgen.DefaultKernelNamespaces, "A comma delimited list of kernel namespaces the pod will share")
_ = createCommand.RegisterFlagCompletionFunc(shareFlagName, common.AutocompletePodShareNamespace)
flags.SetNormalizeFunc(aliasNetworkFlag) flags.SetNormalizeFunc(aliasNetworkFlag)
} }

View File

@ -3,6 +3,7 @@ package pods
import ( import (
"context" "context"
"github.com/containers/podman/v2/cmd/podman/common"
"github.com/containers/podman/v2/cmd/podman/registry" "github.com/containers/podman/v2/cmd/podman/registry"
"github.com/containers/podman/v2/pkg/domain/entities" "github.com/containers/podman/v2/pkg/domain/entities"
"github.com/spf13/cobra" "github.com/spf13/cobra"
@ -17,6 +18,7 @@ var (
Long: podExistsDescription, Long: podExistsDescription,
RunE: exists, RunE: exists,
Args: cobra.ExactArgs(1), Args: cobra.ExactArgs(1),
ValidArgsFunction: common.AutocompletePods,
Example: `podman pod exists podID Example: `podman pod exists podID
podman pod exists mypod || podman pod create --name mypod`, podman pod exists mypod || podman pod create --name mypod`,
DisableFlagsInUseLine: true, DisableFlagsInUseLine: true,

View File

@ -8,6 +8,7 @@ import (
"text/template" "text/template"
"github.com/containers/common/pkg/report" "github.com/containers/common/pkg/report"
"github.com/containers/podman/v2/cmd/podman/common"
"github.com/containers/podman/v2/cmd/podman/registry" "github.com/containers/podman/v2/cmd/podman/registry"
"github.com/containers/podman/v2/cmd/podman/validate" "github.com/containers/podman/v2/cmd/podman/validate"
"github.com/containers/podman/v2/pkg/domain/entities" "github.com/containers/podman/v2/pkg/domain/entities"
@ -29,6 +30,7 @@ var (
Short: "Displays a pod configuration", Short: "Displays a pod configuration",
Long: inspectDescription, Long: inspectDescription,
RunE: inspect, RunE: inspect,
ValidArgsFunction: common.AutocompletePods,
Example: `podman pod inspect podID`, Example: `podman pod inspect podID`,
} }
) )
@ -40,7 +42,11 @@ func init() {
Parent: podCmd, Parent: podCmd,
}) })
flags := inspectCmd.Flags() flags := inspectCmd.Flags()
flags.StringVarP(&inspectOptions.Format, "format", "f", "json", "Format the output to a Go template or json")
formatFlagName := "format"
flags.StringVarP(&inspectOptions.Format, formatFlagName, "f", "json", "Format the output to a Go template or json")
_ = inspectCmd.RegisterFlagCompletionFunc(formatFlagName, common.AutocompleteJSONFormat)
validate.AddLatestFlag(inspectCmd, &inspectOptions.Latest) validate.AddLatestFlag(inspectCmd, &inspectOptions.Latest)
} }

View File

@ -4,6 +4,7 @@ import (
"context" "context"
"fmt" "fmt"
"github.com/containers/podman/v2/cmd/podman/common"
"github.com/containers/podman/v2/cmd/podman/registry" "github.com/containers/podman/v2/cmd/podman/registry"
"github.com/containers/podman/v2/cmd/podman/utils" "github.com/containers/podman/v2/cmd/podman/utils"
"github.com/containers/podman/v2/cmd/podman/validate" "github.com/containers/podman/v2/cmd/podman/validate"
@ -23,6 +24,7 @@ var (
Args: func(cmd *cobra.Command, args []string) error { Args: func(cmd *cobra.Command, args []string) error {
return validate.CheckAllLatestAndCIDFile(cmd, args, false, false) return validate.CheckAllLatestAndCIDFile(cmd, args, false, false)
}, },
ValidArgsFunction: common.AutocompletePodsRunning,
Example: `podman pod kill podID Example: `podman pod kill podID
podman pod kill --signal TERM mywebserver podman pod kill --signal TERM mywebserver
podman pod kill --latest`, podman pod kill --latest`,
@ -41,7 +43,11 @@ func init() {
}) })
flags := killCommand.Flags() flags := killCommand.Flags()
flags.BoolVarP(&killOpts.All, "all", "a", false, "Kill all containers in all pods") flags.BoolVarP(&killOpts.All, "all", "a", false, "Kill all containers in all pods")
flags.StringVarP(&killOpts.Signal, "signal", "s", "KILL", "Signal to send to the containers in the pod")
signalFlagName := "signal"
flags.StringVarP(&killOpts.Signal, signalFlagName, "s", "KILL", "Signal to send to the containers in the pod")
_ = killCommand.RegisterFlagCompletionFunc(signalFlagName, common.AutocompleteStopSignal)
validate.AddLatestFlag(killCommand, &killOpts.Latest) validate.AddLatestFlag(killCommand, &killOpts.Latest)
} }

View File

@ -4,6 +4,7 @@ import (
"context" "context"
"fmt" "fmt"
"github.com/containers/podman/v2/cmd/podman/common"
"github.com/containers/podman/v2/cmd/podman/registry" "github.com/containers/podman/v2/cmd/podman/registry"
"github.com/containers/podman/v2/cmd/podman/utils" "github.com/containers/podman/v2/cmd/podman/utils"
"github.com/containers/podman/v2/cmd/podman/validate" "github.com/containers/podman/v2/cmd/podman/validate"
@ -23,6 +24,7 @@ var (
Args: func(cmd *cobra.Command, args []string) error { Args: func(cmd *cobra.Command, args []string) error {
return validate.CheckAllLatestAndCIDFile(cmd, args, false, false) return validate.CheckAllLatestAndCIDFile(cmd, args, false, false)
}, },
ValidArgsFunction: common.AutocompletePodsRunning,
Example: `podman pod pause podID1 podID2 Example: `podman pod pause podID1 podID2
podman pod pause --latest podman pod pause --latest
podman pod pause --all`, podman pod pause --all`,

View File

@ -7,6 +7,7 @@ import (
"os" "os"
"strings" "strings"
"github.com/containers/podman/v2/cmd/podman/common"
"github.com/containers/podman/v2/cmd/podman/registry" "github.com/containers/podman/v2/cmd/podman/registry"
"github.com/containers/podman/v2/cmd/podman/utils" "github.com/containers/podman/v2/cmd/podman/utils"
"github.com/containers/podman/v2/cmd/podman/validate" "github.com/containers/podman/v2/cmd/podman/validate"
@ -28,6 +29,7 @@ var (
Short: "Remove all stopped pods and their containers", Short: "Remove all stopped pods and their containers",
Long: pruneDescription, Long: pruneDescription,
RunE: prune, RunE: prune,
ValidArgsFunction: common.AutocompletePods,
Example: `podman pod prune`, Example: `podman pod prune`,
} }
) )

View File

@ -10,7 +10,9 @@ import (
"text/template" "text/template"
"time" "time"
"github.com/containers/common/pkg/completion"
"github.com/containers/common/pkg/report" "github.com/containers/common/pkg/report"
"github.com/containers/podman/v2/cmd/podman/common"
"github.com/containers/podman/v2/cmd/podman/parse" "github.com/containers/podman/v2/cmd/podman/parse"
"github.com/containers/podman/v2/cmd/podman/registry" "github.com/containers/podman/v2/cmd/podman/registry"
"github.com/containers/podman/v2/cmd/podman/validate" "github.com/containers/podman/v2/cmd/podman/validate"
@ -31,6 +33,7 @@ var (
Long: psDescription, Long: psDescription,
RunE: pods, RunE: pods,
Args: validate.NoArgs, Args: validate.NoArgs,
ValidArgsFunction: completion.AutocompleteNone,
} }
) )
@ -51,13 +54,25 @@ func init() {
flags.BoolVar(&psInput.CtrIds, "ctr-ids", false, "Display the container UUIDs. If no-trunc is not set they will be truncated") 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") flags.BoolVar(&psInput.CtrStatus, "ctr-status", false, "Display the container status")
// TODO should we make this a [] ? // TODO should we make this a [] ?
flags.StringSliceVarP(&inputFilters, "filter", "f", []string{}, "Filter output based on conditions given")
flags.StringVar(&psInput.Format, "format", "", "Pretty-print pods to JSON or using a Go template") filterFlagName := "filter"
flags.StringSliceVarP(&inputFilters, filterFlagName, "f", []string{}, "Filter output based on conditions given")
//TODO complete filters
_ = psCmd.RegisterFlagCompletionFunc(filterFlagName, completion.AutocompleteNone)
formatFlagName := "format"
flags.StringVar(&psInput.Format, formatFlagName, "", "Pretty-print pods to JSON or using a Go template")
_ = psCmd.RegisterFlagCompletionFunc(formatFlagName, common.AutocompleteJSONFormat)
flags.BoolVar(&psInput.Namespace, "namespace", false, "Display namespace information of the pod") 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(&psInput.Namespace, "ns", false, "Display namespace information of the pod")
flags.BoolVar(&noTrunc, "no-trunc", false, "Do not truncate pod and container IDs") 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.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")
sortFlagName := "sort"
flags.StringVar(&psInput.Sort, sortFlagName, "created", "Sort output by created, id, name, or number")
_ = psCmd.RegisterFlagCompletionFunc(sortFlagName, common.AutocompletePodPsSort)
validate.AddLatestFlag(psCmd, &psInput.Latest) validate.AddLatestFlag(psCmd, &psInput.Latest)
} }

View File

@ -4,6 +4,7 @@ import (
"context" "context"
"fmt" "fmt"
"github.com/containers/podman/v2/cmd/podman/common"
"github.com/containers/podman/v2/cmd/podman/registry" "github.com/containers/podman/v2/cmd/podman/registry"
"github.com/containers/podman/v2/cmd/podman/utils" "github.com/containers/podman/v2/cmd/podman/utils"
"github.com/containers/podman/v2/cmd/podman/validate" "github.com/containers/podman/v2/cmd/podman/validate"
@ -23,6 +24,7 @@ var (
Args: func(cmd *cobra.Command, args []string) error { Args: func(cmd *cobra.Command, args []string) error {
return validate.CheckAllLatestAndCIDFile(cmd, args, false, false) return validate.CheckAllLatestAndCIDFile(cmd, args, false, false)
}, },
ValidArgsFunction: common.AutocompletePods,
Example: `podman pod restart podID1 podID2 Example: `podman pod restart podID1 podID2
podman pod restart --latest podman pod restart --latest
podman pod restart --all`, podman pod restart --all`,

View File

@ -5,6 +5,7 @@ import (
"fmt" "fmt"
"strings" "strings"
"github.com/containers/common/pkg/completion"
"github.com/containers/podman/v2/cmd/podman/common" "github.com/containers/podman/v2/cmd/podman/common"
"github.com/containers/podman/v2/cmd/podman/registry" "github.com/containers/podman/v2/cmd/podman/registry"
"github.com/containers/podman/v2/cmd/podman/utils" "github.com/containers/podman/v2/cmd/podman/utils"
@ -35,6 +36,7 @@ var (
Args: func(cmd *cobra.Command, args []string) error { Args: func(cmd *cobra.Command, args []string) error {
return validate.CheckAllLatestAndPodIDFile(cmd, args, false, true) return validate.CheckAllLatestAndPodIDFile(cmd, args, false, true)
}, },
ValidArgsFunction: common.AutocompletePods,
Example: `podman pod rm mywebserverpod Example: `podman pod rm mywebserverpod
podman pod rm -f 860a4b23 podman pod rm -f 860a4b23
podman pod rm -f -a`, podman pod rm -f -a`,
@ -52,7 +54,11 @@ func init() {
flags.BoolVarP(&rmOptions.All, "all", "a", false, "Remove all running pods") flags.BoolVarP(&rmOptions.All, "all", "a", false, "Remove 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.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.Ignore, "ignore", "i", false, "Ignore errors when a specified pod is missing")
flags.StringArrayVarP(&rmOptions.PodIDFiles, "pod-id-file", "", nil, "Read the pod ID from the file")
podIDFileFlagName := "pod-id-file"
flags.StringArrayVarP(&rmOptions.PodIDFiles, podIDFileFlagName, "", nil, "Read the pod ID from the file")
_ = rmCommand.RegisterFlagCompletionFunc(podIDFileFlagName, completion.AutocompleteDefault)
validate.AddLatestFlag(rmCommand, &rmOptions.Latest) validate.AddLatestFlag(rmCommand, &rmOptions.Latest)
if registry.IsRemote() { if registry.IsRemote() {

View File

@ -4,6 +4,7 @@ import (
"context" "context"
"fmt" "fmt"
"github.com/containers/common/pkg/completion"
"github.com/containers/podman/v2/cmd/podman/common" "github.com/containers/podman/v2/cmd/podman/common"
"github.com/containers/podman/v2/cmd/podman/registry" "github.com/containers/podman/v2/cmd/podman/registry"
"github.com/containers/podman/v2/cmd/podman/utils" "github.com/containers/podman/v2/cmd/podman/utils"
@ -31,6 +32,7 @@ var (
Args: func(cmd *cobra.Command, args []string) error { Args: func(cmd *cobra.Command, args []string) error {
return validate.CheckAllLatestAndPodIDFile(cmd, args, false, true) return validate.CheckAllLatestAndPodIDFile(cmd, args, false, true)
}, },
ValidArgsFunction: common.AutocompletePods,
Example: `podman pod start podID Example: `podman pod start podID
podman pod start --latest podman pod start --latest
podman pod start --all`, podman pod start --all`,
@ -50,7 +52,11 @@ func init() {
flags := startCommand.Flags() flags := startCommand.Flags()
flags.BoolVarP(&startOptions.All, "all", "a", false, "Restart all running pods") flags.BoolVarP(&startOptions.All, "all", "a", false, "Restart all running pods")
flags.StringArrayVarP(&startOptions.PodIDFiles, "pod-id-file", "", nil, "Read the pod ID from the file")
podIDFileFlagName := "pod-id-file"
flags.StringArrayVarP(&startOptions.PodIDFiles, podIDFileFlagName, "", nil, "Read the pod ID from the file")
_ = startCommand.RegisterFlagCompletionFunc(podIDFileFlagName, completion.AutocompleteDefault)
validate.AddLatestFlag(startCommand, &startOptions.Latest) validate.AddLatestFlag(startCommand, &startOptions.Latest)
} }

View File

@ -10,6 +10,7 @@ import (
"github.com/buger/goterm" "github.com/buger/goterm"
"github.com/containers/common/pkg/report" "github.com/containers/common/pkg/report"
"github.com/containers/podman/v2/cmd/podman/common"
"github.com/containers/podman/v2/cmd/podman/parse" "github.com/containers/podman/v2/cmd/podman/parse"
"github.com/containers/podman/v2/cmd/podman/registry" "github.com/containers/podman/v2/cmd/podman/registry"
"github.com/containers/podman/v2/cmd/podman/validate" "github.com/containers/podman/v2/cmd/podman/validate"
@ -37,6 +38,7 @@ var (
Short: "Display a live stream of resource usage statistics for the containers in one or more pods", Short: "Display a live stream of resource usage statistics for the containers in one or more pods",
Long: statsDescription, Long: statsDescription,
RunE: stats, RunE: stats,
ValidArgsFunction: common.AutocompletePodsRunning,
Example: `podman pod stats Example: `podman pod stats
podman pod stats a69b23034235 named-pod podman pod stats a69b23034235 named-pod
podman pod stats --latest podman pod stats --latest
@ -53,7 +55,11 @@ func init() {
flags := statsCmd.Flags() flags := statsCmd.Flags()
flags.BoolVarP(&statsOptions.All, "all", "a", false, "Provide stats for all pods") flags.BoolVarP(&statsOptions.All, "all", "a", false, "Provide stats for all pods")
flags.StringVar(&statsOptions.Format, "format", "", "Pretty-print container statistics to JSON or using a Go template")
formatFlagName := "format"
flags.StringVar(&statsOptions.Format, formatFlagName, "", "Pretty-print container statistics to JSON or using a Go template")
_ = statsCmd.RegisterFlagCompletionFunc(formatFlagName, common.AutocompleteJSONFormat)
flags.BoolVar(&statsOptions.NoReset, "no-reset", false, "Disable resetting the screen when streaming") flags.BoolVar(&statsOptions.NoReset, "no-reset", false, "Disable resetting the screen when streaming")
flags.BoolVar(&statsOptions.NoStream, "no-stream", false, "Disable streaming stats and only pull the first result") flags.BoolVar(&statsOptions.NoStream, "no-stream", false, "Disable streaming stats and only pull the first result")
validate.AddLatestFlag(statsCmd, &statsOptions.Latest) validate.AddLatestFlag(statsCmd, &statsOptions.Latest)

View File

@ -4,6 +4,7 @@ import (
"context" "context"
"fmt" "fmt"
"github.com/containers/common/pkg/completion"
"github.com/containers/podman/v2/cmd/podman/common" "github.com/containers/podman/v2/cmd/podman/common"
"github.com/containers/podman/v2/cmd/podman/registry" "github.com/containers/podman/v2/cmd/podman/registry"
"github.com/containers/podman/v2/cmd/podman/utils" "github.com/containers/podman/v2/cmd/podman/utils"
@ -36,6 +37,7 @@ var (
Args: func(cmd *cobra.Command, args []string) error { Args: func(cmd *cobra.Command, args []string) error {
return validate.CheckAllLatestAndPodIDFile(cmd, args, false, true) return validate.CheckAllLatestAndPodIDFile(cmd, args, false, true)
}, },
ValidArgsFunction: common.AutocompletePodsRunning,
Example: `podman pod stop mywebserverpod Example: `podman pod stop mywebserverpod
podman pod stop --latest podman pod stop --latest
podman pod stop --time 0 490eb 3557fb`, podman pod stop --time 0 490eb 3557fb`,
@ -51,8 +53,15 @@ func init() {
flags := stopCommand.Flags() flags := stopCommand.Flags()
flags.BoolVarP(&stopOptions.All, "all", "a", false, "Stop all running pods") 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.Ignore, "ignore", "i", false, "Ignore errors when a specified pod is missing")
flags.UintVarP(&stopOptions.TimeoutCLI, "time", "t", containerConfig.Engine.StopTimeout, "Seconds to wait for pod stop before killing the container")
flags.StringArrayVarP(&stopOptions.PodIDFiles, "pod-id-file", "", nil, "Read the pod ID from the file") timeFlagName := "time"
flags.UintVarP(&stopOptions.TimeoutCLI, timeFlagName, "t", containerConfig.Engine.StopTimeout, "Seconds to wait for pod stop before killing the container")
_ = stopCommand.RegisterFlagCompletionFunc(timeFlagName, completion.AutocompleteNone)
podIDFileFlagName := "pod-id-file"
flags.StringArrayVarP(&stopOptions.PodIDFiles, podIDFileFlagName, "", nil, "Write the pod ID to the file")
_ = stopCommand.RegisterFlagCompletionFunc(podIDFileFlagName, completion.AutocompleteDefault)
validate.AddLatestFlag(stopCommand, &stopOptions.Latest) validate.AddLatestFlag(stopCommand, &stopOptions.Latest)
if registry.IsRemote() { if registry.IsRemote() {

View File

@ -7,6 +7,7 @@ import (
"strings" "strings"
"text/tabwriter" "text/tabwriter"
"github.com/containers/podman/v2/cmd/podman/common"
"github.com/containers/podman/v2/cmd/podman/registry" "github.com/containers/podman/v2/cmd/podman/registry"
"github.com/containers/podman/v2/cmd/podman/validate" "github.com/containers/podman/v2/cmd/podman/validate"
"github.com/containers/podman/v2/pkg/domain/entities" "github.com/containers/podman/v2/pkg/domain/entities"
@ -28,6 +29,7 @@ var (
Long: topDescription, Long: topDescription,
RunE: top, RunE: top,
Args: cobra.ArbitraryArgs, Args: cobra.ArbitraryArgs,
ValidArgsFunction: common.AutocompletePodsRunning,
Example: `podman pod top podID Example: `podman pod top podID
podman pod top --latest podman pod top --latest
podman pod top podID pid seccomp args %C podman pod top podID pid seccomp args %C

View File

@ -4,6 +4,7 @@ import (
"context" "context"
"fmt" "fmt"
"github.com/containers/podman/v2/cmd/podman/common"
"github.com/containers/podman/v2/cmd/podman/registry" "github.com/containers/podman/v2/cmd/podman/registry"
"github.com/containers/podman/v2/cmd/podman/utils" "github.com/containers/podman/v2/cmd/podman/utils"
"github.com/containers/podman/v2/cmd/podman/validate" "github.com/containers/podman/v2/cmd/podman/validate"
@ -23,6 +24,9 @@ var (
Args: func(cmd *cobra.Command, args []string) error { Args: func(cmd *cobra.Command, args []string) error {
return validate.CheckAllLatestAndCIDFile(cmd, args, false, false) return validate.CheckAllLatestAndCIDFile(cmd, args, false, false)
}, },
// TODO have a function which shows only pods which could be unpaused
// for now show all
ValidArgsFunction: common.AutocompletePods,
Example: `podman pod unpause podID1 podID2 Example: `podman pod unpause podID1 podID2
podman pod unpause --all podman pod unpause --all
podman pod unpause --latest`, podman pod unpause --latest`,

View File

@ -5,6 +5,7 @@ import (
"sync" "sync"
"github.com/containers/podman/v2/pkg/domain/entities" "github.com/containers/podman/v2/pkg/domain/entities"
"github.com/spf13/cobra"
"github.com/spf13/pflag" "github.com/spf13/pflag"
) )
@ -23,7 +24,15 @@ func IsRemote() bool {
fs.Usage = func() {} fs.Usage = func() {}
fs.SetInterspersed(false) fs.SetInterspersed(false)
fs.BoolVarP(&remoteFromCLI.Value, "remote", "r", false, "") fs.BoolVarP(&remoteFromCLI.Value, "remote", "r", false, "")
_ = fs.Parse(os.Args[1:])
// The shell completion logic will call a command called "__complete" or "__completeNoDesc"
// This command will always be the second argument
// To still parse --remote correctly in this case we have to set args offset to two in this case
start := 1
if len(os.Args) > 1 && (os.Args[1] == cobra.ShellCompRequestCmd || os.Args[1] == cobra.ShellCompNoDescRequestCmd) {
start = 2
}
_ = fs.Parse(os.Args[start:])
}) })
return podmanOptions.EngineMode == entities.TunnelMode || remoteFromCLI.Value return podmanOptions.EngineMode == entities.TunnelMode || remoteFromCLI.Value
} }

View File

@ -8,7 +8,9 @@ import (
"runtime/pprof" "runtime/pprof"
"strings" "strings"
"github.com/containers/common/pkg/completion"
"github.com/containers/common/pkg/config" "github.com/containers/common/pkg/config"
"github.com/containers/podman/v2/cmd/podman/common"
"github.com/containers/podman/v2/cmd/podman/registry" "github.com/containers/podman/v2/cmd/podman/registry"
"github.com/containers/podman/v2/cmd/podman/validate" "github.com/containers/podman/v2/cmd/podman/validate"
"github.com/containers/podman/v2/libpod/define" "github.com/containers/podman/v2/libpod/define"
@ -21,6 +23,7 @@ import (
"github.com/pkg/errors" "github.com/pkg/errors"
"github.com/sirupsen/logrus" "github.com/sirupsen/logrus"
"github.com/spf13/cobra" "github.com/spf13/cobra"
"github.com/spf13/pflag"
) )
// HelpTemplate is the help template for podman commands // HelpTemplate is the help template for podman commands
@ -67,9 +70,10 @@ var (
Version: version.Version.String(), Version: version.Version.String(),
DisableFlagsInUseLine: true, DisableFlagsInUseLine: true,
} }
logLevels = []string{"debug", "info", "warn", "error", "fatal", "panic"}
logLevel = "error" logLevel = "error"
useSyslog bool useSyslog bool
requireCleanup = true
) )
func init() { func init() {
@ -102,11 +106,36 @@ func persistentPreRunE(cmd *cobra.Command, args []string) error {
// TODO: Remove trace statement in podman V2.1 // TODO: Remove trace statement in podman V2.1
logrus.Debugf("Called %s.PersistentPreRunE(%s)", cmd.Name(), strings.Join(os.Args, " ")) logrus.Debugf("Called %s.PersistentPreRunE(%s)", cmd.Name(), strings.Join(os.Args, " "))
// Help and commands with subcommands are special cases, no need for more setup // Help, completion and commands with subcommands are special cases, no need for more setup
if cmd.Name() == "help" || cmd.HasSubCommands() { // Completion cmd is used to generate the shell scripts
if cmd.Name() == "help" || cmd.Name() == "completion" || cmd.HasSubCommands() {
requireCleanup = false
return nil return nil
} }
// Special case if command is hidden completion command ("__complete","__completeNoDesc")
// Since __completeNoDesc is an alias the cm.Name is always __complete
if cmd.Name() == cobra.ShellCompRequestCmd {
// Parse the cli arguments after the the completion cmd (always called as second argument)
// This ensures that the --url, --identity and --connection flags are properly set
compCmd, _, err := cmd.Root().Traverse(os.Args[2:])
if err != nil {
return err
}
// If we don't complete the root cmd hide all root flags
// so they won't show up in the completions on subcommands.
if compCmd != compCmd.Root() {
compCmd.Root().Flags().VisitAll(func(flag *pflag.Flag) {
flag.Hidden = true
})
}
// No need for further setup when completing commands with subcommands.
if compCmd.HasSubCommands() {
requireCleanup = false
return nil
}
}
cfg := registry.PodmanConfig() cfg := registry.PodmanConfig()
// --connection is not as "special" as --remote so we can wait and process it here // --connection is not as "special" as --remote so we can wait and process it here
@ -203,8 +232,7 @@ func persistentPostRunE(cmd *cobra.Command, args []string) error {
// TODO: Remove trace statement in podman V2.1 // TODO: Remove trace statement in podman V2.1
logrus.Debugf("Called %s.PersistentPostRunE(%s)", cmd.Name(), strings.Join(os.Args, " ")) logrus.Debugf("Called %s.PersistentPostRunE(%s)", cmd.Name(), strings.Join(os.Args, " "))
// Help and commands with subcommands are special cases, no need for more cleanup if !requireCleanup {
if cmd.Name() == "help" || cmd.HasSubCommands() {
return nil return nil
} }
@ -226,14 +254,14 @@ func persistentPostRunE(cmd *cobra.Command, args []string) error {
func loggingHook() { func loggingHook() {
var found bool var found bool
for _, l := range logLevels { for _, l := range common.LogLevels {
if l == strings.ToLower(logLevel) { if l == strings.ToLower(logLevel) {
found = true found = true
break break
} }
} }
if !found { if !found {
fmt.Fprintf(os.Stderr, "Log Level %q is not supported, choose from: %s\n", logLevel, strings.Join(logLevels, ", ")) fmt.Fprintf(os.Stderr, "Log Level %q is not supported, choose from: %s\n", logLevel, strings.Join(common.LogLevels, ", "))
os.Exit(1) os.Exit(1)
} }
@ -254,9 +282,18 @@ func rootFlags(cmd *cobra.Command, opts *entities.PodmanConfig) {
srv, uri, ident := resolveDestination() srv, uri, ident := resolveDestination()
lFlags := cmd.Flags() lFlags := cmd.Flags()
lFlags.StringVarP(&opts.Engine.ActiveService, "connection", "c", srv, "Connection to use for remote Podman service")
lFlags.StringVar(&opts.URI, "url", uri, "URL to access Podman service (CONTAINER_HOST)") connectionFlagName := "connection"
lFlags.StringVar(&opts.Identity, "identity", ident, "path to SSH identity file, (CONTAINER_SSHKEY)") lFlags.StringVarP(&opts.Engine.ActiveService, connectionFlagName, "c", srv, "Connection to use for remote Podman service")
_ = cmd.RegisterFlagCompletionFunc(connectionFlagName, common.AutocompleteSystemConnections)
urlFlagName := "url"
lFlags.StringVar(&opts.URI, urlFlagName, uri, "URL to access Podman service (CONTAINER_HOST)")
_ = cmd.RegisterFlagCompletionFunc(urlFlagName, completion.AutocompleteDefault)
identityFlagName := "identity"
lFlags.StringVar(&opts.Identity, identityFlagName, ident, "path to SSH identity file, (CONTAINER_SSHKEY)")
_ = cmd.RegisterFlagCompletionFunc(identityFlagName, completion.AutocompleteDefault)
lFlags.BoolVarP(&opts.Remote, "remote", "r", false, "Access remote Podman service (default false)") lFlags.BoolVarP(&opts.Remote, "remote", "r", false, "Access remote Podman service (default false)")
pFlags := cmd.PersistentFlags() pFlags := cmd.PersistentFlags()
@ -266,25 +303,67 @@ func rootFlags(cmd *cobra.Command, opts *entities.PodmanConfig) {
} }
opts.Remote = true opts.Remote = true
} else { } else {
pFlags.StringVar(&cfg.Engine.CgroupManager, "cgroup-manager", cfg.Engine.CgroupManager, "Cgroup manager to use (\"cgroupfs\"|\"systemd\")") cgroupManagerFlagName := "cgroup-manager"
pFlags.StringVar(&opts.CPUProfile, "cpu-profile", "", "Path for the cpu profiling results") pFlags.StringVar(&cfg.Engine.CgroupManager, cgroupManagerFlagName, cfg.Engine.CgroupManager, "Cgroup manager to use (\"cgroupfs\"|\"systemd\")")
pFlags.StringVar(&opts.ConmonPath, "conmon", "", "Path of the conmon binary") _ = cmd.RegisterFlagCompletionFunc(cgroupManagerFlagName, common.AutocompleteCgroupManager)
pFlags.StringVar(&cfg.Engine.NetworkCmdPath, "network-cmd-path", cfg.Engine.NetworkCmdPath, "Path to the command for configuring the network")
pFlags.StringVar(&cfg.Network.NetworkConfigDir, "cni-config-dir", cfg.Network.NetworkConfigDir, "Path of the configuration directory for CNI networks") pFlags.StringVar(&opts.CPUProfile, "cpu-profile", "", "Path for the cpu profiling results")
pFlags.StringVar(&cfg.Containers.DefaultMountsFile, "default-mounts-file", cfg.Containers.DefaultMountsFile, "Path to default mounts file")
pFlags.StringVar(&cfg.Engine.EventsLogger, "events-backend", cfg.Engine.EventsLogger, `Events backend to use ("file"|"journald"|"none")`) conmonFlagName := "conmon"
pFlags.StringSliceVar(&cfg.Engine.HooksDir, "hooks-dir", cfg.Engine.HooksDir, "Set the OCI hooks directory path (may be set multiple times)") pFlags.StringVar(&opts.ConmonPath, conmonFlagName, "", "Path of the conmon binary")
pFlags.IntVar(&opts.MaxWorks, "max-workers", (runtime.NumCPU()*3)+1, "The maximum number of workers for parallel operations") _ = cmd.RegisterFlagCompletionFunc(conmonFlagName, completion.AutocompleteDefault)
pFlags.StringVar(&cfg.Engine.Namespace, "namespace", cfg.Engine.Namespace, "Set the libpod namespace, used to create separate views of the containers and pods on the system")
pFlags.StringVar(&cfg.Engine.StaticDir, "root", "", "Path to the root directory in which data, including images, is stored") networkCmdPathFlagName := "network-cmd-path"
pFlags.StringVar(&opts.RegistriesConf, "registries-conf", "", "Path to a registries.conf to use for image processing") pFlags.StringVar(&cfg.Engine.NetworkCmdPath, networkCmdPathFlagName, cfg.Engine.NetworkCmdPath, "Path to the command for configuring the network")
pFlags.StringVar(&opts.Runroot, "runroot", "", "Path to the 'run directory' where all state information is stored") _ = cmd.RegisterFlagCompletionFunc(networkCmdPathFlagName, completion.AutocompleteDefault)
pFlags.StringVar(&opts.RuntimePath, "runtime", "", "Path to the OCI-compatible binary used to run containers, default is /usr/bin/runc")
// -s is deprecated due to conflict with -s on subcommands cniConfigDirFlagName := "cni-config-dir"
pFlags.StringVar(&opts.StorageDriver, "storage-driver", "", "Select which storage driver is used to manage storage of images and containers (default is overlay)") pFlags.StringVar(&cfg.Network.NetworkConfigDir, cniConfigDirFlagName, cfg.Network.NetworkConfigDir, "Path of the configuration directory for CNI networks")
pFlags.StringArrayVar(&opts.StorageOpts, "storage-opt", []string{}, "Used to pass an option to the storage driver") _ = cmd.RegisterFlagCompletionFunc(cniConfigDirFlagName, completion.AutocompleteDefault)
pFlags.StringVar(&cfg.Containers.DefaultMountsFile, "default-mounts-file", cfg.Containers.DefaultMountsFile, "Path to default mounts file")
eventsBackendFlagName := "events-backend"
pFlags.StringVar(&cfg.Engine.EventsLogger, eventsBackendFlagName, cfg.Engine.EventsLogger, `Events backend to use ("file"|"journald"|"none")`)
_ = cmd.RegisterFlagCompletionFunc(eventsBackendFlagName, common.AutocompleteEventBackend)
hooksDirFlagName := "hooks-dir"
pFlags.StringSliceVar(&cfg.Engine.HooksDir, hooksDirFlagName, cfg.Engine.HooksDir, "Set the OCI hooks directory path (may be set multiple times)")
_ = cmd.RegisterFlagCompletionFunc(hooksDirFlagName, completion.AutocompleteDefault)
pFlags.IntVar(&opts.MaxWorks, "max-workers", (runtime.NumCPU()*3)+1, "The maximum number of workers for parallel operations")
namespaceFlagName := "namespace"
pFlags.StringVar(&cfg.Engine.Namespace, namespaceFlagName, cfg.Engine.Namespace, "Set the libpod namespace, used to create separate views of the containers and pods on the system")
_ = cmd.RegisterFlagCompletionFunc(namespaceFlagName, completion.AutocompleteNone)
rootFlagName := "root"
pFlags.StringVar(&cfg.Engine.StaticDir, rootFlagName, "", "Path to the root directory in which data, including images, is stored")
_ = cmd.RegisterFlagCompletionFunc(rootFlagName, completion.AutocompleteDefault)
pFlags.StringVar(&opts.RegistriesConf, "registries-conf", "", "Path to a registries.conf to use for image processing")
runrootFlagName := "runroot"
pFlags.StringVar(&opts.Runroot, runrootFlagName, "", "Path to the 'run directory' where all state information is stored")
_ = cmd.RegisterFlagCompletionFunc(runrootFlagName, completion.AutocompleteDefault)
runtimeFlagName := "runtime"
pFlags.StringVar(&opts.RuntimePath, runtimeFlagName, "", "Path to the OCI-compatible binary used to run containers, default is /usr/bin/runc")
_ = cmd.RegisterFlagCompletionFunc(runtimeFlagName, completion.AutocompleteDefault)
// -s is deprecated due to conflict with -s on subcommands
storageDriverFlagName := "storage-driver"
pFlags.StringVar(&opts.StorageDriver, storageDriverFlagName, "", "Select which storage driver is used to manage storage of images and containers (default is overlay)")
_ = cmd.RegisterFlagCompletionFunc(storageDriverFlagName, completion.AutocompleteNone) //TODO: what can we recommend here?
storageOptFlagName := "storage-opt"
pFlags.StringArrayVar(&opts.StorageOpts, storageOptFlagName, []string{}, "Used to pass an option to the storage driver")
_ = cmd.RegisterFlagCompletionFunc(storageOptFlagName, completion.AutocompleteNone)
tmpdirFlagName := "tmpdir"
pFlags.StringVar(&opts.Engine.TmpDir, tmpdirFlagName, "", "Path to the tmp directory for libpod state content.\n\nNote: use the environment variable 'TMPDIR' to change the temporary storage location for container images, '/var/tmp'.\n")
_ = cmd.RegisterFlagCompletionFunc(tmpdirFlagName, completion.AutocompleteDefault)
pFlags.StringVar(&opts.Engine.TmpDir, "tmpdir", "", "Path to the tmp directory for libpod state content.\n\nNote: use the environment variable 'TMPDIR' to change the temporary storage location for container images, '/var/tmp'.\n")
pFlags.BoolVar(&opts.Trace, "trace", false, "Enable opentracing output (default false)") pFlags.BoolVar(&opts.Trace, "trace", false, "Enable opentracing output (default false)")
// Hide these flags for both ABI and Tunneling // Hide these flags for both ABI and Tunneling
@ -303,11 +382,17 @@ func rootFlags(cmd *cobra.Command, opts *entities.PodmanConfig) {
// Override default --help information of `--help` global flag // Override default --help information of `--help` global flag
var dummyHelp bool var dummyHelp bool
pFlags.BoolVar(&dummyHelp, "help", false, "Help for podman") pFlags.BoolVar(&dummyHelp, "help", false, "Help for podman")
pFlags.StringVar(&logLevel, "log-level", logLevel, fmt.Sprintf("Log messages above specified level (%s)", strings.Join(logLevels, ", ")))
logLevelFlagName := "log-level"
pFlags.StringVar(&logLevel, logLevelFlagName, logLevel, fmt.Sprintf("Log messages above specified level (%s)", strings.Join(common.LogLevels, ", ")))
_ = rootCmd.RegisterFlagCompletionFunc(logLevelFlagName, common.AutocompleteLogLevel)
// Only create these flags for ABI connections // Only create these flags for ABI connections
if !registry.IsRemote() { if !registry.IsRemote() {
pFlags.StringArrayVar(&opts.RuntimeFlags, "runtime-flag", []string{}, "add global flags for the container runtime") runtimeflagFlagName := "runtime-flag"
pFlags.StringArrayVar(&opts.RuntimeFlags, runtimeflagFlagName, []string{}, "add global flags for the container runtime")
_ = rootCmd.RegisterFlagCompletionFunc(runtimeflagFlagName, completion.AutocompleteNone)
pFlags.BoolVar(&useSyslog, "syslog", false, "Output logging information to syslog as well as the console (default false)") pFlags.BoolVar(&useSyslog, "syslog", false, "Output logging information to syslog as well as the console (default false)")
} }
} }

View File

@ -0,0 +1,71 @@
/*
The purpose of this test is to keep a consistent
and great shell autocompletion experience.
This test ensures that each command and flag has a shell completion
function set. (except boolean, hidden and deprecated flags)
Shell completion functions are defined in:
- "github.com/containers/podman/v2/cmd/podman/common/completion.go"
- "github.com/containers/common/pkg/completion"
and are called Autocomplete...
To apply such function to a command use the ValidArgsFunction field.
To apply such function to a flag use cmd.RegisterFlagCompletionFunc(name,func)
If there are any questions/problems please tag Luap99.
*/
package main
import (
"testing"
"github.com/spf13/cobra"
"github.com/spf13/pflag"
)
func TestShellCompletionFunctions(t *testing.T) {
rootCmd := parseCommands()
checkCommand(t, rootCmd)
}
func checkCommand(t *testing.T, cmd *cobra.Command) {
if cmd.HasSubCommands() {
for _, childCmd := range cmd.Commands() {
checkCommand(t, childCmd)
}
// if not check if completion for that command is provided
} else if cmd.ValidArgsFunction == nil && cmd.ValidArgs == nil {
t.Errorf("%s command has no shell completion function set", cmd.CommandPath())
}
// loop over all local flags
cmd.LocalFlags().VisitAll(func(flag *pflag.Flag) {
// an error means that there is a completion function for this flag
err := cmd.RegisterFlagCompletionFunc(flag.Name, func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) {
return nil, cobra.ShellCompDirectiveDefault
})
switch {
case flag.Value.Type() == "bool" && err != nil:
// make sure bool flags don't have a completion function
t.Errorf(`%s --%s is a bool flag but has a shell completion function set.
You have to remove this shell completion function.`, cmd.CommandPath(), flag.Name)
return
case flag.Value.Type() == "bool" || flag.Hidden || len(flag.Deprecated) > 0:
// skip bool, hidden and deprecated flags
return
case err == nil:
// there is no shell completion function
t.Errorf("%s --%s flag has no shell completion function set", cmd.CommandPath(), flag.Name)
}
})
}

View File

@ -10,6 +10,7 @@ import (
"os/user" "os/user"
"regexp" "regexp"
"github.com/containers/common/pkg/completion"
"github.com/containers/common/pkg/config" "github.com/containers/common/pkg/config"
"github.com/containers/podman/v2/cmd/podman/registry" "github.com/containers/podman/v2/cmd/podman/registry"
"github.com/containers/podman/v2/cmd/podman/system" "github.com/containers/podman/v2/cmd/podman/system"
@ -35,6 +36,7 @@ var (
an URI of the form ssh://[user@]hostname[:port] an URI of the form ssh://[user@]hostname[:port]
`, `,
RunE: add, RunE: add,
ValidArgsFunction: completion.AutocompleteNone,
Example: `podman system connection add laptop server.fubar.com Example: `podman system connection add laptop server.fubar.com
podman system connection add --identity ~/.ssh/dev_rsa testing ssh://root@server.fubar.com:2222 podman system connection add --identity ~/.ssh/dev_rsa testing ssh://root@server.fubar.com:2222
podman system connection add --identity ~/.ssh/dev_rsa --port 22 production root@server.fubar.com podman system connection add --identity ~/.ssh/dev_rsa --port 22 production root@server.fubar.com
@ -57,9 +59,19 @@ func init() {
}) })
flags := addCmd.Flags() flags := addCmd.Flags()
flags.IntVarP(&cOpts.Port, "port", "p", 22, "SSH port number for destination")
flags.StringVar(&cOpts.Identity, "identity", "", "path to SSH identity file") portFlagName := "port"
flags.StringVar(&cOpts.UDSPath, "socket-path", "", "path to podman socket on remote host. (default '/run/podman/podman.sock' or '/run/user/{uid}/podman/podman.sock)") flags.IntVarP(&cOpts.Port, portFlagName, "p", 22, "SSH port number for destination")
_ = addCmd.RegisterFlagCompletionFunc(portFlagName, completion.AutocompleteNone)
identityFlagName := "identity"
flags.StringVar(&cOpts.Identity, identityFlagName, "", "path to SSH identity file")
_ = addCmd.RegisterFlagCompletionFunc(identityFlagName, completion.AutocompleteDefault)
socketPathFlagName := "socket-path"
flags.StringVar(&cOpts.UDSPath, socketPathFlagName, "", "path to podman socket on remote host. (default '/run/podman/podman.sock' or '/run/user/{uid}/podman/podman.sock)")
_ = 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")
} }

View File

@ -4,6 +4,7 @@ import (
"fmt" "fmt"
"github.com/containers/common/pkg/config" "github.com/containers/common/pkg/config"
"github.com/containers/podman/v2/cmd/podman/common"
"github.com/containers/podman/v2/cmd/podman/registry" "github.com/containers/podman/v2/cmd/podman/registry"
"github.com/containers/podman/v2/cmd/podman/system" "github.com/containers/podman/v2/cmd/podman/system"
"github.com/containers/podman/v2/pkg/domain/entities" "github.com/containers/podman/v2/pkg/domain/entities"
@ -18,6 +19,7 @@ var (
Short: "Set named destination as default", Short: "Set named destination as default",
Long: `Set named destination as default for the Podman service`, Long: `Set named destination as default for the Podman service`,
DisableFlagsInUseLine: true, DisableFlagsInUseLine: true,
ValidArgsFunction: common.AutocompleteSystemConnections,
RunE: defaultRunE, RunE: defaultRunE,
Example: `podman system connection default testing`, Example: `podman system connection default testing`,
} }

Some files were not shown because too many files have changed in this diff Show More