2019-01-12 04:58:27 +00:00
/ *
Copyright 2018 The Kubernetes Authors .
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 .
* /
package get
import (
2021-07-02 08:43:15 +00:00
"fmt"
2019-08-30 18:33:25 +00:00
"strings"
2019-01-12 04:58:27 +00:00
"github.com/spf13/cobra"
2019-08-30 18:33:25 +00:00
"k8s.io/apimachinery/pkg/api/meta"
2019-01-12 04:58:27 +00:00
"k8s.io/apimachinery/pkg/runtime/schema"
"k8s.io/cli-runtime/pkg/genericclioptions"
2019-04-07 17:07:55 +00:00
"k8s.io/cli-runtime/pkg/printers"
2019-09-27 21:51:53 +00:00
"k8s.io/kubectl/pkg/util/openapi"
2019-01-12 04:58:27 +00:00
)
// PrintFlags composes common printer flag structs
// used in the Get command.
type PrintFlags struct {
JSONYamlPrintFlags * genericclioptions . JSONYamlPrintFlags
NamePrintFlags * genericclioptions . NamePrintFlags
CustomColumnsFlags * CustomColumnsPrintFlags
HumanReadableFlags * HumanPrintFlags
TemplateFlags * genericclioptions . KubeTemplatePrintFlags
NoHeaders * bool
OutputFormat * string
}
// SetKind sets the Kind option of humanreadable flags
func ( f * PrintFlags ) SetKind ( kind schema . GroupKind ) {
f . HumanReadableFlags . SetKind ( kind )
}
// EnsureWithNamespace ensures that humanreadable flags return
// a printer capable of printing with a "namespace" column.
func ( f * PrintFlags ) EnsureWithNamespace ( ) error {
return f . HumanReadableFlags . EnsureWithNamespace ( )
}
// EnsureWithKind ensures that humanreadable flags return
// a printer capable of including resource kinds.
func ( f * PrintFlags ) EnsureWithKind ( ) error {
return f . HumanReadableFlags . EnsureWithKind ( )
}
// Copy returns a copy of PrintFlags for mutation
func ( f * PrintFlags ) Copy ( ) PrintFlags {
printFlags := * f
return printFlags
}
2019-04-07 17:07:55 +00:00
// AllowedFormats is the list of formats in which data can be displayed
2019-01-12 04:58:27 +00:00
func ( f * PrintFlags ) AllowedFormats ( ) [ ] string {
formats := f . JSONYamlPrintFlags . AllowedFormats ( )
formats = append ( formats , f . NamePrintFlags . AllowedFormats ( ) ... )
formats = append ( formats , f . TemplateFlags . AllowedFormats ( ) ... )
formats = append ( formats , f . CustomColumnsFlags . AllowedFormats ( ) ... )
formats = append ( formats , f . HumanReadableFlags . AllowedFormats ( ) ... )
return formats
}
2019-08-30 18:33:25 +00:00
// UseOpenAPIColumns modifies the output format, as well as the
// "allowMissingKeys" option for template printers, to values
// defined in the OpenAPI schema of a resource.
func ( f * PrintFlags ) UseOpenAPIColumns ( api openapi . Resources , mapping * meta . RESTMapping ) error {
// Found openapi metadata for this resource
schema := api . LookupResource ( mapping . GroupVersionKind )
if schema == nil {
// Schema not found, return empty columns
return nil
}
columns , found := openapi . GetPrintColumns ( schema . GetExtensions ( ) )
if ! found {
// Extension not found, return empty columns
return nil
}
parts := strings . SplitN ( columns , "=" , 2 )
if len ( parts ) < 2 {
return nil
}
allowMissingKeys := true
f . OutputFormat = & parts [ 0 ]
f . TemplateFlags . TemplateArgument = & parts [ 1 ]
f . TemplateFlags . AllowMissingKeys = & allowMissingKeys
return nil
}
2019-01-12 04:58:27 +00:00
// ToPrinter attempts to find a composed set of PrintFlags suitable for
// returning a printer based on current flag values.
func ( f * PrintFlags ) ToPrinter ( ) ( printers . ResourcePrinter , error ) {
outputFormat := ""
if f . OutputFormat != nil {
outputFormat = * f . OutputFormat
}
noHeaders := false
if f . NoHeaders != nil {
noHeaders = * f . NoHeaders
}
f . HumanReadableFlags . NoHeaders = noHeaders
f . CustomColumnsFlags . NoHeaders = noHeaders
// for "get.go" we want to support a --template argument given, even when no --output format is provided
if f . TemplateFlags . TemplateArgument != nil && len ( * f . TemplateFlags . TemplateArgument ) > 0 && len ( outputFormat ) == 0 {
outputFormat = "go-template"
}
if p , err := f . TemplateFlags . ToPrinter ( outputFormat ) ; ! genericclioptions . IsNoCompatiblePrinterError ( err ) {
return p , err
}
if f . TemplateFlags . TemplateArgument != nil {
f . CustomColumnsFlags . TemplateArgument = * f . TemplateFlags . TemplateArgument
}
if p , err := f . JSONYamlPrintFlags . ToPrinter ( outputFormat ) ; ! genericclioptions . IsNoCompatiblePrinterError ( err ) {
return p , err
}
if p , err := f . HumanReadableFlags . ToPrinter ( outputFormat ) ; ! genericclioptions . IsNoCompatiblePrinterError ( err ) {
return p , err
}
if p , err := f . CustomColumnsFlags . ToPrinter ( outputFormat ) ; ! genericclioptions . IsNoCompatiblePrinterError ( err ) {
return p , err
}
if p , err := f . NamePrintFlags . ToPrinter ( outputFormat ) ; ! genericclioptions . IsNoCompatiblePrinterError ( err ) {
return p , err
}
return nil , genericclioptions . NoCompatiblePrinterError { OutputFormat : & outputFormat , AllowedFormats : f . AllowedFormats ( ) }
}
// AddFlags receives a *cobra.Command reference and binds
// flags related to humanreadable and template printing.
func ( f * PrintFlags ) AddFlags ( cmd * cobra . Command ) {
f . JSONYamlPrintFlags . AddFlags ( cmd )
f . NamePrintFlags . AddFlags ( cmd )
f . TemplateFlags . AddFlags ( cmd )
f . HumanReadableFlags . AddFlags ( cmd )
f . CustomColumnsFlags . AddFlags ( cmd )
if f . OutputFormat != nil {
2021-07-02 08:43:15 +00:00
cmd . Flags ( ) . StringVarP ( f . OutputFormat , "output" , "o" , * f . OutputFormat , fmt . Sprintf ( "Output format. One of: %s See custom columns [https://kubernetes.io/docs/reference/kubectl/overview/#custom-columns], golang template [http://golang.org/pkg/text/template/#pkg-overview] and jsonpath template [https://kubernetes.io/docs/reference/kubectl/jsonpath/]." , strings . Join ( f . AllowedFormats ( ) , "|" ) ) )
2019-01-12 04:58:27 +00:00
}
if f . NoHeaders != nil {
cmd . Flags ( ) . BoolVar ( f . NoHeaders , "no-headers" , * f . NoHeaders , "When using the default or custom-column output format, don't print headers (default print headers)." )
}
}
// NewGetPrintFlags returns flags associated with humanreadable,
// template, and "name" printing, with default values set.
func NewGetPrintFlags ( ) * PrintFlags {
outputFormat := ""
noHeaders := false
return & PrintFlags {
OutputFormat : & outputFormat ,
NoHeaders : & noHeaders ,
JSONYamlPrintFlags : genericclioptions . NewJSONYamlPrintFlags ( ) ,
NamePrintFlags : genericclioptions . NewNamePrintFlags ( "" ) ,
TemplateFlags : genericclioptions . NewKubeTemplatePrintFlags ( ) ,
HumanReadableFlags : NewHumanPrintFlags ( ) ,
CustomColumnsFlags : NewCustomColumnsPrintFlags ( ) ,
}
}