diff --git a/staging/src/k8s.io/kubectl/pkg/explain/v2/explain.go b/staging/src/k8s.io/kubectl/pkg/explain/v2/explain.go index 37a067fc7c1..9bc85f65312 100644 --- a/staging/src/k8s.io/kubectl/pkg/explain/v2/explain.go +++ b/staging/src/k8s.io/kubectl/pkg/explain/v2/explain.go @@ -37,8 +37,13 @@ func PrintModelDescription( recursive bool, outputFormat string, ) error { + generator := NewGenerator() + if err := registerBuiltinTemplates(generator); err != nil { + return fmt.Errorf("error parsing builtin templates. Please file a bug on GitHub: %w", err) + } + return printModelDescriptionWithGenerator( - NewGenerator(), fieldsPath, w, client, gvr, recursive, outputFormat) + generator, fieldsPath, w, client, gvr, recursive, outputFormat) } // Factored out for testability diff --git a/staging/src/k8s.io/kubectl/pkg/explain/v2/template.go b/staging/src/k8s.io/kubectl/pkg/explain/v2/template.go new file mode 100644 index 00000000000..45b1762eb7d --- /dev/null +++ b/staging/src/k8s.io/kubectl/pkg/explain/v2/template.go @@ -0,0 +1,50 @@ +/* +Copyright 2022 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 v2 + +import ( + "embed" + "path/filepath" + "strings" +) + +//go:embed templates/*.tmpl +var rawBuiltinTemplates embed.FS + +func registerBuiltinTemplates(gen Generator) error { + files, err := rawBuiltinTemplates.ReadDir("templates") + if err != nil { + return err + } + + for _, entry := range files { + contents, err := rawBuiltinTemplates.ReadFile("templates/" + entry.Name()) + if err != nil { + return err + } + + err = gen.AddTemplate( + strings.TrimSuffix(entry.Name(), filepath.Ext(entry.Name())), + string(contents)) + + if err != nil { + return err + } + } + + return nil +} diff --git a/staging/src/k8s.io/kubectl/pkg/explain/v2/template_test.go b/staging/src/k8s.io/kubectl/pkg/explain/v2/template_test.go new file mode 100644 index 00000000000..993dd38d7fb --- /dev/null +++ b/staging/src/k8s.io/kubectl/pkg/explain/v2/template_test.go @@ -0,0 +1,52 @@ +/* +Copyright 2022 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 v2 + +import ( + "os" + "path" + "strings" + "testing" +) + +// Ensure that the templates are embededd correctly. +func TestRegisterBuitinTemplates(t *testing.T) { + myGenerator := NewGenerator().(*generator) + err := registerBuiltinTemplates(myGenerator) + if err != nil { + t.Fatal(err) + } + // Show that generator now as a named template for each file in the `templates` + // directory. + files, err := os.ReadDir("templates") + if err != nil { + t.Fatal(err) + } + + for _, templateFile := range files { + name := templateFile.Name() + ext := path.Ext(name) + if ext != "tmpl" { + continue + } + + name = strings.TrimSuffix(name, ext) + if _, ok := myGenerator.templates[name]; !ok { + t.Fatalf("missing template: %v", name) + } + } +}