From 9154db0542765ca8a1b3583b682901ff18cf5953 Mon Sep 17 00:00:00 2001 From: Andy Goldstein Date: Wed, 2 Nov 2016 10:33:07 -0400 Subject: [PATCH] Update lister-gen - Remove "zz_generated." prefix from generated lister file names - Add support for expansion interfaces --- cmd/libs/go2idl/lister-gen/generators/BUILD | 1 + .../go2idl/lister-gen/generators/expansion.go | 65 +++++++++++++++++++ .../go2idl/lister-gen/generators/lister.go | 33 ++++++++-- cmd/libs/go2idl/lister-gen/main.go | 9 ++- 4 files changed, 96 insertions(+), 12 deletions(-) create mode 100644 cmd/libs/go2idl/lister-gen/generators/expansion.go diff --git a/cmd/libs/go2idl/lister-gen/generators/BUILD b/cmd/libs/go2idl/lister-gen/generators/BUILD index 1659606a4fa..560651bdedd 100644 --- a/cmd/libs/go2idl/lister-gen/generators/BUILD +++ b/cmd/libs/go2idl/lister-gen/generators/BUILD @@ -13,6 +13,7 @@ load( go_library( name = "go_default_library", srcs = [ + "expansion.go", "lister.go", "tags.go", ], diff --git a/cmd/libs/go2idl/lister-gen/generators/expansion.go b/cmd/libs/go2idl/lister-gen/generators/expansion.go new file mode 100644 index 00000000000..de21f84af56 --- /dev/null +++ b/cmd/libs/go2idl/lister-gen/generators/expansion.go @@ -0,0 +1,65 @@ +/* +Copyright 2016 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 generators + +import ( + "io" + "os" + "path/filepath" + "strings" + + "k8s.io/gengo/generator" + "k8s.io/gengo/types" +) + +// expansionGenerator produces a file for a expansion interfaces. +type expansionGenerator struct { + generator.DefaultGen + packagePath string + types []*types.Type +} + +// We only want to call GenerateType() once per group. +func (g *expansionGenerator) Filter(c *generator.Context, t *types.Type) bool { + return t == g.types[0] +} + +func (g *expansionGenerator) GenerateType(c *generator.Context, t *types.Type, w io.Writer) error { + sw := generator.NewSnippetWriter(w, c, "$", "$") + for _, t := range g.types { + if _, err := os.Stat(filepath.Join(g.packagePath, strings.ToLower(t.Name.Name+"_expansion.go"))); os.IsNotExist(err) { + sw.Do(expansionInterfaceTemplate, t) + namespaced := !extractBoolTagOrDie("nonNamespaced", t.SecondClosestCommentLines) + if namespaced { + sw.Do(namespacedExpansionInterfaceTemplate, t) + } + } + } + return sw.Error() +} + +var expansionInterfaceTemplate = ` +// $.|public$ListerExpansion allows custom methods to be added to +// $.|public$Lister. +type $.|public$ListerExpansion interface {} +` + +var namespacedExpansionInterfaceTemplate = ` +// $.|public$NamespaceListerExpansion allows custom methods to be added to +// $.|public$NamespaeLister. +type $.|public$NamespaceListerExpansion interface {} +` diff --git a/cmd/libs/go2idl/lister-gen/generators/lister.go b/cmd/libs/go2idl/lister-gen/generators/lister.go index 47d8cb931b6..1685094dbf6 100644 --- a/cmd/libs/go2idl/lister-gen/generators/lister.go +++ b/cmd/libs/go2idl/lister-gen/generators/lister.go @@ -114,19 +114,35 @@ func Packages(context *generator.Context, arguments *args.GeneratorArgs) generat internalGVPkg = strings.Join(parts[0:len(parts)-1], "/") } + var typesToGenerate []*types.Type + for _, t := range p.Types { + // filter out types which dont have genclient=true. + if extractBoolTagOrDie("genclient", t.SecondClosestCommentLines) == false { + continue + } + typesToGenerate = append(typesToGenerate, t) + } + orderer := namer.Orderer{Namer: namer.NewPrivateNamer(0)} + typesToGenerate = orderer.OrderTypes(typesToGenerate) + + packagePath := filepath.Join(arguments.OutputPackagePath, strings.ToLower(gv.Group.NonEmpty()), strings.ToLower(gv.Version.NonEmpty())) packageList = append(packageList, &generator.DefaultPackage{ PackageName: strings.ToLower(gv.Version.NonEmpty()), - PackagePath: filepath.Join(arguments.OutputPackagePath, strings.ToLower(gv.Group.NonEmpty()), strings.ToLower(gv.Version.NonEmpty())), + PackagePath: packagePath, HeaderText: boilerplate, GeneratorFunc: func(c *generator.Context) (generators []generator.Generator) { - for _, t := range p.Types { - // filter out types which dont have genclient=true. - if extractBoolTagOrDie("genclient", t.SecondClosestCommentLines) == false { - continue - } + generators = append(generators, &expansionGenerator{ + DefaultGen: generator.DefaultGen{ + OptionalName: "expansion_generated", + }, + packagePath: filepath.Join(arguments.OutputBase, packagePath), + types: typesToGenerate, + }) + + for _, t := range typesToGenerate { generators = append(generators, &listerGenerator{ DefaultGen: generator.DefaultGen{ - OptionalName: arguments.OutputFileBaseName + "." + strings.ToLower(t.Name.Name), + OptionalName: strings.ToLower(t.Name.Name), }, outputPackage: arguments.OutputPackagePath, groupVersion: gv, @@ -248,6 +264,7 @@ type $.type|public$Lister interface { List(selector labels.Selector) (ret []*$.type|raw$, err error) // $.type|publicPlural$ returns an object that can list and get $.type|publicPlural$. $.type|publicPlural$(namespace string) $.type|public$NamespaceLister + $.type|public$ListerExpansion } ` @@ -258,6 +275,7 @@ type $.type|public$Lister interface { List(selector labels.Selector) (ret []*$.type|raw$, err error) // Get retrieves the $.type|public$ from the index for a given name. Get(name string) (*$.type|raw$, error) + $.type|public$ListerExpansion } ` @@ -314,6 +332,7 @@ type $.type|public$NamespaceLister interface { List(selector labels.Selector) (ret []*$.type|raw$, err error) // Get retrieves the $.type|public$ from the indexer for a given namespace and name. Get(name string) (*$.type|raw$, error) + $.type|public$NamespaceListerExpansion } ` diff --git a/cmd/libs/go2idl/lister-gen/main.go b/cmd/libs/go2idl/lister-gen/main.go index 8bddb161d69..88ba462acd7 100644 --- a/cmd/libs/go2idl/lister-gen/main.go +++ b/cmd/libs/go2idl/lister-gen/main.go @@ -28,11 +28,10 @@ import ( func main() { arguments := &args.GeneratorArgs{ - OutputBase: args.DefaultSourceTree(), - GoHeaderFilePath: filepath.Join(args.DefaultSourceTree(), "k8s.io/kubernetes/hack/boilerplate/boilerplate.go.txt"), - GeneratedBuildTag: "ignore_autogenerated", - OutputFileBaseName: "zz_generated", - OutputPackagePath: "k8s.io/kubernetes/pkg/client/listers", + OutputBase: args.DefaultSourceTree(), + GoHeaderFilePath: filepath.Join(args.DefaultSourceTree(), "k8s.io/kubernetes/hack/boilerplate/boilerplate.go.txt"), + GeneratedBuildTag: "ignore_autogenerated", + OutputPackagePath: "k8s.io/kubernetes/pkg/client/listers", } arguments.AddFlags(pflag.CommandLine)