From a62e6310cb78d028882a581471ffa74f0ad0b77a Mon Sep 17 00:00:00 2001 From: "Dr. Stefan Schimanski" Date: Wed, 1 Nov 2017 18:33:37 +0100 Subject: [PATCH] code-gen: allow overlapping prefixes in GroupNames --- .../cmd/client-gen/args/gvpackages.go | 5 +- .../cmd/client-gen/args/gvpackages_test.go | 10 +-- .../client-gen/generators/client_generator.go | 39 ++++++++---- .../generators/fake/fake_client_generator.go | 13 ++-- .../fake/generator_fake_for_clientset.go | 37 ++++++----- .../fake/generator_fake_for_group.go | 16 ++--- .../fake/generator_fake_for_type.go | 8 ++- .../generators/generator_for_clientset.go | 31 +++++----- .../generators/generator_for_group.go | 37 ++++++----- .../generators/generator_for_type.go | 8 ++- .../generators/scheme/generator_for_scheme.go | 6 +- .../cmd/client-gen/types/helpers.go | 17 ++--- .../cmd/client-gen/types/types.go | 14 +++-- .../cmd/informer-gen/generators/factory.go | 19 +++--- .../cmd/informer-gen/generators/generic.go | 23 ++++--- .../cmd/informer-gen/generators/informer.go | 7 ++- .../cmd/informer-gen/generators/packages.go | 62 ++++++++++--------- .../cmd/lister-gen/generators/lister.go | 3 +- 18 files changed, 206 insertions(+), 149 deletions(-) diff --git a/staging/src/k8s.io/code-generator/cmd/client-gen/args/gvpackages.go b/staging/src/k8s.io/code-generator/cmd/client-gen/args/gvpackages.go index b7ecb337040..52d0176be7f 100644 --- a/staging/src/k8s.io/code-generator/cmd/client-gen/args/gvpackages.go +++ b/staging/src/k8s.io/code-generator/cmd/client-gen/args/gvpackages.go @@ -91,8 +91,9 @@ func (s *gvPackagesValue) set(vs []string) error { seenGroups[gv.Group].Versions = append(group.Versions, gv.Version) } else { seenGroups[gv.Group] = &types.GroupVersions{ - Group: gv.Group, - Versions: []types.Version{gv.Version}, + PackageName: gv.Group.NonEmpty(), + Group: gv.Group, + Versions: []types.Version{gv.Version}, } } diff --git a/staging/src/k8s.io/code-generator/cmd/client-gen/args/gvpackages_test.go b/staging/src/k8s.io/code-generator/cmd/client-gen/args/gvpackages_test.go index c86065cd835..66142ba1e88 100644 --- a/staging/src/k8s.io/code-generator/cmd/client-gen/args/gvpackages_test.go +++ b/staging/src/k8s.io/code-generator/cmd/client-gen/args/gvpackages_test.go @@ -49,8 +49,8 @@ func TestGVPackageFlag(t *testing.T) { {Group: "foo", Version: "v1"}: "foo/v1", }, expectedGroups: []types.GroupVersions{ - {Group: types.Group("bar"), Versions: []types.Version{types.Version("v1"), types.Version("v2"), types.Version("")}}, - {Group: types.Group("foo"), Versions: []types.Version{types.Version("v1")}}, + {PackageName: "bar", Group: types.Group("bar"), Versions: []types.Version{types.Version("v1"), types.Version("v2"), types.Version("")}}, + {PackageName: "foo", Group: types.Group("foo"), Versions: []types.Version{types.Version("v1")}}, }, }, { @@ -63,8 +63,8 @@ func TestGVPackageFlag(t *testing.T) { {Group: "foo", Version: "v1"}: "foo/v1", }, expectedGroups: []types.GroupVersions{ - {Group: types.Group("bar"), Versions: []types.Version{types.Version("v1"), types.Version("v2"), types.Version("")}}, - {Group: types.Group("foo"), Versions: []types.Version{types.Version("v1")}}, + {PackageName: "bar", Group: types.Group("bar"), Versions: []types.Version{types.Version("v1"), types.Version("v2"), types.Version("")}}, + {PackageName: "foo", Group: types.Group("foo"), Versions: []types.Version{types.Version("v1")}}, }, }, { @@ -74,7 +74,7 @@ func TestGVPackageFlag(t *testing.T) { {Group: "api", Version: ""}: "../api", }, expectedGroups: []types.GroupVersions{ - {Group: types.Group("api"), Versions: []types.Version{types.Version("v1"), types.Version("")}}, + {PackageName: "core", Group: types.Group("api"), Versions: []types.Version{types.Version("v1"), types.Version("")}}, }, }, } diff --git a/staging/src/k8s.io/code-generator/cmd/client-gen/generators/client_generator.go b/staging/src/k8s.io/code-generator/cmd/client-gen/generators/client_generator.go index 4e22d06c4b1..f65ceff990e 100644 --- a/staging/src/k8s.io/code-generator/cmd/client-gen/generators/client_generator.go +++ b/staging/src/k8s.io/code-generator/cmd/client-gen/generators/client_generator.go @@ -103,8 +103,8 @@ func DefaultNameSystem() string { return "public" } -func packageForGroup(gv clientgentypes.GroupVersion, typeList []*types.Type, clientsetPackage string, apiPath string, srcTreePath string, inputPackage string, boilerplate []byte) generator.Package { - groupVersionClientPackage := strings.ToLower(filepath.Join(clientsetPackage, "typed", gv.Group.NonEmpty(), gv.Version.NonEmpty())) +func packageForGroup(gv clientgentypes.GroupVersion, typeList []*types.Type, clientsetPackage string, groupPackageName string, groupGoName string, apiPath string, srcTreePath string, inputPackage string, boilerplate []byte) generator.Package { + groupVersionClientPackage := strings.ToLower(filepath.Join(clientsetPackage, "typed", groupPackageName, gv.Version.NonEmpty())) return &generator.DefaultPackage{ PackageName: strings.ToLower(gv.Version.NonEmpty()), PackagePath: groupVersionClientPackage, @@ -130,6 +130,7 @@ func packageForGroup(gv clientgentypes.GroupVersion, typeList []*types.Type, cli clientsetPackage: clientsetPackage, group: gv.Group.NonEmpty(), version: gv.Version.String(), + groupGoName: groupGoName, typeToMatch: t, imports: generator.NewImportTracker(), }) @@ -137,13 +138,14 @@ func packageForGroup(gv clientgentypes.GroupVersion, typeList []*types.Type, cli generators = append(generators, &genGroup{ DefaultGen: generator.DefaultGen{ - OptionalName: gv.Group.NonEmpty() + "_client", + OptionalName: groupPackageName + "_client", }, outputPackage: groupVersionClientPackage, inputPackage: inputPackage, clientsetPackage: clientsetPackage, group: gv.Group.NonEmpty(), version: gv.Version.String(), + groupGoName: groupGoName, apiPath: apiPath, types: typeList, imports: generator.NewImportTracker(), @@ -166,7 +168,7 @@ func packageForGroup(gv clientgentypes.GroupVersion, typeList []*types.Type, cli } } -func packageForClientset(customArgs *clientgenargs.CustomArgs, clientsetPackage string, boilerplate []byte) generator.Package { +func packageForClientset(customArgs *clientgenargs.CustomArgs, clientsetPackage string, groupGoNames map[clientgentypes.GroupVersion]string, boilerplate []byte) generator.Package { return &generator.DefaultPackage{ PackageName: customArgs.ClientsetName, PackagePath: clientsetPackage, @@ -186,6 +188,7 @@ func packageForClientset(customArgs *clientgenargs.CustomArgs, clientsetPackage OptionalName: "clientset", }, groups: customArgs.Groups, + groupGoNames: groupGoNames, clientsetPackage: clientsetPackage, outputPackage: customArgs.ClientsetName, imports: generator.NewImportTracker(), @@ -245,6 +248,8 @@ NextGroup: // applyGroupOverrides applies group name overrides to each package, if applicable. If there is a // comment of the form "// +groupName=somegroup" or "// +groupName=somegroup.foo.bar.io", use the // first field (somegroup) as the name of the group when generating. +// +// If the first field of the groupName is not unique within the clientset, use "// +groupName=unique func applyGroupOverrides(universe types.Universe, customArgs *clientgenargs.CustomArgs) { // Create a map from "old GV" to "new GV" so we know what changes we need to make. changes := make(map[clientgentypes.GroupVersion]clientgentypes.GroupVersion) @@ -252,7 +257,7 @@ func applyGroupOverrides(universe types.Universe, customArgs *clientgenargs.Cust p := universe.Package(inputDir) if override := types.ExtractCommentTags("+", p.Comments)["groupName"]; override != nil { newGV := clientgentypes.GroupVersion{ - Group: clientgentypes.Group(strings.SplitN(override[0], ".", 2)[0]), + Group: clientgentypes.Group(override[0]), Version: gv.Version, } changes[gv] = newGV @@ -269,8 +274,9 @@ func applyGroupOverrides(universe types.Universe, customArgs *clientgenargs.Cust if newGV, ok := changes[gv]; ok { // There's an override, so use it. newGVS := clientgentypes.GroupVersions{ - Group: newGV.Group, - Versions: gvs.Versions, + PackageName: gv.Group.NonEmpty(), + Group: newGV.Group, + Versions: gvs.Versions, } newGroups = append(newGroups, newGVS) } else { @@ -310,9 +316,18 @@ func Packages(context *generator.Context, arguments *args.GeneratorArgs) generat applyGroupOverrides(context.Universe, customArgs) gvToTypes := map[clientgentypes.GroupVersion][]*types.Type{} + groupGoNames := make(map[clientgentypes.GroupVersion]string) for gv, inputDir := range customArgs.GroupVersionToInputPath { - // Package are indexed with the vendor prefix stripped p := context.Universe.Package(path.Vendorless(inputDir)) + + // If there's a comment of the form "// +groupGoName=SomeUniqueShortName", use that as + // the Go group identifier in CamelCase. It defaults + groupGoNames[gv] = namer.IC(strings.Split(gv.Group.NonEmpty(), ".")[0]) + if override := types.ExtractCommentTags("+", p.Comments)["groupGoName"]; override != nil { + groupGoNames[gv] = namer.IC(override[0]) + } + + // Package are indexed with the vendor prefix stripped for n, t := range p.Types { // filter out types which are not included in user specified overrides. typesOverride, ok := includedTypesOverrides[gv] @@ -344,10 +359,10 @@ func Packages(context *generator.Context, arguments *args.GeneratorArgs) generat var packageList []generator.Package clientsetPackage := filepath.Join(customArgs.ClientsetOutputPath, customArgs.ClientsetName) - packageList = append(packageList, packageForClientset(customArgs, clientsetPackage, boilerplate)) + packageList = append(packageList, packageForClientset(customArgs, clientsetPackage, groupGoNames, boilerplate)) packageList = append(packageList, packageForScheme(customArgs, clientsetPackage, arguments.OutputBase, boilerplate)) if customArgs.FakeClient { - packageList = append(packageList, fake.PackageForClientset(customArgs, clientsetPackage, boilerplate)) + packageList = append(packageList, fake.PackageForClientset(customArgs, clientsetPackage, groupGoNames, boilerplate)) } // If --clientset-only=true, we don't regenerate the individual typed clients. @@ -361,9 +376,9 @@ func Packages(context *generator.Context, arguments *args.GeneratorArgs) generat gv := clientgentypes.GroupVersion{Group: group.Group, Version: version} types := gvToTypes[gv] inputPath := customArgs.GroupVersionToInputPath[gv] - packageList = append(packageList, packageForGroup(gv, orderer.OrderTypes(types), clientsetPackage, customArgs.ClientsetAPIPath, arguments.OutputBase, inputPath, boilerplate)) + packageList = append(packageList, packageForGroup(gv, orderer.OrderTypes(types), clientsetPackage, group.PackageName, groupGoNames[gv], customArgs.ClientsetAPIPath, arguments.OutputBase, inputPath, boilerplate)) if customArgs.FakeClient { - packageList = append(packageList, fake.PackageForGroup(gv, orderer.OrderTypes(types), clientsetPackage, inputPath, boilerplate)) + packageList = append(packageList, fake.PackageForGroup(gv, orderer.OrderTypes(types), clientsetPackage, group.PackageName, groupGoNames[gv], inputPath, boilerplate)) } } } diff --git a/staging/src/k8s.io/code-generator/cmd/client-gen/generators/fake/fake_client_generator.go b/staging/src/k8s.io/code-generator/cmd/client-gen/generators/fake/fake_client_generator.go index 28935f41dc1..bd7d58ee354 100644 --- a/staging/src/k8s.io/code-generator/cmd/client-gen/generators/fake/fake_client_generator.go +++ b/staging/src/k8s.io/code-generator/cmd/client-gen/generators/fake/fake_client_generator.go @@ -29,10 +29,10 @@ import ( clientgentypes "k8s.io/code-generator/cmd/client-gen/types" ) -func PackageForGroup(gv clientgentypes.GroupVersion, typeList []*types.Type, clientsetPackage string, inputPackage string, boilerplate []byte) generator.Package { - outputPackage := strings.ToLower(filepath.Join(clientsetPackage, "typed", gv.Group.NonEmpty(), gv.Version.NonEmpty(), "fake")) +func PackageForGroup(gv clientgentypes.GroupVersion, typeList []*types.Type, clientsetPackage string, groupPackageName string, groupGoName string, inputPackage string, boilerplate []byte) generator.Package { + outputPackage := strings.ToLower(filepath.Join(clientsetPackage, "typed", groupPackageName, gv.Version.NonEmpty(), "fake")) // TODO: should make this a function, called by here and in client-generator.go - realClientPackage := filepath.Join(clientsetPackage, "typed", gv.Group.NonEmpty(), gv.Version.NonEmpty()) + realClientPackage := filepath.Join(clientsetPackage, "typed", groupPackageName, gv.Version.NonEmpty()) return &generator.DefaultPackage{ PackageName: "fake", PackagePath: outputPackage, @@ -58,6 +58,7 @@ func PackageForGroup(gv clientgentypes.GroupVersion, typeList []*types.Type, cli inputPackage: inputPackage, group: gv.Group.NonEmpty(), version: gv.Version.String(), + groupGoName: groupGoName, typeToMatch: t, imports: generator.NewImportTracker(), }) @@ -65,12 +66,13 @@ func PackageForGroup(gv clientgentypes.GroupVersion, typeList []*types.Type, cli generators = append(generators, &genFakeForGroup{ DefaultGen: generator.DefaultGen{ - OptionalName: "fake_" + gv.Group.NonEmpty() + "_client", + OptionalName: "fake_" + groupPackageName + "_client", }, outputPackage: outputPackage, realClientPackage: realClientPackage, group: gv.Group.NonEmpty(), version: gv.Version.String(), + groupGoName: groupGoName, types: typeList, imports: generator.NewImportTracker(), }) @@ -82,7 +84,7 @@ func PackageForGroup(gv clientgentypes.GroupVersion, typeList []*types.Type, cli } } -func PackageForClientset(customArgs *clientgenargs.CustomArgs, fakeClientsetPackage string, boilerplate []byte) generator.Package { +func PackageForClientset(customArgs *clientgenargs.CustomArgs, fakeClientsetPackage string, groupGoNames map[clientgentypes.GroupVersion]string, boilerplate []byte) generator.Package { return &generator.DefaultPackage{ // TODO: we'll generate fake clientset for different release in the future. // Package name and path are hard coded for now. @@ -104,6 +106,7 @@ func PackageForClientset(customArgs *clientgenargs.CustomArgs, fakeClientsetPack OptionalName: "clientset_generated", }, groups: customArgs.Groups, + groupGoNames: groupGoNames, fakeClientsetPackage: fakeClientsetPackage, outputPackage: "fake", imports: generator.NewImportTracker(), diff --git a/staging/src/k8s.io/code-generator/cmd/client-gen/generators/fake/generator_fake_for_clientset.go b/staging/src/k8s.io/code-generator/cmd/client-gen/generators/fake/generator_fake_for_clientset.go index c28c1378c24..aa1bc2226fa 100644 --- a/staging/src/k8s.io/code-generator/cmd/client-gen/generators/fake/generator_fake_for_clientset.go +++ b/staging/src/k8s.io/code-generator/cmd/client-gen/generators/fake/generator_fake_for_clientset.go @@ -32,6 +32,7 @@ import ( type genClientset struct { generator.DefaultGen groups []clientgentypes.GroupVersions + groupGoNames map[clientgentypes.GroupVersion]string fakeClientsetPackage string outputPackage string imports namer.ImportTracker @@ -59,11 +60,11 @@ func (g *genClientset) Imports(c *generator.Context) (imports []string) { imports = append(imports, g.imports.ImportLines()...) for _, group := range g.groups { for _, version := range group.Versions { - groupClientPackage := filepath.Join(g.fakeClientsetPackage, "typed", group.Group.NonEmpty(), version.NonEmpty()) + groupClientPackage := filepath.Join(g.fakeClientsetPackage, "typed", group.PackageName, version.NonEmpty()) fakeGroupClientPackage := filepath.Join(groupClientPackage, "fake") - imports = append(imports, strings.ToLower(fmt.Sprintf("%s%s \"%s\"", group.Group.NonEmpty(), version.NonEmpty(), groupClientPackage))) - imports = append(imports, strings.ToLower(fmt.Sprintf("fake%s%s \"%s\"", group.Group.NonEmpty(), version.NonEmpty(), fakeGroupClientPackage))) + imports = append(imports, strings.ToLower(fmt.Sprintf("%s%s \"%s\"", group.PackageName, version.NonEmpty(), groupClientPackage))) + imports = append(imports, strings.ToLower(fmt.Sprintf("fake%s%s \"%s\"", group.PackageName, version.NonEmpty(), fakeGroupClientPackage))) } } // the package that has the clientset Interface @@ -85,16 +86,24 @@ func (g *genClientset) GenerateType(c *generator.Context, t *types.Type, w io.Wr // perhaps we can adapt the go2ild framework to this kind of usage. sw := generator.NewSnippetWriter(w, c, "$", "$") - allGroups := clientgentypes.ToGroupVersionPackages(g.groups) + allGroups := clientgentypes.ToGroupVersionPackages(g.groups, g.groupGoNames) sw.Do(common, nil) sw.Do(checkImpl, nil) - for _, g := range allGroups { - sw.Do(clientsetInterfaceImplTemplate, g) + for _, group := range allGroups { + m := map[string]interface{}{ + "group": group.Group, + "version": group.Version, + "PackageName": group.PackageName, + "GroupGoName": group.GroupGoName, + "Version": namer.IC(group.Version.String()), + } + + sw.Do(clientsetInterfaceImplTemplate, m) // don't generated the default method if generating internalversion clientset - if g.IsDefaultVersion && g.Version != "" { - sw.Do(clientsetInterfaceDefaultVersionImpl, g) + if group.IsDefaultVersion && group.Version != "" { + sw.Do(clientsetInterfaceDefaultVersionImpl, m) } } @@ -140,15 +149,15 @@ var _ clientset.Interface = &Clientset{} ` var clientsetInterfaceImplTemplate = ` -// $.GroupVersion$ retrieves the $.GroupVersion$Client -func (c *Clientset) $.GroupVersion$() $.PackageName$.$.GroupVersion$Interface { - return &fake$.PackageName$.Fake$.GroupVersion${Fake: &c.Fake} +// $.GroupGoName$$.Version$ retrieves the $.GroupGoName$$.Version$Client +func (c *Clientset) $.GroupGoName$$.Version$() $.PackageName$.$.GroupGoName$$.Version$Interface { + return &fake$.PackageName$.Fake$.GroupGoName$$.Version${Fake: &c.Fake} } ` var clientsetInterfaceDefaultVersionImpl = ` -// $.Group$ retrieves the $.GroupVersion$Client -func (c *Clientset) $.Group$() $.PackageName$.$.GroupVersion$Interface { - return &fake$.PackageName$.Fake$.GroupVersion${Fake: &c.Fake} +// $.GroupGoName$ retrieves the $.GroupGoName$$.Version$Client +func (c *Clientset) $.GroupGoName$() $.PackageName$.$.GroupGoName$$.Version$Interface { + return &fake$.PackageName$.Fake$.GroupGoName$$.Version${Fake: &c.Fake} } ` diff --git a/staging/src/k8s.io/code-generator/cmd/client-gen/generators/fake/generator_fake_for_group.go b/staging/src/k8s.io/code-generator/cmd/client-gen/generators/fake/generator_fake_for_group.go index 83b7fe78a60..542d2bfaed5 100644 --- a/staging/src/k8s.io/code-generator/cmd/client-gen/generators/fake/generator_fake_for_group.go +++ b/staging/src/k8s.io/code-generator/cmd/client-gen/generators/fake/generator_fake_for_group.go @@ -36,6 +36,7 @@ type genFakeForGroup struct { realClientPackage string group string version string + groupGoName string // types in this group types []*types.Type imports namer.ImportTracker @@ -63,8 +64,8 @@ func (g *genFakeForGroup) GenerateType(c *generator.Context, t *types.Type, w io sw := generator.NewSnippetWriter(w, c, "$", "$") m := map[string]interface{}{ - "group": g.group, - "GroupVersion": namer.IC(g.group) + namer.IC(g.version), + "GroupGoName": g.groupGoName, + "Version": namer.IC(g.version), "Fake": c.Universe.Type(types.Name{Package: "k8s.io/client-go/testing", Name: "Fake"}), "RESTClientInterface": c.Universe.Type(types.Name{Package: "k8s.io/client-go/rest", Name: "Interface"}), "RESTClient": c.Universe.Type(types.Name{Package: "k8s.io/client-go/rest", Name: "RESTClient"}), @@ -78,7 +79,8 @@ func (g *genFakeForGroup) GenerateType(c *generator.Context, t *types.Type, w io } wrapper := map[string]interface{}{ "type": t, - "GroupVersion": namer.IC(g.group) + namer.IC(g.version), + "GroupGoName": g.groupGoName, + "Version": namer.IC(g.version), "realClientPackage": strings.ToLower(filepath.Base(g.realClientPackage)), } if tags.NonNamespaced { @@ -92,19 +94,19 @@ func (g *genFakeForGroup) GenerateType(c *generator.Context, t *types.Type, w io } var groupClientTemplate = ` -type Fake$.GroupVersion$ struct { +type Fake$.GroupGoName$$.Version$ struct { *$.Fake|raw$ } ` var getterImplNamespaced = ` -func (c *Fake$.GroupVersion$) $.type|publicPlural$(namespace string) $.realClientPackage$.$.type|public$Interface { +func (c *Fake$.GroupGoName$$.Version$) $.type|publicPlural$(namespace string) $.realClientPackage$.$.type|public$Interface { return &Fake$.type|publicPlural${c, namespace} } ` var getterImplNonNamespaced = ` -func (c *Fake$.GroupVersion$) $.type|publicPlural$() $.realClientPackage$.$.type|public$Interface { +func (c *Fake$.GroupGoName$$.Version$) $.type|publicPlural$() $.realClientPackage$.$.type|public$Interface { return &Fake$.type|publicPlural${c} } ` @@ -112,7 +114,7 @@ func (c *Fake$.GroupVersion$) $.type|publicPlural$() $.realClientPackage$.$.type var getRESTClient = ` // RESTClient returns a RESTClient that is used to communicate // with API server by this client implementation. -func (c *Fake$.GroupVersion$) RESTClient() $.RESTClientInterface|raw$ { +func (c *Fake$.GroupGoName$$.Version$) RESTClient() $.RESTClientInterface|raw$ { var ret *$.RESTClient|raw$ return ret } diff --git a/staging/src/k8s.io/code-generator/cmd/client-gen/generators/fake/generator_fake_for_type.go b/staging/src/k8s.io/code-generator/cmd/client-gen/generators/fake/generator_fake_for_type.go index 0e78bd963ff..64060a01fde 100644 --- a/staging/src/k8s.io/code-generator/cmd/client-gen/generators/fake/generator_fake_for_type.go +++ b/staging/src/k8s.io/code-generator/cmd/client-gen/generators/fake/generator_fake_for_type.go @@ -35,6 +35,7 @@ type genFakeForType struct { outputPackage string group string version string + groupGoName string inputPackage string typeToMatch *types.Type imports namer.ImportTracker @@ -116,7 +117,8 @@ func (g *genFakeForType) GenerateType(c *generator.Context, t *types.Type, w io. "Package": namer.IC(pkg), "namespaced": !tags.NonNamespaced, "Group": namer.IC(g.group), - "GroupVersion": namer.IC(g.group) + namer.IC(g.version), + "GroupGoName": g.groupGoName, + "Version": namer.IC(g.version), "group": canonicalGroup, "groupName": groupName, "version": g.version, @@ -286,7 +288,7 @@ func adjustTemplate(name, verbType, template string) string { var structNamespaced = ` // Fake$.type|publicPlural$ implements $.type|public$Interface type Fake$.type|publicPlural$ struct { - Fake *Fake$.GroupVersion$ + Fake *Fake$.GroupGoName$$.Version$ ns string } ` @@ -295,7 +297,7 @@ type Fake$.type|publicPlural$ struct { var structNonNamespaced = ` // Fake$.type|publicPlural$ implements $.type|public$Interface type Fake$.type|publicPlural$ struct { - Fake *Fake$.GroupVersion$ + Fake *Fake$.GroupGoName$$.Version$ } ` diff --git a/staging/src/k8s.io/code-generator/cmd/client-gen/generators/generator_for_clientset.go b/staging/src/k8s.io/code-generator/cmd/client-gen/generators/generator_for_clientset.go index 1b8c7e4a8b2..59cb44eabc1 100644 --- a/staging/src/k8s.io/code-generator/cmd/client-gen/generators/generator_for_clientset.go +++ b/staging/src/k8s.io/code-generator/cmd/client-gen/generators/generator_for_clientset.go @@ -32,6 +32,7 @@ import ( type genClientset struct { generator.DefaultGen groups []clientgentypes.GroupVersions + groupGoNames map[clientgentypes.GroupVersion]string clientsetPackage string outputPackage string imports namer.ImportTracker @@ -57,8 +58,8 @@ func (g *genClientset) Imports(c *generator.Context) (imports []string) { imports = append(imports, g.imports.ImportLines()...) for _, group := range g.groups { for _, version := range group.Versions { - typedClientPath := filepath.Join(g.clientsetPackage, "typed", group.Group.NonEmpty(), version.NonEmpty()) - imports = append(imports, strings.ToLower(fmt.Sprintf("%s%s \"%s\"", group.Group.NonEmpty(), version.NonEmpty(), typedClientPath))) + typedClientPath := filepath.Join(g.clientsetPackage, "typed", group.PackageName, version.NonEmpty()) + imports = append(imports, strings.ToLower(fmt.Sprintf("%s%s \"%s\"", group.PackageName, version.NonEmpty(), typedClientPath))) } } return @@ -69,7 +70,7 @@ func (g *genClientset) GenerateType(c *generator.Context, t *types.Type, w io.Wr // perhaps we can adapt the go2ild framework to this kind of usage. sw := generator.NewSnippetWriter(w, c, "$", "$") - allGroups := clientgentypes.ToGroupVersionPackages(g.groups) + allGroups := clientgentypes.ToGroupVersionPackages(g.groups, g.groupGoNames) m := map[string]interface{}{ "allGroups": allGroups, "Config": c.Universe.Type(types.Name{Package: "k8s.io/client-go/rest", Name: "Config"}), @@ -103,9 +104,9 @@ func (g *genClientset) GenerateType(c *generator.Context, t *types.Type, w io.Wr var clientsetInterface = ` type Interface interface { Discovery() $.DiscoveryInterface|raw$ - $range .allGroups$$.GroupVersion$() $.PackageName$.$.GroupVersion$Interface + $range .allGroups$$.GroupGoName$$.Version$() $.PackageName$.$.GroupGoName$$.Version$Interface $if .IsDefaultVersion$// Deprecated: please explicitly pick a version if possible. - $.Group$() $.PackageName$.$.GroupVersion$Interface + $.GroupGoName$() $.PackageName$.$.GroupGoName$$.Version$Interface $end$$end$ } ` @@ -115,23 +116,23 @@ var clientsetTemplate = ` // version included in a Clientset. type Clientset struct { *$.DiscoveryClient|raw$ - $range .allGroups$$.LowerCaseGroupVersion$ *$.PackageName$.$.GroupVersion$Client + $range .allGroups$$.LowerCaseGroupGoName$$.Version$ *$.PackageName$.$.GroupGoName$$.Version$Client $end$ } ` var clientsetInterfaceImplTemplate = ` -// $.GroupVersion$ retrieves the $.GroupVersion$Client -func (c *Clientset) $.GroupVersion$() $.PackageName$.$.GroupVersion$Interface { - return c.$.LowerCaseGroupVersion$ +// $.GroupGoName$$.Version$ retrieves the $.GroupGoName$$.Version$Client +func (c *Clientset) $.GroupGoName$$.Version$() $.PackageName$.$.GroupGoName$$.Version$Interface { + return c.$.LowerCaseGroupGoName$$.Version$ } ` var clientsetInterfaceDefaultVersionImpl = ` -// Deprecated: $.Group$ retrieves the default version of $.Group$Client. +// Deprecated: $.GroupGoName$ retrieves the default version of $.GroupGoName$Client. // Please explicitly pick a version. -func (c *Clientset) $.Group$() $.PackageName$.$.GroupVersion$Interface { - return c.$.LowerCaseGroupVersion$ +func (c *Clientset) $.GroupGoName$() $.PackageName$.$.GroupGoName$$.Version$Interface { + return c.$.LowerCaseGroupGoName$$.Version$ } ` @@ -154,7 +155,7 @@ func NewForConfig(c *$.Config|raw$) (*Clientset, error) { } var cs Clientset var err error -$range .allGroups$ cs.$.LowerCaseGroupVersion$, err =$.PackageName$.NewForConfig(&configShallowCopy) +$range .allGroups$ cs.$.LowerCaseGroupGoName$$.Version$, err =$.PackageName$.NewForConfig(&configShallowCopy) if err!=nil { return nil, err } @@ -173,7 +174,7 @@ var newClientsetForConfigOrDieTemplate = ` // panics if there is an error in the config. func NewForConfigOrDie(c *$.Config|raw$) *Clientset { var cs Clientset -$range .allGroups$ cs.$.LowerCaseGroupVersion$ =$.PackageName$.NewForConfigOrDie(c) +$range .allGroups$ cs.$.LowerCaseGroupGoName$$.Version$ =$.PackageName$.NewForConfigOrDie(c) $end$ cs.DiscoveryClient = $.NewDiscoveryClientForConfigOrDie|raw$(c) return &cs @@ -184,7 +185,7 @@ var newClientsetForRESTClientTemplate = ` // New creates a new Clientset for the given RESTClient. func New(c $.RESTClientInterface|raw$) *Clientset { var cs Clientset -$range .allGroups$ cs.$.LowerCaseGroupVersion$ =$.PackageName$.New(c) +$range .allGroups$ cs.$.LowerCaseGroupGoName$$.Version$ =$.PackageName$.New(c) $end$ cs.DiscoveryClient = $.NewDiscoveryClient|raw$(c) return &cs diff --git a/staging/src/k8s.io/code-generator/cmd/client-gen/generators/generator_for_group.go b/staging/src/k8s.io/code-generator/cmd/client-gen/generators/generator_for_group.go index 337ec4d49fb..c37a5536fa4 100644 --- a/staging/src/k8s.io/code-generator/cmd/client-gen/generators/generator_for_group.go +++ b/staging/src/k8s.io/code-generator/cmd/client-gen/generators/generator_for_group.go @@ -34,6 +34,7 @@ type genGroup struct { outputPackage string group string version string + groupGoName string apiPath string // types in this group types []*types.Type @@ -87,8 +88,9 @@ func (g *genGroup) GenerateType(c *generator.Context, t *types.Type, w io.Writer m := map[string]interface{}{ "group": g.group, "version": g.version, - "GroupVersion": namer.IC(g.group) + namer.IC(g.version), "groupName": groupName, + "GroupGoName": g.groupGoName, + "Version": namer.IC(g.version), "types": g.types, "apiPath": apiPath(g.group), "schemaGroupVersion": c.Universe.Type(types.Name{Package: "k8s.io/apimachinery/pkg/runtime/schema", Name: "GroupVersion"}), @@ -108,8 +110,9 @@ func (g *genGroup) GenerateType(c *generator.Context, t *types.Type, w io.Writer return err } wrapper := map[string]interface{}{ - "type": t, - "GroupVersion": namer.IC(g.group) + namer.IC(g.version), + "type": t, + "GroupGoName": g.groupGoName, + "Version": namer.IC(g.version), } if tags.NonNamespaced { sw.Do(getterImplNonNamespaced, wrapper) @@ -131,7 +134,7 @@ func (g *genGroup) GenerateType(c *generator.Context, t *types.Type, w io.Writer } var groupInterfaceTemplate = ` -type $.GroupVersion$Interface interface { +type $.GroupGoName$$.Version$Interface interface { RESTClient() $.restRESTClientInterface|raw$ $range .types$ $.|publicPlural$Getter $end$ @@ -139,27 +142,27 @@ type $.GroupVersion$Interface interface { ` var groupClientTemplate = ` -// $.GroupVersion$Client is used to interact with features provided by the $.groupName$ group. -type $.GroupVersion$Client struct { +// $.GroupGoName$$.Version$Client is used to interact with features provided by the $.groupName$ group. +type $.GroupGoName$$.Version$Client struct { restClient $.restRESTClientInterface|raw$ } ` var getterImplNamespaced = ` -func (c *$.GroupVersion$Client) $.type|publicPlural$(namespace string) $.type|public$Interface { +func (c *$.GroupGoName$$.Version$Client) $.type|publicPlural$(namespace string) $.type|public$Interface { return new$.type|publicPlural$(c, namespace) } ` var getterImplNonNamespaced = ` -func (c *$.GroupVersion$Client) $.type|publicPlural$() $.type|public$Interface { +func (c *$.GroupGoName$$.Version$Client) $.type|publicPlural$() $.type|public$Interface { return new$.type|publicPlural$(c) } ` var newClientForConfigTemplate = ` -// NewForConfig creates a new $.GroupVersion$Client for the given config. -func NewForConfig(c *$.restConfig|raw$) (*$.GroupVersion$Client, error) { +// NewForConfig creates a new $.GroupGoName$$.Version$Client for the given config. +func NewForConfig(c *$.restConfig|raw$) (*$.GroupGoName$$.Version$Client, error) { config := *c if err := setConfigDefaults(&config); err != nil { return nil, err @@ -168,14 +171,14 @@ func NewForConfig(c *$.restConfig|raw$) (*$.GroupVersion$Client, error) { if err != nil { return nil, err } - return &$.GroupVersion$Client{client}, nil + return &$.GroupGoName$$.Version$Client{client}, nil } ` var newClientForConfigOrDieTemplate = ` -// NewForConfigOrDie creates a new $.GroupVersion$Client for the given config and +// NewForConfigOrDie creates a new $.GroupGoName$$.Version$Client for the given config and // panics if there is an error in the config. -func NewForConfigOrDie(c *$.restConfig|raw$) *$.GroupVersion$Client { +func NewForConfigOrDie(c *$.restConfig|raw$) *$.GroupGoName$$.Version$Client { client, err := NewForConfig(c) if err != nil { panic(err) @@ -187,7 +190,7 @@ func NewForConfigOrDie(c *$.restConfig|raw$) *$.GroupVersion$Client { var getRESTClient = ` // RESTClient returns a RESTClient that is used to communicate // with API server by this client implementation. -func (c *$.GroupVersion$Client) RESTClient() $.restRESTClientInterface|raw$ { +func (c *$.GroupGoName$$.Version$Client) RESTClient() $.restRESTClientInterface|raw$ { if c == nil { return nil } @@ -196,9 +199,9 @@ func (c *$.GroupVersion$Client) RESTClient() $.restRESTClientInterface|raw$ { ` var newClientForRESTClientTemplate = ` -// New creates a new $.GroupVersion$Client for the given RESTClient. -func New(c $.restRESTClientInterface|raw$) *$.GroupVersion$Client { - return &$.GroupVersion$Client{c} +// New creates a new $.GroupGoName$$.Version$Client for the given RESTClient. +func New(c $.restRESTClientInterface|raw$) *$.GroupGoName$$.Version$Client { + return &$.GroupGoName$$.Version$Client{c} } ` diff --git a/staging/src/k8s.io/code-generator/cmd/client-gen/generators/generator_for_type.go b/staging/src/k8s.io/code-generator/cmd/client-gen/generators/generator_for_type.go index 51f39bdb049..5484717fb36 100644 --- a/staging/src/k8s.io/code-generator/cmd/client-gen/generators/generator_for_type.go +++ b/staging/src/k8s.io/code-generator/cmd/client-gen/generators/generator_for_type.go @@ -35,6 +35,7 @@ type genClientForType struct { clientsetPackage string group string version string + groupGoName string typeToMatch *types.Type imports namer.ImportTracker } @@ -132,7 +133,8 @@ func (g *genClientForType) GenerateType(c *generator.Context, t *types.Type, w i "Group": namer.IC(g.group), "subresource": false, "subresourcePath": "", - "GroupVersion": namer.IC(g.group) + namer.IC(g.version), + "GroupGoName": g.groupGoName, + "Version": namer.IC(g.version), "DeleteOptions": c.Universe.Type(types.Name{Package: "k8s.io/apimachinery/pkg/apis/meta/v1", Name: "DeleteOptions"}), "ListOptions": c.Universe.Type(types.Name{Package: "k8s.io/apimachinery/pkg/apis/meta/v1", Name: "ListOptions"}), "GetOptions": c.Universe.Type(types.Name{Package: "k8s.io/apimachinery/pkg/apis/meta/v1", Name: "GetOptions"}), @@ -366,7 +368,7 @@ type $.type|privatePlural$ struct { var newStructNamespaced = ` // new$.type|publicPlural$ returns a $.type|publicPlural$ -func new$.type|publicPlural$(c *$.GroupVersion$Client, namespace string) *$.type|privatePlural$ { +func new$.type|publicPlural$(c *$.GroupGoName$$.Version$Client, namespace string) *$.type|privatePlural$ { return &$.type|privatePlural${ client: c.RESTClient(), ns: namespace, @@ -376,7 +378,7 @@ func new$.type|publicPlural$(c *$.GroupVersion$Client, namespace string) *$.type var newStructNonNamespaced = ` // new$.type|publicPlural$ returns a $.type|publicPlural$ -func new$.type|publicPlural$(c *$.GroupVersion$Client) *$.type|privatePlural$ { +func new$.type|publicPlural$(c *$.GroupGoName$$.Version$Client) *$.type|privatePlural$ { return &$.type|privatePlural${ client: c.RESTClient(), } diff --git a/staging/src/k8s.io/code-generator/cmd/client-gen/generators/scheme/generator_for_scheme.go b/staging/src/k8s.io/code-generator/cmd/client-gen/generators/scheme/generator_for_scheme.go index 9c02d15c8a2..9e0cb026a25 100644 --- a/staging/src/k8s.io/code-generator/cmd/client-gen/generators/scheme/generator_for_scheme.go +++ b/staging/src/k8s.io/code-generator/cmd/client-gen/generators/scheme/generator_for_scheme.go @@ -67,10 +67,10 @@ func (g *GenScheme) Imports(c *generator.Context) (imports []string) { packagePath = filepath.Dir(packagePath) } packagePath = filepath.Join(packagePath, "install") - imports = append(imports, strings.ToLower(fmt.Sprintf("%s \"%s\"", group.Group.NonEmpty(), path.Vendorless(packagePath)))) + imports = append(imports, strings.ToLower(fmt.Sprintf("%s \"%s\"", group.PackageName, path.Vendorless(packagePath)))) break } else { - imports = append(imports, strings.ToLower(fmt.Sprintf("%s%s \"%s\"", group.Group.NonEmpty(), version.NonEmpty(), path.Vendorless(packagePath)))) + imports = append(imports, strings.ToLower(fmt.Sprintf("%s%s \"%s\"", group.PackageName, version.NonEmpty(), path.Vendorless(packagePath)))) } } } @@ -80,7 +80,7 @@ func (g *GenScheme) Imports(c *generator.Context) (imports []string) { func (g *GenScheme) GenerateType(c *generator.Context, t *types.Type, w io.Writer) error { sw := generator.NewSnippetWriter(w, c, "$", "$") - allGroupVersions := clientgentypes.ToGroupVersionPackages(g.Groups) + allGroupVersions := clientgentypes.ToGroupVersionPackages(g.Groups, nil) allInstallGroups := clientgentypes.ToGroupInstallPackages(g.Groups) m := map[string]interface{}{ diff --git a/staging/src/k8s.io/code-generator/cmd/client-gen/types/helpers.go b/staging/src/k8s.io/code-generator/cmd/client-gen/types/helpers.go index b9f4730e227..cc8356f1e48 100644 --- a/staging/src/k8s.io/code-generator/cmd/client-gen/types/helpers.go +++ b/staging/src/k8s.io/code-generator/cmd/client-gen/types/helpers.go @@ -85,18 +85,19 @@ func defaultVersion(versions []Version) Version { } // ToGroupVersionPackages is a helper function used by generators for groups. -func ToGroupVersionPackages(groups []GroupVersions) []GroupVersionPackage { +func ToGroupVersionPackages(groups []GroupVersions, groupGoNames map[GroupVersion]string) []GroupVersionPackage { var groupVersionPackages []GroupVersionPackage for _, group := range groups { defaultVersion := defaultVersion(group.Versions) for _, version := range group.Versions { + groupGoName := groupGoNames[GroupVersion{Group: group.Group, Version: version}] groupVersionPackages = append(groupVersionPackages, GroupVersionPackage{ - Group: Group(namer.IC(group.Group.NonEmpty())), - Version: Version(namer.IC(version.String())), - GroupVersion: namer.IC(group.Group.NonEmpty()) + namer.IC(version.String()), - LowerCaseGroupVersion: namer.IL(group.Group.NonEmpty()) + namer.IC(version.String()), - PackageName: strings.ToLower(group.Group.NonEmpty() + version.NonEmpty()), - IsDefaultVersion: version == defaultVersion && version != "", + Group: Group(namer.IC(group.Group.NonEmpty())), + Version: Version(namer.IC(version.String())), + PackageName: strings.ToLower(group.PackageName + version.NonEmpty()), + IsDefaultVersion: version == defaultVersion && version != "", + GroupGoName: groupGoName, + LowerCaseGroupGoName: namer.IL(groupGoName), }) } } @@ -108,7 +109,7 @@ func ToGroupInstallPackages(groups []GroupVersions) []GroupInstallPackage { for _, group := range groups { groupInstallPackages = append(groupInstallPackages, GroupInstallPackage{ Group: Group(namer.IC(group.Group.NonEmpty())), - InstallPackageName: strings.ToLower(group.Group.NonEmpty()), + InstallPackageName: group.PackageName, }) } return groupInstallPackages diff --git a/staging/src/k8s.io/code-generator/cmd/client-gen/types/types.go b/staging/src/k8s.io/code-generator/cmd/client-gen/types/types.go index c20b221c307..e14659fcb74 100644 --- a/staging/src/k8s.io/code-generator/cmd/client-gen/types/types.go +++ b/staging/src/k8s.io/code-generator/cmd/client-gen/types/types.go @@ -48,8 +48,10 @@ type GroupVersion struct { } type GroupVersions struct { - Group Group - Versions []Version + // The package name of the group, e.g. extensions or networking + PackageName string + Group Group + Versions []Version } // GroupVersionPackage contains group name, version name, and the package name client-gen will generate for this group version. @@ -58,10 +60,10 @@ type GroupVersionPackage struct { Version Version // If a user calls a group client without specifying the version (e.g., // c.Core(), instead of c.CoreV1()), the default version will be returned. - IsDefaultVersion bool - GroupVersion string - LowerCaseGroupVersion string - PackageName string + IsDefaultVersion bool + PackageName string + GroupGoName string + LowerCaseGroupGoName string } type GroupInstallPackage struct { diff --git a/staging/src/k8s.io/code-generator/cmd/informer-gen/generators/factory.go b/staging/src/k8s.io/code-generator/cmd/informer-gen/generators/factory.go index 16f733506e5..593f53349af 100644 --- a/staging/src/k8s.io/code-generator/cmd/informer-gen/generators/factory.go +++ b/staging/src/k8s.io/code-generator/cmd/informer-gen/generators/factory.go @@ -18,6 +18,7 @@ package generators import ( "io" + "path" clientgentypes "k8s.io/code-generator/cmd/client-gen/types" "k8s.io/gengo/generator" @@ -34,6 +35,7 @@ type factoryGenerator struct { outputPackage string imports namer.ImportTracker groupVersions map[string]clientgentypes.GroupVersions + gvGoNames map[string]string clientSetPackage string internalInterfacesPackage string filtered bool @@ -67,15 +69,16 @@ func (g *factoryGenerator) GenerateType(c *generator.Context, t *types.Type, w i gvInterfaces := make(map[string]*types.Type) gvNewFuncs := make(map[string]*types.Type) - for groupName := range g.groupVersions { - gvInterfaces[groupName] = c.Universe.Type(types.Name{Package: packageForGroup(vendorless(g.outputPackage), g.groupVersions[groupName].Group), Name: "Interface"}) - gvNewFuncs[groupName] = c.Universe.Function(types.Name{Package: packageForGroup(vendorless(g.outputPackage), g.groupVersions[groupName].Group), Name: "New"}) + for groupPkgName := range g.groupVersions { + gvInterfaces[groupPkgName] = c.Universe.Type(types.Name{Package: path.Join(g.outputPackage, groupPkgName), Name: "Interface"}) + gvNewFuncs[groupPkgName] = c.Universe.Function(types.Name{Package: path.Join(g.outputPackage, groupPkgName), Name: "New"}) } m := map[string]interface{}{ "cacheSharedIndexInformer": c.Universe.Type(cacheSharedIndexInformer), "groupVersions": g.groupVersions, "gvInterfaces": gvInterfaces, "gvNewFuncs": gvNewFuncs, + "gvGoNames": g.gvGoNames, "interfacesNewInformerFunc": c.Universe.Type(types.Name{Package: g.internalInterfacesPackage, Name: "NewInformerFunc"}), "informerFactoryInterface": c.Universe.Type(types.Name{Package: g.internalInterfacesPackage, Name: "SharedInformerFactory"}), "clientSetInterface": c.Universe.Type(types.Name{Package: g.clientSetPackage, Name: "Interface"}), @@ -177,14 +180,16 @@ type SharedInformerFactory interface { WaitForCacheSync(stopCh <-chan struct{}) map[reflect.Type]bool {{$gvInterfaces := .gvInterfaces}} - {{range $groupName, $group := .groupVersions}}{{$groupName}}() {{index $gvInterfaces $groupName|raw}} + {{$gvGoNames := .gvGoNames}} + {{range $groupName, $group := .groupVersions}}{{index $gvGoNames $groupName}}() {{index $gvInterfaces $groupName|raw}} {{end}} } {{$gvNewFuncs := .gvNewFuncs}} -{{range $groupName, $group := .groupVersions}} -func (f *sharedInformerFactory) {{$groupName}}() {{index $gvInterfaces $groupName|raw}} { - return {{index $gvNewFuncs $groupName|raw}}(f) +{{$gvGoNames := .gvGoNames}} +{{range $groupPkgName, $group := .groupVersions}} +func (f *sharedInformerFactory) {{index $gvGoNames $groupPkgName}}() {{index $gvInterfaces $groupPkgName|raw}} { + return {{index $gvNewFuncs $groupPkgName|raw}}(f) } {{end}} ` diff --git a/staging/src/k8s.io/code-generator/cmd/informer-gen/generators/generic.go b/staging/src/k8s.io/code-generator/cmd/informer-gen/generators/generic.go index 4054b577d43..891cac31382 100644 --- a/staging/src/k8s.io/code-generator/cmd/informer-gen/generators/generic.go +++ b/staging/src/k8s.io/code-generator/cmd/informer-gen/generators/generic.go @@ -33,6 +33,7 @@ type genericGenerator struct { outputPackage string imports namer.ImportTracker groupVersions map[string]clientgentypes.GroupVersions + groupGoNames map[string]string typesForGroupVersion map[clientgentypes.GroupVersion][]*types.Type filtered bool } @@ -65,8 +66,9 @@ func (g *genericGenerator) Imports(c *generator.Context) (imports []string) { } type group struct { - Name string - Versions []*version + GroupGoName string + Name string + Versions []*version } type groupSort []group @@ -77,6 +79,7 @@ func (g groupSort) Swap(i, j int) { g[i], g[j] = g[j], g[i] } type version struct { Name string + GoName string Resources []*types.Type } @@ -95,15 +98,17 @@ func (g *genericGenerator) GenerateType(c *generator.Context, t *types.Type, w i schemeGVs := make(map[*version]*types.Type) orderer := namer.Orderer{Namer: namer.NewPrivateNamer(0)} - for _, groupVersions := range g.groupVersions { + for groupPackageName, groupVersions := range g.groupVersions { group := group{ - Name: namer.IC(groupVersions.Group.NonEmpty()), - Versions: []*version{}, + GroupGoName: g.groupGoNames[groupPackageName], + Name: groupVersions.Group.NonEmpty(), + Versions: []*version{}, } for _, v := range groupVersions.Versions { gv := clientgentypes.GroupVersion{Group: groupVersions.Group, Version: v} version := &version{ - Name: namer.IC(v.NonEmpty()), + Name: v.NonEmpty(), + GoName: namer.IC(v.NonEmpty()), Resources: orderer.OrderTypes(g.typesForGroupVersion[gv]), } schemeGVs[version] = c.Universe.Variable(types.Name{Package: g.typesForGroupVersion[gv][0].Name.Package, Name: "SchemeGroupVersion"}) @@ -159,12 +164,12 @@ var forResource = ` // TODO extend this to unknown resources with a client pool func (f *sharedInformerFactory) ForResource(resource {{.schemaGroupVersionResource|raw}}) (GenericInformer, error) { switch resource { - {{range $group := .groups -}} + {{range $group := .groups -}}{{$GroupGoName := .GroupGoName -}} {{range $version := .Versions -}} - // Group={{$group.Name}}, Version={{.Name}} + // Group={{$group.Name}}, Version={{.Name}} {{range .Resources -}} case {{index $.schemeGVs $version|raw}}.WithResource("{{.|allLowercasePlural}}"): - return &genericInformer{resource: resource.GroupResource(), informer: f.{{$group.Name}}().{{$version.Name}}().{{.|publicPlural}}().Informer()}, nil + return &genericInformer{resource: resource.GroupResource(), informer: f.{{$GroupGoName}}().{{$version.GoName}}().{{.|publicPlural}}().Informer()}, nil {{end}} {{end}} {{end -}} diff --git a/staging/src/k8s.io/code-generator/cmd/informer-gen/generators/informer.go b/staging/src/k8s.io/code-generator/cmd/informer-gen/generators/informer.go index 939d271fa38..57c4c63fbfb 100644 --- a/staging/src/k8s.io/code-generator/cmd/informer-gen/generators/informer.go +++ b/staging/src/k8s.io/code-generator/cmd/informer-gen/generators/informer.go @@ -36,7 +36,9 @@ import ( type informerGenerator struct { generator.DefaultGen outputPackage string + groupPkgName string groupVersion clientgentypes.GroupVersion + groupGoName string typeToGenerate *types.Type imports namer.ImportTracker clientSetPackage string @@ -66,8 +68,7 @@ func (g *informerGenerator) GenerateType(c *generator.Context, t *types.Type, w glog.V(5).Infof("processing type %v", t) - //listerPackage := "k8s.io/kubernetes/pkg/client/listers/" + g.groupVersion.Group.NonEmpty() + "/" + strings.ToLower(g.groupVersion.Version.NonEmpty()) - listerPackage := fmt.Sprintf("%s/%s/%s", g.listersPackage, g.groupVersion.Group.NonEmpty(), strings.ToLower(g.groupVersion.Version.NonEmpty())) + listerPackage := fmt.Sprintf("%s/%s/%s", g.listersPackage, g.groupPkgName, strings.ToLower(g.groupVersion.Version.NonEmpty())) clientSetInterface := c.Universe.Type(types.Name{Package: g.clientSetPackage, Name: "Interface"}) informerFor := "InformerFor" @@ -85,7 +86,7 @@ func (g *informerGenerator) GenerateType(c *generator.Context, t *types.Type, w "cacheNewSharedIndexInformer": c.Universe.Function(cacheNewSharedIndexInformer), "cacheSharedIndexInformer": c.Universe.Type(cacheSharedIndexInformer), "clientSetInterface": clientSetInterface, - "group": namer.IC(g.groupVersion.Group.NonEmpty()), + "group": namer.IC(g.groupGoName), "informerFor": informerFor, "interfacesSharedInformerFactory": c.Universe.Type(types.Name{Package: g.internalInterfacesPackage, Name: "SharedInformerFactory"}), "listOptions": c.Universe.Type(listOptions), diff --git a/staging/src/k8s.io/code-generator/cmd/informer-gen/generators/packages.go b/staging/src/k8s.io/code-generator/cmd/informer-gen/generators/packages.go index c7c04e998d9..8fc8128e9b5 100644 --- a/staging/src/k8s.io/code-generator/cmd/informer-gen/generators/packages.go +++ b/staging/src/k8s.io/code-generator/cmd/informer-gen/generators/packages.go @@ -92,10 +92,6 @@ func isInternal(m types.Member) bool { return !strings.Contains(m.Tags, "json") } -func packageForGroup(base string, group clientgentypes.Group) string { - return filepath.Join(base, group.NonEmpty()) -} - func packageForInternalInterfaces(base string) string { return filepath.Join(base, "internalinterfaces") } @@ -133,6 +129,7 @@ func Packages(context *generator.Context, arguments *args.GeneratorArgs) generat externalGroupVersions := make(map[string]clientgentypes.GroupVersions) internalGroupVersions := make(map[string]clientgentypes.GroupVersions) + groupGoNames := make(map[string]string) for _, inputDir := range arguments.InputDirs { p := context.Universe.Package(vendorless(inputDir)) @@ -161,12 +158,20 @@ func Packages(context *generator.Context, arguments *args.GeneratorArgs) generat gv.Version = clientgentypes.Version(parts[len(parts)-1]) targetGroupVersions = externalGroupVersions } + groupPkgName := strings.ToLower(gv.Group.NonEmpty()) // If there's a comment of the form "// +groupName=somegroup" or // "// +groupName=somegroup.foo.bar.io", use the first field (somegroup) as the name of the // group when generating. if override := types.ExtractCommentTags("+", p.Comments)["groupName"]; override != nil { - gv.Group = clientgentypes.Group(strings.SplitN(override[0], ".", 2)[0]) + gv.Group = clientgentypes.Group(override[0]) + } + + // If there's a comment of the form "// +groupGoName=SomeUniqueShortName", use that as + // the Go group identifier in CamelCase. It defaults + groupGoNames[groupPkgName] = namer.IC(strings.Split(gv.Group.NonEmpty(), ".")[0]) + if override := types.ExtractCommentTags("+", p.Comments)["groupGoName"]; override != nil { + groupGoNames[groupPkgName] = namer.IC(override[0]) } var typesToGenerate []*types.Type @@ -187,50 +192,45 @@ func Packages(context *generator.Context, arguments *args.GeneratorArgs) generat continue } - icGroupName := namer.IC(gv.Group.NonEmpty()) - groupVersionsEntry, ok := targetGroupVersions[icGroupName] + groupVersionsEntry, ok := targetGroupVersions[groupPkgName] if !ok { groupVersionsEntry = clientgentypes.GroupVersions{ Group: gv.Group, } } groupVersionsEntry.Versions = append(groupVersionsEntry.Versions, gv.Version) - targetGroupVersions[icGroupName] = groupVersionsEntry + targetGroupVersions[groupPkgName] = groupVersionsEntry orderer := namer.Orderer{Namer: namer.NewPrivateNamer(0)} typesToGenerate = orderer.OrderTypes(typesToGenerate) if internal { - packageList = append(packageList, versionPackage(internalVersionPackagePath, gv, boilerplate, typesToGenerate, customArgs.InternalClientSetPackage, customArgs.ListersPackage)) + packageList = append(packageList, versionPackage(internalVersionPackagePath, groupPkgName, gv, groupGoNames[groupPkgName], boilerplate, typesToGenerate, customArgs.InternalClientSetPackage, customArgs.ListersPackage)) } else { - packageList = append(packageList, versionPackage(externalVersionPackagePath, gv, boilerplate, typesToGenerate, customArgs.VersionedClientSetPackage, customArgs.ListersPackage)) + packageList = append(packageList, versionPackage(externalVersionPackagePath, groupPkgName, gv, groupGoNames[groupPkgName], boilerplate, typesToGenerate, customArgs.VersionedClientSetPackage, customArgs.ListersPackage)) } } if len(externalGroupVersions) != 0 { - packageList = append(packageList, factoryInterfacePackage(externalVersionPackagePath, boilerplate, customArgs.VersionedClientSetPackage, typesForGroupVersion)) - packageList = append(packageList, factoryPackage(externalVersionPackagePath, boilerplate, externalGroupVersions, customArgs.VersionedClientSetPackage, typesForGroupVersion)) - for _, groupVersionsEntry := range externalGroupVersions { - packageList = append(packageList, groupPackage(externalVersionPackagePath, groupVersionsEntry, boilerplate)) + packageList = append(packageList, factoryInterfacePackage(externalVersionPackagePath, boilerplate, customArgs.VersionedClientSetPackage)) + packageList = append(packageList, factoryPackage(externalVersionPackagePath, boilerplate, groupGoNames, externalGroupVersions, customArgs.VersionedClientSetPackage, typesForGroupVersion)) + for groupPkgName, groupVersionsEntry := range externalGroupVersions { + packageList = append(packageList, groupPackage(externalVersionPackagePath, groupPkgName, groupVersionsEntry, boilerplate)) } } if len(internalGroupVersions) != 0 { - packageList = append(packageList, factoryInterfacePackage(internalVersionPackagePath, boilerplate, customArgs.InternalClientSetPackage, typesForGroupVersion)) - packageList = append(packageList, factoryPackage(internalVersionPackagePath, boilerplate, internalGroupVersions, customArgs.InternalClientSetPackage, typesForGroupVersion)) - for _, groupVersionsEntry := range internalGroupVersions { - packageList = append(packageList, groupPackage(internalVersionPackagePath, groupVersionsEntry, boilerplate)) + packageList = append(packageList, factoryInterfacePackage(internalVersionPackagePath, boilerplate, customArgs.InternalClientSetPackage)) + packageList = append(packageList, factoryPackage(internalVersionPackagePath, boilerplate, groupGoNames, internalGroupVersions, customArgs.InternalClientSetPackage, typesForGroupVersion)) + for groupPkgName, groupVersionsEntry := range internalGroupVersions { + packageList = append(packageList, groupPackage(internalVersionPackagePath, groupPkgName, groupVersionsEntry, boilerplate)) } } return packageList } -func isInternalVersion(gv clientgentypes.GroupVersion) bool { - return len(gv.Version) == 0 -} - -func factoryPackage(basePackage string, boilerplate []byte, groupVersions map[string]clientgentypes.GroupVersions, clientSetPackage string, typesForGroupVersion map[clientgentypes.GroupVersion][]*types.Type) generator.Package { +func factoryPackage(basePackage string, boilerplate []byte, groupGoNames map[string]string, groupVersions map[string]clientgentypes.GroupVersions, clientSetPackage string, typesForGroupVersion map[clientgentypes.GroupVersion][]*types.Type) generator.Package { return &generator.DefaultPackage{ PackageName: filepath.Base(basePackage), PackagePath: basePackage, @@ -245,6 +245,7 @@ func factoryPackage(basePackage string, boilerplate []byte, groupVersions map[st groupVersions: groupVersions, clientSetPackage: clientSetPackage, internalInterfacesPackage: packageForInternalInterfaces(basePackage), + gvGoNames: groupGoNames, }) generators = append(generators, &genericGenerator{ @@ -255,6 +256,7 @@ func factoryPackage(basePackage string, boilerplate []byte, groupVersions map[st imports: generator.NewImportTracker(), groupVersions: groupVersions, typesForGroupVersion: typesForGroupVersion, + groupGoNames: groupGoNames, }) return generators @@ -262,7 +264,7 @@ func factoryPackage(basePackage string, boilerplate []byte, groupVersions map[st } } -func factoryInterfacePackage(basePackage string, boilerplate []byte, clientSetPackage string, typesForGroupVersion map[clientgentypes.GroupVersion][]*types.Type) generator.Package { +func factoryInterfacePackage(basePackage string, boilerplate []byte, clientSetPackage string) generator.Package { packagePath := packageForInternalInterfaces(basePackage) return &generator.DefaultPackage{ @@ -284,11 +286,11 @@ func factoryInterfacePackage(basePackage string, boilerplate []byte, clientSetPa } } -func groupPackage(basePackage string, groupVersions clientgentypes.GroupVersions, boilerplate []byte) generator.Package { - packagePath := filepath.Join(basePackage, strings.ToLower(groupVersions.Group.NonEmpty())) +func groupPackage(basePackage string, groupPkgName string, groupVersions clientgentypes.GroupVersions, boilerplate []byte) generator.Package { + packagePath := filepath.Join(basePackage, groupPkgName) return &generator.DefaultPackage{ - PackageName: strings.ToLower(groupVersions.Group.NonEmpty()), + PackageName: groupPkgName, PackagePath: packagePath, HeaderText: boilerplate, GeneratorFunc: func(c *generator.Context) (generators []generator.Generator) { @@ -310,8 +312,8 @@ func groupPackage(basePackage string, groupVersions clientgentypes.GroupVersions } } -func versionPackage(basePackage string, gv clientgentypes.GroupVersion, boilerplate []byte, typesToGenerate []*types.Type, clientSetPackage, listersPackage string) generator.Package { - packagePath := filepath.Join(basePackage, strings.ToLower(gv.Group.NonEmpty()), strings.ToLower(gv.Version.NonEmpty())) +func versionPackage(basePackage string, groupPkgName string, gv clientgentypes.GroupVersion, groupGoName string, boilerplate []byte, typesToGenerate []*types.Type, clientSetPackage, listersPackage string) generator.Package { + packagePath := filepath.Join(basePackage, groupPkgName, strings.ToLower(gv.Version.NonEmpty())) return &generator.DefaultPackage{ PackageName: strings.ToLower(gv.Version.NonEmpty()), @@ -334,7 +336,9 @@ func versionPackage(basePackage string, gv clientgentypes.GroupVersion, boilerpl OptionalName: strings.ToLower(t.Name.Name), }, outputPackage: packagePath, + groupPkgName: groupPkgName, groupVersion: gv, + groupGoName: groupGoName, typeToGenerate: t, imports: generator.NewImportTracker(), clientSetPackage: clientSetPackage, diff --git a/staging/src/k8s.io/code-generator/cmd/lister-gen/generators/lister.go b/staging/src/k8s.io/code-generator/cmd/lister-gen/generators/lister.go index 027adeb5471..11e1af0ad09 100644 --- a/staging/src/k8s.io/code-generator/cmd/lister-gen/generators/lister.go +++ b/staging/src/k8s.io/code-generator/cmd/lister-gen/generators/lister.go @@ -107,6 +107,7 @@ func Packages(context *generator.Context, arguments *args.GeneratorArgs) generat internalGVPkg = strings.Join(parts[0:len(parts)-1], "/") } + groupPackageName := strings.ToLower(gv.Group.NonEmpty()) // If there's a comment of the form "// +groupName=somegroup" or // "// +groupName=somegroup.foo.bar.io", use the first field (somegroup) as the name of the @@ -129,7 +130,7 @@ func Packages(context *generator.Context, arguments *args.GeneratorArgs) generat 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())) + packagePath := filepath.Join(arguments.OutputPackagePath, groupPackageName, strings.ToLower(gv.Version.NonEmpty())) packageList = append(packageList, &generator.DefaultPackage{ PackageName: strings.ToLower(gv.Version.NonEmpty()), PackagePath: packagePath,