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
2015-08-05 22:03:47 +00:00
"k8s.io/kubernetes/pkg/api/meta"
2015-11-13 21:20:54 +00:00
"k8s.io/kubernetes/pkg/api/unversioned"
2015-08-05 22:03:47 +00:00
"k8s.io/kubernetes/pkg/kubectl"
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 ) {
2016-07-05 09:23:32 +00:00
AddOutputFlags ( cmd )
2016-03-03 01:35:55 +00:00
cmd . Flags ( ) . String ( "output-version" , "" , "Output the formatted object with the given group version (for ex: 'extensions/v1beta1')." )
2016-07-05 09:23:32 +00:00
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)." )
}
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]." )
2016-07-05 09:23:32 +00:00
}
// AddNoHeadersFlags adds no-headers flags to a command.
func AddNoHeadersFlags ( cmd * cobra . Command ) {
2016-06-01 12:50:29 +00:00
cmd . Flags ( ) . Bool ( "no-headers" , false , "When using the default or custom-column output format, don't 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
func PrintSuccess ( mapper meta . RESTMapper , shortOutput bool , out io . Writer , resource string , name string , operation string ) {
resource , _ = mapper . ResourceSingularizer ( resource )
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 {
fmt . Fprintf ( out , "%s \"%s\" %s\n" , resource , name , operation )
} else {
fmt . Fprintf ( out , "\"%s\" %s\n" , name , operation )
}
}
}
// 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-02-05 00:14:48 +00:00
// OutputVersion returns the preferred output version for generic content (JSON, YAML, or templates)
2015-12-01 16:52:11 +00:00
// defaultVersion is never mutated. Nil simply allows clean passing in common usage from client.Config
func OutputVersion ( cmd * cobra . Command , defaultVersion * unversioned . GroupVersion ) ( unversioned . GroupVersion , error ) {
outputVersionString := GetFlagString ( cmd , "output-version" )
if len ( outputVersionString ) == 0 {
if defaultVersion == nil {
return unversioned . GroupVersion { } , nil
}
2015-01-12 23:30:52 +00:00
2015-12-01 16:52:11 +00:00
return * defaultVersion , nil
2015-11-13 21:20:54 +00:00
}
2015-12-01 16:52:11 +00:00
return unversioned . ParseGroupVersion ( outputVersionString )
2015-11-13 21:20:54 +00:00
}
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).
func PrinterForCommand ( cmd * cobra . Command ) ( kubectl . ResourcePrinter , bool , error ) {
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 ]
}
}
2016-06-01 12:50:29 +00:00
printer , generic , err := kubectl . GetPrinter ( outputFormat , templateFile , GetFlagBool ( cmd , "no-headers" ) )
2015-08-08 06:04:25 +00:00
if err != nil {
return nil , generic , err
}
return maybeWrapSortingPrinter ( cmd , printer ) , generic , nil
}
func maybeWrapSortingPrinter ( cmd * cobra . Command , printer kubectl . ResourcePrinter ) kubectl . 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
}