2015-01-12 23:30:52 +00:00
/ *
2016-06-03 00:25:58 +00:00
Copyright 2014 The Kubernetes Authors .
2015-01-12 23:30:52 +00:00
Licensed under the Apache License , Version 2.0 ( the "License" ) ;
you may not use this file except in compliance with the License .
You may obtain a copy of the License at
http : //www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing , software
distributed under the License is distributed on an "AS IS" BASIS ,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND , either express or implied .
See the License for the specific language governing permissions and
limitations under the License .
* /
2015-02-05 00:14:48 +00:00
package util
2015-01-12 23:30:52 +00:00
import (
2015-07-01 22:47:43 +00:00
"fmt"
"io"
2015-08-21 13:09:41 +00:00
"strings"
2015-07-01 22:47:43 +00:00
2017-01-11 14:09:48 +00:00
"k8s.io/apimachinery/pkg/api/meta"
2017-02-19 22:39:43 +00:00
"k8s.io/apimachinery/pkg/runtime"
2015-08-05 22:03:47 +00:00
"k8s.io/kubernetes/pkg/kubectl"
2016-12-08 20:26:37 +00:00
"k8s.io/kubernetes/pkg/kubectl/resource"
2017-02-19 22:39:43 +00:00
"k8s.io/kubernetes/pkg/printers"
2015-01-12 23:30:52 +00:00
"github.com/spf13/cobra"
)
2015-06-16 16:30:11 +00:00
// AddPrinterFlags adds printing related flags to a command (e.g. output format, no headers, template path)
2015-01-12 23:30:52 +00:00
func AddPrinterFlags ( cmd * cobra . Command ) {
2017-02-16 18:23:59 +00:00
AddNonDeprecatedPrinterFlags ( cmd )
cmd . Flags ( ) . String ( "output-version" , "" , "DEPRECATED: To use a specific API version, fully-qualify the resource, version, and group (for example: 'jobs.v1.batch/myjob')." )
cmd . Flags ( ) . MarkDeprecated ( "output-version" , "the resource is used exactly as fetched from the API. To get a specific API version, fully-qualify the resource, version, and group (for example: 'jobs.v1.batch/myjob')." )
cmd . Flags ( ) . MarkHidden ( "output-version" )
}
// AddNonDeprecatedPrinterFlags supports the conversion case which must logically have output-version. Once output-version
// is completely removed, this function can go away.
func AddNonDeprecatedPrinterFlags ( cmd * cobra . Command ) {
2016-07-05 09:23:32 +00:00
AddOutputFlags ( cmd )
AddNoHeadersFlags ( cmd )
2016-02-04 07:08:44 +00:00
cmd . Flags ( ) . Bool ( "show-labels" , false , "When printing, show all labels as the last column (default hide labels column)" )
2016-04-16 00:12:42 +00:00
cmd . Flags ( ) . String ( "template" , "" , "Template string or path to template file to use when -o=go-template, -o=go-template-file. The template format is golang templates [http://golang.org/pkg/text/template/#pkg-overview]." )
2016-03-11 22:06:42 +00:00
cmd . MarkFlagFilename ( "template" )
2016-02-15 03:31:13 +00:00
cmd . Flags ( ) . String ( "sort-by" , "" , "If non-empty, sort list types using this field specification. The field specification is expressed as a JSONPath expression (e.g. '{.metadata.name}'). The field in the API resource specified by this JSONPath expression must be an integer or a string." )
2015-07-31 23:42:34 +00:00
cmd . Flags ( ) . BoolP ( "show-all" , "a" , false , "When printing, show all resources (default hide terminated pods.)" )
2015-01-12 23:30:52 +00:00
}
2015-07-01 22:47:43 +00:00
// AddOutputFlagsForMutation adds output related flags to a command. Used by mutations only.
func AddOutputFlagsForMutation ( cmd * cobra . Command ) {
cmd . Flags ( ) . StringP ( "output" , "o" , "" , "Output mode. Use \"-o name\" for shorter output (resource/name)." )
}
2017-01-15 07:30:06 +00:00
// AddOutputVarFlagsForMutation adds output related flags to a command. Used by mutations only.
func AddOutputVarFlagsForMutation ( cmd * cobra . Command , output * string ) {
cmd . Flags ( ) . StringVarP ( output , "output" , "o" , "" , "Output mode. Use \"-o name\" for shorter output (resource/name)." )
}
2016-07-05 09:23:32 +00:00
// AddOutputFlags adds output related flags to a command.
func AddOutputFlags ( cmd * cobra . Command ) {
2016-07-06 12:03:09 +00:00
cmd . Flags ( ) . StringP ( "output" , "o" , "" , "Output format. One of: json|yaml|wide|name|custom-columns=...|custom-columns-file=...|go-template=...|go-template-file=...|jsonpath=...|jsonpath-file=... See custom columns [http://kubernetes.io/docs/user-guide/kubectl-overview/#custom-columns], golang template [http://golang.org/pkg/text/template/#pkg-overview] and jsonpath template [http://kubernetes.io/docs/user-guide/jsonpath]." )
2017-01-05 20:29:44 +00:00
cmd . Flags ( ) . Bool ( "allow-missing-template-keys" , true , "If true, ignore any errors in templates when a field or map key is missing in the template. Only applies to golang and jsonpath output formats." )
2016-07-05 09:23:32 +00:00
}
// AddNoHeadersFlags adds no-headers flags to a command.
func AddNoHeadersFlags ( cmd * cobra . Command ) {
2016-12-21 00:49:35 +00:00
cmd . Flags ( ) . Bool ( "no-headers" , false , "When using the default or custom-column output format, don't print headers (default print headers)." )
2016-07-05 09:23:32 +00:00
}
2015-07-01 22:47:43 +00:00
// PrintSuccess prints message after finishing mutating operations
2016-08-23 18:11:39 +00:00
func PrintSuccess ( mapper meta . RESTMapper , shortOutput bool , out io . Writer , resource string , name string , dryRun bool , operation string ) {
2015-07-01 22:47:43 +00:00
resource , _ = mapper . ResourceSingularizer ( resource )
2016-08-23 18:11:39 +00:00
dryRunMsg := ""
if dryRun {
dryRunMsg = " (dry run)"
}
2015-07-01 22:47:43 +00:00
if shortOutput {
// -o name: prints resource/name
if len ( resource ) > 0 {
fmt . Fprintf ( out , "%s/%s\n" , resource , name )
} else {
fmt . Fprintf ( out , "%s\n" , name )
}
} else {
// understandable output by default
if len ( resource ) > 0 {
2016-08-23 18:11:39 +00:00
fmt . Fprintf ( out , "%s \"%s\" %s%s\n" , resource , name , operation , dryRunMsg )
2015-07-01 22:47:43 +00:00
} else {
2016-08-23 18:11:39 +00:00
fmt . Fprintf ( out , "\"%s\" %s%s\n" , name , operation , dryRunMsg )
2015-07-01 22:47:43 +00:00
}
}
}
// ValidateOutputArgs validates -o flag args for mutations
func ValidateOutputArgs ( cmd * cobra . Command ) error {
outputMode := GetFlagString ( cmd , "output" )
if outputMode != "" && outputMode != "name" {
return UsageError ( cmd , "Unexpected -o output mode: %v. We only support '-o name'." , outputMode )
}
return nil
}
2015-01-12 23:30:52 +00:00
// PrinterForCommand returns the default printer for this command.
// Requires that printer flags have been added to cmd (see AddPrinterFlags).
2017-02-19 22:39:43 +00:00
func PrinterForCommand ( cmd * cobra . Command , mapper meta . RESTMapper , typer runtime . ObjectTyper , decoders [ ] runtime . Decoder ) ( printers . ResourcePrinter , bool , error ) {
2015-01-12 23:30:52 +00:00
outputFormat := GetFlagString ( cmd , "output" )
2015-08-13 17:11:00 +00:00
// templates are logically optional for specifying a format.
// TODO once https://github.com/kubernetes/kubernetes/issues/12668 is fixed, this should fall back to GetFlagString
templateFile , _ := cmd . Flags ( ) . GetString ( "template" )
2015-01-12 23:30:52 +00:00
if len ( outputFormat ) == 0 && len ( templateFile ) != 0 {
outputFormat = "template"
}
2015-12-02 18:40:07 +00:00
templateFormat := [ ] string {
"go-template=" , "go-template-file=" , "jsonpath=" , "jsonpath-file=" , "custom-columns=" , "custom-columns-file=" ,
}
2015-08-21 13:09:41 +00:00
for _ , format := range templateFormat {
if strings . HasPrefix ( outputFormat , format ) {
templateFile = outputFormat [ len ( format ) : ]
outputFormat = format [ : len ( format ) - 1 ]
}
}
2017-01-05 20:29:44 +00:00
// this function may be invoked by a command that did not call AddPrinterFlags first, so we need
// to be safe about how we access the allow-missing-template-keys flag
allowMissingTemplateKeys := false
if cmd . Flags ( ) . Lookup ( "allow-missing-template-keys" ) != nil {
allowMissingTemplateKeys = GetFlagBool ( cmd , "allow-missing-template-keys" )
}
2017-02-19 22:39:43 +00:00
printer , generic , err := printers . GetStandardPrinter (
outputFormat , templateFile , GetFlagBool ( cmd , "no-headers" ) , allowMissingTemplateKeys ,
mapper , typer , decoders ,
)
2015-08-08 06:04:25 +00:00
if err != nil {
return nil , generic , err
}
return maybeWrapSortingPrinter ( cmd , printer ) , generic , nil
}
2016-12-08 20:26:37 +00:00
// PrintResourceInfoForCommand receives a *cobra.Command and a *resource.Info and
// attempts to print an info object based on the specified output format. If the
// object passed is non-generic, it attempts to print the object using a HumanReadablePrinter.
// Requires that printer flags have been added to cmd (see AddPrinterFlags).
func PrintResourceInfoForCommand ( cmd * cobra . Command , info * resource . Info , f Factory , out io . Writer ) error {
2017-02-19 22:39:43 +00:00
printer , generic , err := f . PrinterForCommand ( cmd )
2016-12-08 20:26:37 +00:00
if err != nil {
return err
}
if ! generic || printer == nil {
printer , err = f . PrinterForMapping ( cmd , nil , false )
if err != nil {
return err
}
}
return printer . PrintObj ( info . Object , out )
}
2017-02-19 22:39:43 +00:00
func maybeWrapSortingPrinter ( cmd * cobra . Command , printer printers . ResourcePrinter ) printers . ResourcePrinter {
2015-09-24 16:53:33 +00:00
sorting , err := cmd . Flags ( ) . GetString ( "sort-by" )
if err != nil {
// error can happen on missing flag or bad flag type. In either case, this command didn't intent to sort
return printer
}
2015-08-08 06:04:25 +00:00
if len ( sorting ) != 0 {
return & kubectl . SortingPrinter {
Delegate : printer ,
SortField : fmt . Sprintf ( "{%s}" , sorting ) ,
}
}
return printer
2015-01-12 23:30:52 +00:00
}