1
16
17 package get
18
19 import (
20 "fmt"
21 "strings"
22
23 "github.com/spf13/cobra"
24
25 "k8s.io/apimachinery/pkg/runtime/schema"
26 "k8s.io/cli-runtime/pkg/genericclioptions"
27 "k8s.io/cli-runtime/pkg/printers"
28 "k8s.io/kubectl/pkg/cmd/util"
29 )
30
31
32
33 type PrintFlags struct {
34 JSONYamlPrintFlags *genericclioptions.JSONYamlPrintFlags
35 NamePrintFlags *genericclioptions.NamePrintFlags
36 CustomColumnsFlags *CustomColumnsPrintFlags
37 HumanReadableFlags *HumanPrintFlags
38 TemplateFlags *genericclioptions.KubeTemplatePrintFlags
39
40 NoHeaders *bool
41 OutputFormat *string
42 }
43
44
45 func (f *PrintFlags) SetKind(kind schema.GroupKind) {
46 f.HumanReadableFlags.SetKind(kind)
47 }
48
49
50
51 func (f *PrintFlags) EnsureWithNamespace() error {
52 return f.HumanReadableFlags.EnsureWithNamespace()
53 }
54
55
56
57 func (f *PrintFlags) EnsureWithKind() error {
58 return f.HumanReadableFlags.EnsureWithKind()
59 }
60
61
62 func (f *PrintFlags) Copy() PrintFlags {
63 printFlags := *f
64 return printFlags
65 }
66
67
68 func (f *PrintFlags) AllowedFormats() []string {
69 formats := f.JSONYamlPrintFlags.AllowedFormats()
70 formats = append(formats, f.NamePrintFlags.AllowedFormats()...)
71 formats = append(formats, f.TemplateFlags.AllowedFormats()...)
72 formats = append(formats, f.CustomColumnsFlags.AllowedFormats()...)
73 formats = append(formats, f.HumanReadableFlags.AllowedFormats()...)
74 return formats
75 }
76
77
78
79 func (f *PrintFlags) ToPrinter() (printers.ResourcePrinter, error) {
80 outputFormat := ""
81 if f.OutputFormat != nil {
82 outputFormat = *f.OutputFormat
83 }
84
85 noHeaders := false
86 if f.NoHeaders != nil {
87 noHeaders = *f.NoHeaders
88 }
89 f.HumanReadableFlags.NoHeaders = noHeaders
90 f.CustomColumnsFlags.NoHeaders = noHeaders
91
92
93 if f.TemplateFlags.TemplateArgument != nil && len(*f.TemplateFlags.TemplateArgument) > 0 && len(outputFormat) == 0 {
94 outputFormat = "go-template"
95 }
96
97 if p, err := f.TemplateFlags.ToPrinter(outputFormat); !genericclioptions.IsNoCompatiblePrinterError(err) {
98 return p, err
99 }
100
101 if f.TemplateFlags.TemplateArgument != nil {
102 f.CustomColumnsFlags.TemplateArgument = *f.TemplateFlags.TemplateArgument
103 }
104
105 if p, err := f.JSONYamlPrintFlags.ToPrinter(outputFormat); !genericclioptions.IsNoCompatiblePrinterError(err) {
106 return p, err
107 }
108
109 if p, err := f.HumanReadableFlags.ToPrinter(outputFormat); !genericclioptions.IsNoCompatiblePrinterError(err) {
110 return p, err
111 }
112
113 if p, err := f.CustomColumnsFlags.ToPrinter(outputFormat); !genericclioptions.IsNoCompatiblePrinterError(err) {
114 return p, err
115 }
116
117 if p, err := f.NamePrintFlags.ToPrinter(outputFormat); !genericclioptions.IsNoCompatiblePrinterError(err) {
118 return p, err
119 }
120
121 return nil, genericclioptions.NoCompatiblePrinterError{OutputFormat: &outputFormat, AllowedFormats: f.AllowedFormats()}
122 }
123
124
125
126 func (f *PrintFlags) AddFlags(cmd *cobra.Command) {
127 f.JSONYamlPrintFlags.AddFlags(cmd)
128 f.NamePrintFlags.AddFlags(cmd)
129 f.TemplateFlags.AddFlags(cmd)
130 f.HumanReadableFlags.AddFlags(cmd)
131 f.CustomColumnsFlags.AddFlags(cmd)
132
133 if f.OutputFormat != nil {
134 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/#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(), ", ")))
135 util.CheckErr(cmd.RegisterFlagCompletionFunc(
136 "output",
137 func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) {
138 var comps []string
139 for _, format := range f.AllowedFormats() {
140 if strings.HasPrefix(format, toComplete) {
141 comps = append(comps, format)
142 }
143 }
144 return comps, cobra.ShellCompDirectiveNoFileComp
145 },
146 ))
147 }
148 if f.NoHeaders != nil {
149 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).")
150 }
151 }
152
153
154
155 func NewGetPrintFlags() *PrintFlags {
156 outputFormat := ""
157 noHeaders := false
158
159 return &PrintFlags{
160 OutputFormat: &outputFormat,
161 NoHeaders: &noHeaders,
162
163 JSONYamlPrintFlags: genericclioptions.NewJSONYamlPrintFlags(),
164 NamePrintFlags: genericclioptions.NewNamePrintFlags(""),
165 TemplateFlags: genericclioptions.NewKubeTemplatePrintFlags(),
166
167 HumanReadableFlags: NewHumanPrintFlags(),
168 CustomColumnsFlags: NewCustomColumnsPrintFlags(),
169 }
170 }
171
View as plain text