Add --noheading flag to all list commands

Currently we have only podman images list --noheading.
This PR Adds this option to volumes, containers, pods, networks,
machines, and secrets.

Fixes: https://github.com/containers/podman/issues/10065

Signed-off-by: Daniel J Walsh <dwalsh@redhat.com>
This commit is contained in:
Daniel J Walsh
2021-04-20 10:03:49 -04:00
parent 0d3aa18f04
commit 8ebeadc3c6
16 changed files with 80 additions and 15 deletions

View File

@ -97,6 +97,7 @@ func listFlagSet(cmd *cobra.Command) {
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.Bool("noheading", false, "Do not print headers")
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")
@ -242,7 +243,8 @@ func ps(cmd *cobra.Command, _ []string) error {
defer w.Flush() defer w.Flush()
headers := func() error { return nil } headers := func() error { return nil }
if !(listOpts.Quiet || cmd.Flags().Changed("format")) { noHeading, _ := cmd.Flags().GetBool("noheading")
if !(noHeading || listOpts.Quiet || cmd.Flags().Changed("format")) {
headers = func() error { headers = func() error {
return tmpl.Execute(w, hdrs) return tmpl.Execute(w, hdrs)
} }

View File

@ -61,6 +61,7 @@ func init() {
formatFlagName := "format" formatFlagName := "format"
flags.StringVar(&listFlag.format, formatFlagName, "{{.Name}}\t{{.VMType}}\t{{.Created}}\t{{.LastUp}}\n", "Format volume output using Go template") flags.StringVar(&listFlag.format, formatFlagName, "{{.Name}}\t{{.VMType}}\t{{.Created}}\t{{.LastUp}}\n", "Format volume output using Go template")
_ = lsCmd.RegisterFlagCompletionFunc(formatFlagName, completion.AutocompleteNone) _ = lsCmd.RegisterFlagCompletionFunc(formatFlagName, completion.AutocompleteNone)
flags.BoolVar(&listFlag.noHeading, "noheading", false, "Do not print headers")
} }
func list(cmd *cobra.Command, args []string) error { func list(cmd *cobra.Command, args []string) error {

View File

@ -48,6 +48,7 @@ func networkListFlags(flags *pflag.FlagSet) {
filterFlagName := "filter" filterFlagName := "filter"
flags.StringArrayVarP(&filters, filterFlagName, "f", nil, "Provide filter values (e.g. 'name=podman')") flags.StringArrayVarP(&filters, filterFlagName, "f", nil, "Provide filter values (e.g. 'name=podman')")
flags.Bool("noheading", false, "Do not print headers")
_ = networklistCommand.RegisterFlagCompletionFunc(filterFlagName, common.AutocompleteNetworkFilters) _ = networklistCommand.RegisterFlagCompletionFunc(filterFlagName, common.AutocompleteNetworkFilters)
} }
@ -140,7 +141,8 @@ func templateOut(responses []*entities.NetworkListReport, cmd *cobra.Command) er
w := tabwriter.NewWriter(os.Stdout, 8, 2, 2, ' ', 0) w := tabwriter.NewWriter(os.Stdout, 8, 2, 2, ' ', 0)
defer w.Flush() defer w.Flush()
if renderHeaders { noHeading, _ := cmd.Flags().GetBool("noheading")
if !noHeading && renderHeaders {
if err := tmpl.Execute(w, headers); err != nil { if err := tmpl.Execute(w, headers); err != nil {
return err return err
} }

View File

@ -63,6 +63,7 @@ func init() {
flags.StringVar(&psInput.Format, formatFlagName, "", "Pretty-print pods to JSON or using a Go template") flags.StringVar(&psInput.Format, formatFlagName, "", "Pretty-print pods to JSON or using a Go template")
_ = psCmd.RegisterFlagCompletionFunc(formatFlagName, common.AutocompleteJSONFormat) _ = psCmd.RegisterFlagCompletionFunc(formatFlagName, common.AutocompleteJSONFormat)
flags.Bool("noheading", false, "Do not print headers")
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")
@ -134,6 +135,10 @@ func pods(cmd *cobra.Command, _ []string) error {
renderHeaders = parse.HasTable(psInput.Format) renderHeaders = parse.HasTable(psInput.Format)
row = report.NormalizeFormat(psInput.Format) row = report.NormalizeFormat(psInput.Format)
} }
noHeading, _ := cmd.Flags().GetBool("noheading")
if noHeading {
renderHeaders = false
}
format := parse.EnforceRange(row) format := parse.EnforceRange(row)
tmpl, err := template.New("listPods").Parse(format) tmpl, err := template.New("listPods").Parse(format)

View File

@ -48,6 +48,7 @@ func init() {
formatFlagName := "format" formatFlagName := "format"
flags.StringVar(&listFlag.format, formatFlagName, "{{.ID}}\t{{.Name}}\t{{.Driver}}\t{{.CreatedAt}}\t{{.UpdatedAt}}\t\n", "Format volume output using Go template") flags.StringVar(&listFlag.format, formatFlagName, "{{.ID}}\t{{.Name}}\t{{.Driver}}\t{{.CreatedAt}}\t{{.UpdatedAt}}\t\n", "Format volume output using Go template")
_ = lsCmd.RegisterFlagCompletionFunc(formatFlagName, common.AutocompleteJSONFormat) _ = lsCmd.RegisterFlagCompletionFunc(formatFlagName, common.AutocompleteJSONFormat)
flags.BoolVar(&listFlag.noHeading, "noheading", false, "Do not print headers")
} }
func ls(cmd *cobra.Command, args []string) error { func ls(cmd *cobra.Command, args []string) error {

View File

@ -62,6 +62,7 @@ func init() {
flags.StringVar(&cliOpts.Format, formatFlagName, "{{.Driver}}\t{{.Name}}\n", "Format volume output using Go template") flags.StringVar(&cliOpts.Format, formatFlagName, "{{.Driver}}\t{{.Name}}\n", "Format volume output using Go template")
_ = lsCommand.RegisterFlagCompletionFunc(formatFlagName, common.AutocompleteJSONFormat) _ = lsCommand.RegisterFlagCompletionFunc(formatFlagName, common.AutocompleteJSONFormat)
flags.Bool("noheading", false, "Do not print headers")
flags.BoolVarP(&cliOpts.Quiet, "quiet", "q", false, "Print volume output in quiet mode") flags.BoolVarP(&cliOpts.Quiet, "quiet", "q", false, "Print volume output in quiet mode")
} }
@ -94,6 +95,7 @@ func list(cmd *cobra.Command, args []string) error {
} }
func outputTemplate(cmd *cobra.Command, responses []*entities.VolumeListReport) error { func outputTemplate(cmd *cobra.Command, responses []*entities.VolumeListReport) error {
noHeading, _ := cmd.Flags().GetBool("noheading")
headers := report.Headers(entities.VolumeListReport{}, map[string]string{ headers := report.Headers(entities.VolumeListReport{}, map[string]string{
"Name": "VOLUME NAME", "Name": "VOLUME NAME",
}) })
@ -111,7 +113,7 @@ func outputTemplate(cmd *cobra.Command, responses []*entities.VolumeListReport)
w := tabwriter.NewWriter(os.Stdout, 12, 2, 2, ' ', 0) w := tabwriter.NewWriter(os.Stdout, 12, 2, 2, ' ', 0)
defer w.Flush() defer w.Flush()
if !cliOpts.Quiet && !cmd.Flag("format").Changed { if !(noHeading || cliOpts.Quiet || cmd.Flag("format").Changed) {
if err := tmpl.Execute(w, headers); err != nil { if err := tmpl.Execute(w, headers); err != nil {
return errors.Wrapf(err, "failed to write report column headers") return errors.Wrapf(err, "failed to write report column headers")
} }

View File

@ -35,6 +35,10 @@ Valid placeholders for the Go template are listed below:
Print usage statement. Print usage statement.
#### **\-\-noheading**
Omit the table headings from the listing of pods.
## EXAMPLES ## EXAMPLES
``` ```

View File

@ -41,6 +41,10 @@ Valid placeholders for the Go template are listed below:
| .Labels | Network labels | | .Labels | Network labels |
| .Version | CNI Version of the config file | | .Version | CNI Version of the config file |
#### **\-\-noheading**
Omit the table headings from the listing of networks.
#### **\-\-no-trunc** #### **\-\-no-trunc**
Do not truncate the network ID. The network ID is not displayed by default and must be specified with **\-\-format**. Do not truncate the network ID. The network ID is not displayed by default and must be specified with **\-\-format**.

View File

@ -42,6 +42,10 @@ Includes the container statuses in the container info field
Show the latest pod created (all states) (This option is not available with the remote Podman client) Show the latest pod created (all states) (This option is not available with the remote Podman client)
#### **\-\-noheading**
Omit the table headings from the listing of pods.
#### **\-\-no-trunc** #### **\-\-no-trunc**
Display the extended information Display the extended information

View File

@ -100,6 +100,10 @@ Show the latest container created (all states) (This option is not available wit
Display namespace information Display namespace information
#### **\-\-noheading**
Omit the table headings from the listing of containers.
#### **\-\-no-trunc** #### **\-\-no-trunc**
Display the extended information Display the extended information

View File

@ -16,6 +16,10 @@ Lists all the secrets that exist. The output can be formatted to a Go template u
Format secret output using Go template. Format secret output using Go template.
#### **\-\-noheading**
Omit the table headings from the listing of secrets. .
## EXAMPLES ## EXAMPLES
``` ```

View File

@ -26,6 +26,10 @@ Format volume output using Go template.
Print usage statement. Print usage statement.
#### **\-\-noheading**
Omit the table headings from the listing of volumes.
#### **\-\-quiet**, **-q** #### **\-\-quiet**, **-q**
Print volume output in quiet mode. Only print the volume names. Print volume output in quiet mode. Only print the volume names.

View File

@ -5,6 +5,9 @@ load helpers
@test "podman ps - basic tests" { @test "podman ps - basic tests" {
rand_name=$(random_string 30) rand_name=$(random_string 30)
run_podman ps --noheading
is "$output" "" "baseline: empty results from ps --noheading"
run_podman run -d --name $rand_name $IMAGE sleep 5 run_podman run -d --name $rand_name $IMAGE sleep 5
cid=$output cid=$output
is "$cid" "[0-9a-f]\{64\}$" is "$cid" "[0-9a-f]\{64\}$"
@ -30,8 +33,6 @@ load helpers
"${cid:0:12} \+$IMAGE *sleep .* Exited .* $rand_name" \ "${cid:0:12} \+$IMAGE *sleep .* Exited .* $rand_name" \
"podman ps -a" "podman ps -a"
run_podman rm $cid run_podman rm $cid
} }

View File

@ -23,6 +23,9 @@ function teardown() {
@test "podman run --volumes : basic" { @test "podman run --volumes : basic" {
skip_if_remote "volumes cannot be shared across hosts" skip_if_remote "volumes cannot be shared across hosts"
run_podman volume list --noheading
is "$output" "" "baseline: empty results from list --noheading"
# Create three temporary directories # Create three temporary directories
vol1=${PODMAN_TMPDIR}/v1_$(random_string) vol1=${PODMAN_TMPDIR}/v1_$(random_string)
vol2=${PODMAN_TMPDIR}/v2_$(random_string) vol2=${PODMAN_TMPDIR}/v2_$(random_string)

View File

@ -17,6 +17,17 @@ function teardown() {
} }
@test "podman pod - basic tests" {
run_podman pod list --noheading
is "$output" "" "baseline: empty results from list --noheading"
run_podman pod ls --noheading
is "$output" "" "baseline: empty results from ls --noheading"
run_podman pod ps --noheading
is "$output" "" "baseline: empty results from ps --noheading"
}
@test "podman pod top - containers in different PID namespaces" { @test "podman pod top - containers in different PID namespaces" {
# With infra=false, we don't get a /pause container (we also # With infra=false, we don't get a /pause container (we also
# don't pull k8s.gcr.io/pause ) # don't pull k8s.gcr.io/pause )

View File

@ -5,6 +5,19 @@
load helpers load helpers
@test "podman network - basic tests" {
heading="*NETWORK*ID*NAME*VERSION*PLUGINS*"
run_podman network ls
if [[ ${output} != ${heading} ]]; then
die "network ls expected heading is not available"
fi
run_podman network ls --noheading
if [[ ${output} = ${heading} ]]; then
die "network ls --noheading did not remove heading: $output"
fi
}
# Copied from tsweeney's https://github.com/containers/podman/issues/4827 # Copied from tsweeney's https://github.com/containers/podman/issues/4827
@test "podman networking: port on localhost" { @test "podman networking: port on localhost" {
skip_if_remote "FIXME: reevaluate this one after #7360 is fixed" skip_if_remote "FIXME: reevaluate this one after #7360 is fixed"