Merge pull request #111096 from brianpursley/api-resources-categories

Add categories to kubectl api-resources wide output and add --categories flag

Kubernetes-commit: afbce897a9c7956fd3219b64abacf46fa5d3e6aa
This commit is contained in:
Kubernetes Publisher 2022-10-14 14:19:07 -07:00
commit 5592f5001b
2 changed files with 39 additions and 7 deletions

View File

@ -66,6 +66,7 @@ type APIResourceOptions struct {
Verbs []string Verbs []string
NoHeaders bool NoHeaders bool
Cached bool Cached bool
Categories []string
genericclioptions.IOStreams genericclioptions.IOStreams
} }
@ -109,6 +110,7 @@ func NewCmdAPIResources(f cmdutil.Factory, ioStreams genericclioptions.IOStreams
cmd.Flags().StringSliceVar(&o.Verbs, "verbs", o.Verbs, "Limit to resources that support the specified verbs.") cmd.Flags().StringSliceVar(&o.Verbs, "verbs", o.Verbs, "Limit to resources that support the specified verbs.")
cmd.Flags().StringVar(&o.SortBy, "sort-by", o.SortBy, "If non-empty, sort list of resources using specified field. The field can be either 'name' or 'kind'.") cmd.Flags().StringVar(&o.SortBy, "sort-by", o.SortBy, "If non-empty, sort list of resources using specified field. The field can be either 'name' or 'kind'.")
cmd.Flags().BoolVar(&o.Cached, "cached", o.Cached, "Use the cached list of resources if available.") cmd.Flags().BoolVar(&o.Cached, "cached", o.Cached, "Use the cached list of resources if available.")
cmd.Flags().StringSliceVar(&o.Categories, "categories", o.Categories, "Limit to resources that belong the the specified categories.")
return cmd return cmd
} }
@ -185,6 +187,10 @@ func (o *APIResourceOptions) RunAPIResources(cmd *cobra.Command, f cmdutil.Facto
if len(o.Verbs) > 0 && !sets.NewString(resource.Verbs...).HasAll(o.Verbs...) { if len(o.Verbs) > 0 && !sets.NewString(resource.Verbs...).HasAll(o.Verbs...) {
continue continue
} }
// filter to resources that belong to the specified categories
if len(o.Categories) > 0 && !sets.NewString(resource.Categories...).HasAll(o.Categories...) {
continue
}
resources = append(resources, groupResource{ resources = append(resources, groupResource{
APIGroup: gv.Group, APIGroup: gv.Group,
APIGroupVersion: gv.String(), APIGroupVersion: gv.String(),
@ -211,13 +217,14 @@ func (o *APIResourceOptions) RunAPIResources(cmd *cobra.Command, f cmdutil.Facto
errs = append(errs, err) errs = append(errs, err)
} }
case "wide": case "wide":
if _, err := fmt.Fprintf(w, "%s\t%s\t%s\t%v\t%s\t%v\n", if _, err := fmt.Fprintf(w, "%s\t%s\t%s\t%v\t%s\t%v\t%v\n",
r.APIResource.Name, r.APIResource.Name,
strings.Join(r.APIResource.ShortNames, ","), strings.Join(r.APIResource.ShortNames, ","),
r.APIGroupVersion, r.APIGroupVersion,
r.APIResource.Namespaced, r.APIResource.Namespaced,
r.APIResource.Kind, r.APIResource.Kind,
r.APIResource.Verbs); err != nil { strings.Join(r.APIResource.Verbs, ","),
strings.Join(r.APIResource.Categories, ",")); err != nil {
errs = append(errs, err) errs = append(errs, err)
} }
case "": case "":
@ -241,7 +248,7 @@ func (o *APIResourceOptions) RunAPIResources(cmd *cobra.Command, f cmdutil.Facto
func printContextHeaders(out io.Writer, output string) error { func printContextHeaders(out io.Writer, output string) error {
columnNames := []string{"NAME", "SHORTNAMES", "APIVERSION", "NAMESPACED", "KIND"} columnNames := []string{"NAME", "SHORTNAMES", "APIVERSION", "NAMESPACED", "KIND"}
if output == "wide" { if output == "wide" {
columnNames = append(columnNames, "VERBS") columnNames = append(columnNames, "VERBS", "CATEGORIES")
} }
_, err := fmt.Fprintf(out, "%s\n", strings.Join(columnNames, "\t")) _, err := fmt.Fprintf(out, "%s\n", strings.Join(columnNames, "\t"))
return err return err

View File

@ -110,6 +110,7 @@ func TestAPIResourcesRun(t *testing.T) {
Kind: "Foo", Kind: "Foo",
Verbs: []string{"get", "list"}, Verbs: []string{"get", "list"},
ShortNames: []string{"f", "fo"}, ShortNames: []string{"f", "fo"},
Categories: []string{"some-category"},
}, },
{ {
Name: "bars", Name: "bars",
@ -117,6 +118,7 @@ func TestAPIResourcesRun(t *testing.T) {
Kind: "Bar", Kind: "Bar",
Verbs: []string{"get", "list", "create"}, Verbs: []string{"get", "list", "create"},
ShortNames: []string{}, ShortNames: []string{},
Categories: []string{},
}, },
}, },
}, },
@ -129,6 +131,7 @@ func TestAPIResourcesRun(t *testing.T) {
Kind: "Baz", Kind: "Baz",
Verbs: []string{"get", "list", "create", "delete"}, Verbs: []string{"get", "list", "create", "delete"},
ShortNames: []string{"b"}, ShortNames: []string{"b"},
Categories: []string{"some-category", "another-category"},
}, },
{ {
Name: "NoVerbs", Name: "NoVerbs",
@ -136,6 +139,7 @@ func TestAPIResourcesRun(t *testing.T) {
Kind: "NoVerbs", Kind: "NoVerbs",
Verbs: []string{}, Verbs: []string{},
ShortNames: []string{"b"}, ShortNames: []string{"b"},
Categories: []string{},
}, },
}, },
}, },
@ -189,10 +193,10 @@ bazzes b somegroup/v1 true Baz
commandSetupFn: func(cmd *cobra.Command) { commandSetupFn: func(cmd *cobra.Command) {
cmd.Flags().Set("output", "wide") cmd.Flags().Set("output", "wide")
}, },
expectedOutput: `NAME SHORTNAMES APIVERSION NAMESPACED KIND VERBS expectedOutput: `NAME SHORTNAMES APIVERSION NAMESPACED KIND VERBS CATEGORIES
bars v1 true Bar [get list create] bars v1 true Bar get,list,create
foos f,fo v1 false Foo [get list] foos f,fo v1 false Foo get,list some-category
bazzes b somegroup/v1 true Baz [get list create delete] bazzes b somegroup/v1 true Baz get,list,create,delete some-category,another-category
`, `,
expectedInvalidations: 1, expectedInvalidations: 1,
}, },
@ -236,6 +240,27 @@ bazzes b somegroup/v1 true Baz
}, },
expectedOutput: `NAME SHORTNAMES APIVERSION NAMESPACED KIND expectedOutput: `NAME SHORTNAMES APIVERSION NAMESPACED KIND
bazzes b somegroup/v1 true Baz bazzes b somegroup/v1 true Baz
`,
expectedInvalidations: 1,
},
{
name: "single category",
commandSetupFn: func(cmd *cobra.Command) {
cmd.Flags().Set("categories", "some-category")
},
expectedOutput: `NAME SHORTNAMES APIVERSION NAMESPACED KIND
foos f,fo v1 false Foo
bazzes b somegroup/v1 true Baz
`,
expectedInvalidations: 1,
},
{
name: "multiple categories",
commandSetupFn: func(cmd *cobra.Command) {
cmd.Flags().Set("categories", "some-category,another-category")
},
expectedOutput: `NAME SHORTNAMES APIVERSION NAMESPACED KIND
bazzes b somegroup/v1 true Baz
`, `,
expectedInvalidations: 1, expectedInvalidations: 1,
}, },