diff --git a/cmd/libs/go2idl/client-gen/generators/client_generator.go b/cmd/libs/go2idl/client-gen/generators/client_generator.go index dcefb1d9ede..b3527973e19 100644 --- a/cmd/libs/go2idl/client-gen/generators/client_generator.go +++ b/cmd/libs/go2idl/client-gen/generators/client_generator.go @@ -63,7 +63,7 @@ func generatedBy(customArgs clientgenargs.Args) string { return fmt.Sprintf("\n// This package is generated by client-gen with the default arguments.\n\n") } -func packageForGroup(gv unversioned.GroupVersion, typeList []*types.Type, packageBasePath string, srcTreePath string, boilerplate []byte, generatedBy string) generator.Package { +func packageForGroup(gv unversioned.GroupVersion, typeList []*types.Type, packageBasePath string, srcTreePath string, inputPath string, boilerplate []byte, generatedBy string) generator.Package { outputPackagePath := filepath.Join(packageBasePath, gv.Group, gv.Version) return &generator.DefaultPackage{ PackageName: gv.Version, @@ -99,6 +99,7 @@ func packageForGroup(gv unversioned.GroupVersion, typeList []*types.Type, packag OptionalName: normalization.BeforeFirstDot(gv.Group) + "_client", }, outputPackage: outputPackagePath, + inputPacakge: inputPath, group: gv.Group, version: gv.Version, types: typeList, @@ -216,9 +217,10 @@ func Packages(context *generator.Context, arguments *args.GeneratorArgs) generat orderer := namer.Orderer{Namer: namer.NewPrivateNamer(0)} for _, gv := range customArgs.GroupVersions { types := gvToTypes[gv] - packageList = append(packageList, packageForGroup(normalization.GroupVersion(gv), orderer.OrderTypes(types), typedClientBasePath, arguments.OutputBase, boilerplate, generatedBy)) + inputPath := customArgs.GroupVersionToInputPath[gv] + packageList = append(packageList, packageForGroup(normalization.GroupVersion(gv), orderer.OrderTypes(types), typedClientBasePath, arguments.OutputBase, inputPath, boilerplate, generatedBy)) if customArgs.FakeClient { - packageList = append(packageList, fake.PackageForGroup(normalization.GroupVersion(gv), orderer.OrderTypes(types), typedClientBasePath, arguments.OutputBase, boilerplate, generatedBy)) + packageList = append(packageList, fake.PackageForGroup(normalization.GroupVersion(gv), orderer.OrderTypes(types), typedClientBasePath, arguments.OutputBase, inputPath, boilerplate, generatedBy)) } } diff --git a/cmd/libs/go2idl/client-gen/generators/fake/fake_client_generator.go b/cmd/libs/go2idl/client-gen/generators/fake/fake_client_generator.go index aa6b5bfcdc7..1c25a298c3f 100644 --- a/cmd/libs/go2idl/client-gen/generators/fake/fake_client_generator.go +++ b/cmd/libs/go2idl/client-gen/generators/fake/fake_client_generator.go @@ -27,7 +27,7 @@ import ( "k8s.io/kubernetes/pkg/api/unversioned" ) -func PackageForGroup(gv unversioned.GroupVersion, typeList []*types.Type, packageBasePath string, srcTreePath string, boilerplate []byte, generatedBy string) generator.Package { +func PackageForGroup(gv unversioned.GroupVersion, typeList []*types.Type, packageBasePath string, srcTreePath string, inputPath string, boilerplate []byte, generatedBy string) generator.Package { outputPackagePath := filepath.Join(packageBasePath, gv.Group, gv.Version, "fake") // TODO: should make this a function, called by here and in client-generator.go realClientPath := filepath.Join(packageBasePath, gv.Group, gv.Version) @@ -55,6 +55,7 @@ func PackageForGroup(gv unversioned.GroupVersion, typeList []*types.Type, packag }, outputPackage: outputPackagePath, group: normalization.BeforeFirstDot(gv.Group), + inputPackage: inputPath, version: gv.Version, typeToMatch: t, imports: generator.NewImportTracker(), diff --git a/cmd/libs/go2idl/client-gen/generators/fake/generator_fake_for_type.go b/cmd/libs/go2idl/client-gen/generators/fake/generator_fake_for_type.go index c082d81ff6c..fa068524102 100644 --- a/cmd/libs/go2idl/client-gen/generators/fake/generator_fake_for_type.go +++ b/cmd/libs/go2idl/client-gen/generators/fake/generator_fake_for_type.go @@ -31,6 +31,7 @@ type genFakeForType struct { generator.DefaultGen outputPackage string group string + inputPackage string version string typeToMatch *types.Type imports namer.ImportTracker @@ -87,6 +88,20 @@ func (g *genFakeForType) GenerateType(c *generator.Context, t *types.Type, w io. if canonicalVersion == "unversioned" { canonicalVersion = "" } + + groupName := g.group + if g.group == "core" { + groupName = "" + } + + // allow user to define a group name that's different from the one parsed from the directory. + for _, comment := range c.Universe.Package(g.inputPackage).DocComments { + comment = strings.TrimLeft(comment, "//") + if override, ok := types.ExtractCommentTags("+", comment)["groupName"]; ok { + groupName = override + } + } + m := map[string]interface{}{ "type": t, "package": pkg, @@ -94,6 +109,7 @@ func (g *genFakeForType) GenerateType(c *generator.Context, t *types.Type, w io. "namespaced": namespaced, "Group": namer.IC(g.group), "group": canonicalGroup, + "groupName": groupName, "version": canonicalVersion, "watchInterface": c.Universe.Type(types.Name{Package: "k8s.io/kubernetes/pkg/watch", Name: "Interface"}), "apiDeleteOptions": c.Universe.Type(types.Name{Package: "k8s.io/kubernetes/pkg/api", Name: "DeleteOptions"}), @@ -168,7 +184,7 @@ type Fake$.type|publicPlural$ struct { ` var resource = ` -var $.type|allLowercasePlural$Resource = $.GroupVersionResource|raw${Group: "$.group$", Version: "$.version$", Resource: "$.type|allLowercasePlural$"} +var $.type|allLowercasePlural$Resource = $.GroupVersionResource|raw${Group: "$.groupName$", Version: "$.version$", Resource: "$.type|allLowercasePlural$"} ` var listTemplate = ` diff --git a/cmd/libs/go2idl/client-gen/generators/generator_for_group.go b/cmd/libs/go2idl/client-gen/generators/generator_for_group.go index 21437a4e8b9..e3e932b38c9 100644 --- a/cmd/libs/go2idl/client-gen/generators/generator_for_group.go +++ b/cmd/libs/go2idl/client-gen/generators/generator_for_group.go @@ -18,6 +18,7 @@ package generators import ( "io" + "strings" "k8s.io/kubernetes/cmd/libs/go2idl/client-gen/generators/normalization" "k8s.io/kubernetes/cmd/libs/go2idl/generator" @@ -32,8 +33,9 @@ type genGroup struct { group string version string // types in this group - types []*types.Type - imports namer.ImportTracker + types []*types.Type + imports namer.ImportTracker + inputPacakge string } var _ generator.Generator = &genGroup{} @@ -66,17 +68,22 @@ func (g *genGroup) GenerateType(c *generator.Context, t *types.Type, w io.Writer return `"/apis"` } - canonize := func(group string) string { - if group == "core" { - return "" + groupName := g.group + if g.group == "core" { + groupName = "" + } + // allow user to define a group name that's different from the one parsed from the directory. + for _, comment := range c.Universe.Package(g.inputPacakge).DocComments { + comment = strings.TrimLeft(comment, "//") + if override, ok := types.ExtractCommentTags("+", comment)["groupName"]; ok && override != "" { + groupName = override } - return group } m := map[string]interface{}{ "group": normalization.BeforeFirstDot(g.group), "Group": namer.IC(normalization.BeforeFirstDot(g.group)), - "canonicalGroup": canonize(g.group), + "groupName": groupName, "types": g.types, "Config": c.Universe.Type(types.Name{Package: pkgRESTClient, Name: "Config"}), "DefaultKubernetesUserAgent": c.Universe.Function(types.Name{Package: pkgRESTClient, Name: "DefaultKubernetesUserAgent"}), @@ -190,7 +197,7 @@ func New(c *$.RESTClient|raw$) *$.Group$Client { var setInternalVersionClientDefaultsTemplate = ` func setConfigDefaults(config *$.Config|raw$) error { // if $.group$ group is not registered, return an error - g, err := $.latestGroup|raw$("$.canonicalGroup$") + g, err := $.latestGroup|raw$("$.groupName$") if err != nil { return err } @@ -219,7 +226,7 @@ func setConfigDefaults(config *$.Config|raw$) error { var setClientDefaultsTemplate = ` func setConfigDefaults(config *$.Config|raw$) error { // if $.group$ group is not registered, return an error - g, err := $.latestGroup|raw$("$.canonicalGroup$") + g, err := $.latestGroup|raw$("$.groupName$") if err != nil { return err } diff --git a/cmd/libs/go2idl/client-gen/main.go b/cmd/libs/go2idl/client-gen/main.go index e6bce2ba18c..0b28a715bfc 100644 --- a/cmd/libs/go2idl/client-gen/main.go +++ b/cmd/libs/go2idl/client-gen/main.go @@ -34,7 +34,7 @@ import ( var ( test = flag.BoolP("test", "t", false, "set this flag to generate the client code for the testdata") - inputVersions = flag.StringSlice("input", []string{"api/", "extensions/", "autoscaling/", "batch/"}, "group/versions that client-gen will generate clients for. At most one version per group is allowed. Specified in the format \"group1/version1,group2/version2...\". Default to \"api/,extensions/,autoscaling/,batch/\"") + inputVersions = flag.StringSlice("input", []string{"api/", "extensions/", "autoscaling/", "batch/", "rbac/"}, "group/versions that client-gen will generate clients for. At most one version per group is allowed. Specified in the format \"group1/version1,group2/version2...\". Default to \"api/,extensions/,autoscaling/,batch/,rbac/\"") includedTypesOverrides = flag.StringSlice("included-types-overrides", []string{}, "list of group/version/type for which client should be generated. By default, client is generated for all types which have genclient=true in types.go. This overrides that. For each groupVersion in this list, only the types mentioned here will be included. The default check of genclient=true will be used for other group versions.") basePath = flag.String("input-base", "k8s.io/kubernetes/pkg/apis", "base path to look for the api group. Default to \"k8s.io/kubernetes/pkg/apis\"") clientsetName = flag.StringP("clientset-name", "n", "internalclientset", "the name of the generated clientset package.") diff --git a/cmd/libs/go2idl/client-gen/test_apis/testgroup.k8s.io/doc.go b/cmd/libs/go2idl/client-gen/test_apis/testgroup.k8s.io/doc.go new file mode 100644 index 00000000000..1902048be94 --- /dev/null +++ b/cmd/libs/go2idl/client-gen/test_apis/testgroup.k8s.io/doc.go @@ -0,0 +1,18 @@ +/* +Copyright 2015 The Kubernetes Authors All rights reserved. + +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. +*/ + +// +groupName=testgroup.k8s.io +package testgroup diff --git a/cmd/libs/go2idl/client-gen/testoutput/clientset_generated/test_internalclientset/typed/testgroup.k8s.io/unversioned/fake/fake_testtype.go b/cmd/libs/go2idl/client-gen/testoutput/clientset_generated/test_internalclientset/typed/testgroup.k8s.io/unversioned/fake/fake_testtype.go index dbc88d80ace..355c73a1739 100644 --- a/cmd/libs/go2idl/client-gen/testoutput/clientset_generated/test_internalclientset/typed/testgroup.k8s.io/unversioned/fake/fake_testtype.go +++ b/cmd/libs/go2idl/client-gen/testoutput/clientset_generated/test_internalclientset/typed/testgroup.k8s.io/unversioned/fake/fake_testtype.go @@ -31,7 +31,7 @@ type FakeTestTypes struct { ns string } -var testtypesResource = unversioned.GroupVersionResource{Group: "testgroup", Version: "", Resource: "testtypes"} +var testtypesResource = unversioned.GroupVersionResource{Group: "testgroup.k8s.io", Version: "", Resource: "testtypes"} func (c *FakeTestTypes) Create(testType *testgroup_k8s_io.TestType) (result *testgroup_k8s_io.TestType, err error) { obj, err := c.Fake.