diff --git a/cmd/libs/go2idl/client-gen/generators/client_generator.go b/cmd/libs/go2idl/client-gen/generators/client_generator.go index b0f56d247cf..34a7c57a3bc 100644 --- a/cmd/libs/go2idl/client-gen/generators/client_generator.go +++ b/cmd/libs/go2idl/client-gen/generators/client_generator.go @@ -61,11 +61,11 @@ 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 clientgentypes.GroupVersion, typeList []*types.Type, packageBasePath string, apiPath string, srcTreePath string, inputPath string, boilerplate []byte, generatedBy string) generator.Package { - outputPackagePath := strings.ToLower(filepath.Join(packageBasePath, gv.Group.NonEmpty(), gv.Version.NonEmpty())) +func packageForGroup(gv clientgentypes.GroupVersion, typeList []*types.Type, clientsetPackage string, apiPath string, srcTreePath string, inputPackage string, boilerplate []byte, generatedBy string) generator.Package { + groupVersionClientPackage := strings.ToLower(filepath.Join(clientsetPackage, "typed", gv.Group.NonEmpty(), gv.Version.NonEmpty())) return &generator.DefaultPackage{ PackageName: strings.ToLower(gv.Version.NonEmpty()), - PackagePath: outputPackagePath, + PackagePath: groupVersionClientPackage, HeaderText: boilerplate, PackageDocumentation: []byte( generatedBy + @@ -85,7 +85,7 @@ func packageForGroup(gv clientgentypes.GroupVersion, typeList []*types.Type, pac DefaultGen: generator.DefaultGen{ OptionalName: strings.ToLower(c.Namers["private"].Name(t)), }, - outputPackage: outputPackagePath, + outputPackage: groupVersionClientPackage, group: gv.Group.NonEmpty(), version: gv.Version.String(), typeToMatch: t, @@ -97,8 +97,8 @@ func packageForGroup(gv clientgentypes.GroupVersion, typeList []*types.Type, pac DefaultGen: generator.DefaultGen{ OptionalName: gv.Group.NonEmpty() + "_client", }, - outputPackage: outputPackagePath, - inputPacakge: inputPath, + outputPackage: groupVersionClientPackage, + inputPackage: inputPackage, group: gv.Group.NonEmpty(), version: gv.Version.String(), apiPath: apiPath, @@ -108,7 +108,7 @@ func packageForGroup(gv clientgentypes.GroupVersion, typeList []*types.Type, pac expansionFileName := "generated_expansion" generators = append(generators, &genExpansion{ - groupPath: filepath.Join(srcTreePath, outputPackagePath), + groupPackagePath: filepath.Join(srcTreePath, groupVersionClientPackage), DefaultGen: generator.DefaultGen{ OptionalName: expansionFileName, }, @@ -123,10 +123,10 @@ func packageForGroup(gv clientgentypes.GroupVersion, typeList []*types.Type, pac } } -func packageForClientset(customArgs clientgenargs.Args, typedClientBasePath string, boilerplate []byte, generatedBy string) generator.Package { +func packageForClientset(customArgs clientgenargs.Args, clientsetPackage string, boilerplate []byte, generatedBy string) generator.Package { return &generator.DefaultPackage{ PackageName: customArgs.ClientsetName, - PackagePath: filepath.Join(customArgs.ClientsetOutputPath, customArgs.ClientsetName), + PackagePath: clientsetPackage, HeaderText: boilerplate, PackageDocumentation: []byte( generatedBy + @@ -143,10 +143,10 @@ func packageForClientset(customArgs clientgenargs.Args, typedClientBasePath stri DefaultGen: generator.DefaultGen{ OptionalName: "clientset", }, - groups: customArgs.Groups, - typedClientPath: typedClientBasePath, - outputPackage: customArgs.ClientsetName, - imports: generator.NewImportTracker(), + groups: customArgs.Groups, + clientsetPackage: clientsetPackage, + outputPackage: customArgs.ClientsetName, + imports: generator.NewImportTracker(), }, } return generators @@ -201,11 +201,11 @@ func Packages(context *generator.Context, arguments *args.GeneratorArgs) generat } var packageList []generator.Package - typedClientBasePath := filepath.Join(customArgs.ClientsetOutputPath, customArgs.ClientsetName, "typed") + clientsetPackage := filepath.Join(customArgs.ClientsetOutputPath, customArgs.ClientsetName) - packageList = append(packageList, packageForClientset(customArgs, typedClientBasePath, boilerplate, generatedBy)) + packageList = append(packageList, packageForClientset(customArgs, clientsetPackage, boilerplate, generatedBy)) if customArgs.FakeClient { - packageList = append(packageList, fake.PackageForClientset(customArgs, typedClientBasePath, boilerplate, generatedBy)) + packageList = append(packageList, fake.PackageForClientset(customArgs, clientsetPackage, boilerplate, generatedBy)) } // If --clientset-only=true, we don't regenerate the individual typed clients. @@ -219,9 +219,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), typedClientBasePath, customArgs.ClientsetAPIPath, arguments.OutputBase, inputPath, boilerplate, generatedBy)) + packageList = append(packageList, packageForGroup(gv, orderer.OrderTypes(types), clientsetPackage, customArgs.ClientsetAPIPath, arguments.OutputBase, inputPath, boilerplate, generatedBy)) if customArgs.FakeClient { - packageList = append(packageList, fake.PackageForGroup(gv, orderer.OrderTypes(types), typedClientBasePath, arguments.OutputBase, inputPath, boilerplate, generatedBy)) + packageList = append(packageList, fake.PackageForGroup(gv, orderer.OrderTypes(types), clientsetPackage, 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 8decba1e434..7fe315796e5 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 @@ -28,13 +28,13 @@ import ( clientgentypes "k8s.io/kubernetes/cmd/libs/go2idl/client-gen/types" ) -func PackageForGroup(gv clientgentypes.GroupVersion, typeList []*types.Type, packageBasePath string, srcTreePath string, inputPath string, boilerplate []byte, generatedBy string) generator.Package { - outputPackagePath := strings.ToLower(filepath.Join(packageBasePath, gv.Group.NonEmpty(), gv.Version.NonEmpty(), "fake")) +func PackageForGroup(gv clientgentypes.GroupVersion, typeList []*types.Type, clientsetPackage string, inputPackage string, boilerplate []byte, generatedBy string) generator.Package { + outputPackage := strings.ToLower(filepath.Join(clientsetPackage, "typed", gv.Group.NonEmpty(), gv.Version.NonEmpty(), "fake")) // TODO: should make this a function, called by here and in client-generator.go - realClientPath := filepath.Join(packageBasePath, gv.Group.NonEmpty(), gv.Version.NonEmpty()) + realClientPackage := filepath.Join(clientsetPackage, "typed", gv.Group.NonEmpty(), gv.Version.NonEmpty()) return &generator.DefaultPackage{ PackageName: "fake", - PackagePath: outputPackagePath, + PackagePath: outputPackage, HeaderText: boilerplate, PackageDocumentation: []byte( generatedBy + @@ -54,10 +54,10 @@ func PackageForGroup(gv clientgentypes.GroupVersion, typeList []*types.Type, pac DefaultGen: generator.DefaultGen{ OptionalName: "fake_" + strings.ToLower(c.Namers["private"].Name(t)), }, - outputPackage: outputPackagePath, + outputPackage: outputPackage, + inputPackage: inputPackage, group: gv.Group.NonEmpty(), version: gv.Version.String(), - inputPackage: inputPath, typeToMatch: t, imports: generator.NewImportTracker(), }) @@ -67,12 +67,12 @@ func PackageForGroup(gv clientgentypes.GroupVersion, typeList []*types.Type, pac DefaultGen: generator.DefaultGen{ OptionalName: "fake_" + gv.Group.NonEmpty() + "_client", }, - outputPackage: outputPackagePath, - realClientPath: realClientPath, - group: gv.Group.NonEmpty(), - version: gv.Version.String(), - types: typeList, - imports: generator.NewImportTracker(), + outputPackage: outputPackage, + realClientPackage: realClientPackage, + group: gv.Group.NonEmpty(), + version: gv.Version.String(), + types: typeList, + imports: generator.NewImportTracker(), }) return generators }, @@ -90,12 +90,12 @@ func extractBoolTagOrDie(key string, lines []string) bool { return val } -func PackageForClientset(customArgs clientgenargs.Args, typedClientBasePath string, boilerplate []byte, generatedBy string) generator.Package { +func PackageForClientset(customArgs clientgenargs.Args, fakeClientsetPackage string, boilerplate []byte, generatedBy string) 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. PackageName: "fake", - PackagePath: filepath.Join(customArgs.ClientsetOutputPath, customArgs.ClientsetName, "fake"), + PackagePath: filepath.Join(fakeClientsetPackage, "fake"), HeaderText: boilerplate, PackageDocumentation: []byte( generatedBy + @@ -112,11 +112,11 @@ func PackageForClientset(customArgs clientgenargs.Args, typedClientBasePath stri DefaultGen: generator.DefaultGen{ OptionalName: "clientset_generated", }, - groups: customArgs.Groups, - typedClientPath: typedClientBasePath, - outputPackage: "fake", - imports: generator.NewImportTracker(), - clientsetPath: filepath.Join(customArgs.ClientsetOutputPath, customArgs.ClientsetName), + groups: customArgs.Groups, + fakeClientsetPackage: fakeClientsetPackage, + outputPackage: "fake", + imports: generator.NewImportTracker(), + realClientsetPackage: filepath.Join(customArgs.ClientsetOutputPath, customArgs.ClientsetName), }, } return generators diff --git a/cmd/libs/go2idl/client-gen/generators/fake/generator_fake_for_clientset.go b/cmd/libs/go2idl/client-gen/generators/fake/generator_fake_for_clientset.go index a9420b712d6..e3c4205f39c 100644 --- a/cmd/libs/go2idl/client-gen/generators/fake/generator_fake_for_clientset.go +++ b/cmd/libs/go2idl/client-gen/generators/fake/generator_fake_for_clientset.go @@ -31,13 +31,13 @@ import ( // genClientset generates a package for a clientset. type genClientset struct { generator.DefaultGen - groups []clientgentypes.GroupVersions - typedClientPath string - outputPackage string - imports namer.ImportTracker - clientsetGenerated bool + groups []clientgentypes.GroupVersions + fakeClientsetPackage string + outputPackage string + imports namer.ImportTracker + clientsetGenerated bool // the import path of the generated real clientset. - clientsetPath string + realClientsetPackage string } var _ generator.Generator = &genClientset{} @@ -59,14 +59,15 @@ 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.typedClientPath, group.Group.NonEmpty(), version.NonEmpty()) - imports = append(imports, strings.ToLower(fmt.Sprintf("%s%s \"%s\"", version.NonEmpty(), group.Group.NonEmpty(), typedClientPath))) - fakeTypedClientPath := filepath.Join(typedClientPath, "fake") - imports = append(imports, strings.ToLower(fmt.Sprintf("fake%s%s \"%s\"", version.NonEmpty(), group.Group.NonEmpty(), fakeTypedClientPath))) + groupClientPackage := filepath.Join(g.fakeClientsetPackage, "typed", group.Group.NonEmpty(), 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))) } } // the package that has the clientset Interface - imports = append(imports, fmt.Sprintf("clientset \"%s\"", g.clientsetPath)) + imports = append(imports, fmt.Sprintf("clientset \"%s\"", g.realClientsetPackage)) // imports for the code in commonTemplate imports = append(imports, "k8s.io/kubernetes/pkg/api", @@ -85,12 +86,11 @@ 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, "$", "$") - sw.Do(common, nil) - - sw.Do(checkImpl, nil) - allGroups := clientgentypes.ToGroupVersionPackages(g.groups) + sw.Do(common, nil) + sw.Do(checkImpl, nil) + for _, g := range allGroups { sw.Do(clientsetInterfaceImplTemplate, g) // don't generated the default method if generating internalversion clientset diff --git a/cmd/libs/go2idl/client-gen/generators/fake/generator_fake_for_group.go b/cmd/libs/go2idl/client-gen/generators/fake/generator_fake_for_group.go index 42d1f4ee2ee..0b1409dd750 100644 --- a/cmd/libs/go2idl/client-gen/generators/fake/generator_fake_for_group.go +++ b/cmd/libs/go2idl/client-gen/generators/fake/generator_fake_for_group.go @@ -30,10 +30,10 @@ import ( // genFakeForGroup produces a file for a group client, e.g. ExtensionsClient for the extension group. type genFakeForGroup struct { generator.DefaultGen - outputPackage string - realClientPath string - group string - version string + outputPackage string + realClientPackage string + group string + version string // types in this group types []*types.Type imports namer.ImportTracker @@ -53,27 +53,27 @@ func (g *genFakeForGroup) Namers(c *generator.Context) namer.NameSystems { } func (g *genFakeForGroup) Imports(c *generator.Context) (imports []string) { - imports = append(g.imports.ImportLines(), strings.ToLower(fmt.Sprintf("%s \"%s\"", filepath.Base(g.realClientPath), g.realClientPath))) + imports = append(g.imports.ImportLines(), strings.ToLower(fmt.Sprintf("%s \"%s\"", filepath.Base(g.realClientPackage), g.realClientPackage))) return imports } func (g *genFakeForGroup) GenerateType(c *generator.Context, t *types.Type, w io.Writer) error { sw := generator.NewSnippetWriter(w, c, "$", "$") - const pkgTestingCore = "k8s.io/client-go/testing" - const pkgRESTClient = "k8s.io/client-go/rest" + m := map[string]interface{}{ "group": g.group, "GroupVersion": namer.IC(g.group) + namer.IC(g.version), - "Fake": c.Universe.Type(types.Name{Package: pkgTestingCore, Name: "Fake"}), - "RESTClientInterface": c.Universe.Type(types.Name{Package: pkgRESTClient, Name: "Interface"}), - "RESTClient": c.Universe.Type(types.Name{Package: pkgRESTClient, Name: "RESTClient"}), + "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"}), } + sw.Do(groupClientTemplate, m) for _, t := range g.types { wrapper := map[string]interface{}{ "type": t, "GroupVersion": namer.IC(g.group) + namer.IC(g.version), - "realClientPackage": strings.ToLower(filepath.Base(g.realClientPath)), + "realClientPackage": strings.ToLower(filepath.Base(g.realClientPackage)), } namespaced := !extractBoolTagOrDie("nonNamespaced", t.SecondClosestCommentLines) if namespaced { 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 cdb50a0f4bc..d8b4a344e8b 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 @@ -87,7 +87,6 @@ func hasObjectMeta(t *types.Type) bool { func (g *genFakeForType) GenerateType(c *generator.Context, t *types.Type, w io.Writer) error { sw := generator.NewSnippetWriter(w, c, "$", "$") pkg := filepath.Base(t.Name.Package) - const pkgTestingCore = "k8s.io/client-go/testing" namespaced := !extractBoolTagOrDie("nonNamespaced", t.SecondClosestCommentLines) canonicalGroup := g.group if canonicalGroup == "core" { @@ -105,6 +104,7 @@ func (g *genFakeForType) GenerateType(c *generator.Context, t *types.Type, w io. groupName = override[0] } + const pkgClientGoTesting = "k8s.io/client-go/testing" m := map[string]interface{}{ "type": t, "package": pkg, @@ -123,27 +123,27 @@ func (g *genFakeForType) GenerateType(c *generator.Context, t *types.Type, w io. "PatchType": c.Universe.Type(types.Name{Package: "k8s.io/apimachinery/pkg/types", Name: "PatchType"}), "watchInterface": c.Universe.Type(types.Name{Package: "k8s.io/apimachinery/pkg/watch", Name: "Interface"}), - "NewRootListAction": c.Universe.Function(types.Name{Package: pkgTestingCore, Name: "NewRootListAction"}), - "NewListAction": c.Universe.Function(types.Name{Package: pkgTestingCore, Name: "NewListAction"}), - "NewRootGetAction": c.Universe.Function(types.Name{Package: pkgTestingCore, Name: "NewRootGetAction"}), - "NewGetAction": c.Universe.Function(types.Name{Package: pkgTestingCore, Name: "NewGetAction"}), - "NewRootDeleteAction": c.Universe.Function(types.Name{Package: pkgTestingCore, Name: "NewRootDeleteAction"}), - "NewDeleteAction": c.Universe.Function(types.Name{Package: pkgTestingCore, Name: "NewDeleteAction"}), - "NewRootDeleteCollectionAction": c.Universe.Function(types.Name{Package: pkgTestingCore, Name: "NewRootDeleteCollectionAction"}), - "NewDeleteCollectionAction": c.Universe.Function(types.Name{Package: pkgTestingCore, Name: "NewDeleteCollectionAction"}), - "NewRootUpdateAction": c.Universe.Function(types.Name{Package: pkgTestingCore, Name: "NewRootUpdateAction"}), - "NewUpdateAction": c.Universe.Function(types.Name{Package: pkgTestingCore, Name: "NewUpdateAction"}), - "NewRootCreateAction": c.Universe.Function(types.Name{Package: pkgTestingCore, Name: "NewRootCreateAction"}), - "NewCreateAction": c.Universe.Function(types.Name{Package: pkgTestingCore, Name: "NewCreateAction"}), - "NewRootWatchAction": c.Universe.Function(types.Name{Package: pkgTestingCore, Name: "NewRootWatchAction"}), - "NewWatchAction": c.Universe.Function(types.Name{Package: pkgTestingCore, Name: "NewWatchAction"}), - "NewUpdateSubresourceAction": c.Universe.Function(types.Name{Package: pkgTestingCore, Name: "NewUpdateSubresourceAction"}), - "NewRootUpdateSubresourceAction": c.Universe.Function(types.Name{Package: pkgTestingCore, Name: "NewRootUpdateSubresourceAction"}), - "NewRootPatchAction": c.Universe.Function(types.Name{Package: pkgTestingCore, Name: "NewRootPatchAction"}), - "NewPatchAction": c.Universe.Function(types.Name{Package: pkgTestingCore, Name: "NewPatchAction"}), - "NewRootPatchSubresourceAction": c.Universe.Function(types.Name{Package: pkgTestingCore, Name: "NewRootPatchSubresourceAction"}), - "NewPatchSubresourceAction": c.Universe.Function(types.Name{Package: pkgTestingCore, Name: "NewPatchSubresourceAction"}), - "ExtractFromListOptions": c.Universe.Function(types.Name{Package: pkgTestingCore, Name: "ExtractFromListOptions"}), + "NewRootListAction": c.Universe.Function(types.Name{Package: pkgClientGoTesting, Name: "NewRootListAction"}), + "NewListAction": c.Universe.Function(types.Name{Package: pkgClientGoTesting, Name: "NewListAction"}), + "NewRootGetAction": c.Universe.Function(types.Name{Package: pkgClientGoTesting, Name: "NewRootGetAction"}), + "NewGetAction": c.Universe.Function(types.Name{Package: pkgClientGoTesting, Name: "NewGetAction"}), + "NewRootDeleteAction": c.Universe.Function(types.Name{Package: pkgClientGoTesting, Name: "NewRootDeleteAction"}), + "NewDeleteAction": c.Universe.Function(types.Name{Package: pkgClientGoTesting, Name: "NewDeleteAction"}), + "NewRootDeleteCollectionAction": c.Universe.Function(types.Name{Package: pkgClientGoTesting, Name: "NewRootDeleteCollectionAction"}), + "NewDeleteCollectionAction": c.Universe.Function(types.Name{Package: pkgClientGoTesting, Name: "NewDeleteCollectionAction"}), + "NewRootUpdateAction": c.Universe.Function(types.Name{Package: pkgClientGoTesting, Name: "NewRootUpdateAction"}), + "NewUpdateAction": c.Universe.Function(types.Name{Package: pkgClientGoTesting, Name: "NewUpdateAction"}), + "NewRootCreateAction": c.Universe.Function(types.Name{Package: pkgClientGoTesting, Name: "NewRootCreateAction"}), + "NewCreateAction": c.Universe.Function(types.Name{Package: pkgClientGoTesting, Name: "NewCreateAction"}), + "NewRootWatchAction": c.Universe.Function(types.Name{Package: pkgClientGoTesting, Name: "NewRootWatchAction"}), + "NewWatchAction": c.Universe.Function(types.Name{Package: pkgClientGoTesting, Name: "NewWatchAction"}), + "NewUpdateSubresourceAction": c.Universe.Function(types.Name{Package: pkgClientGoTesting, Name: "NewUpdateSubresourceAction"}), + "NewRootUpdateSubresourceAction": c.Universe.Function(types.Name{Package: pkgClientGoTesting, Name: "NewRootUpdateSubresourceAction"}), + "NewRootPatchAction": c.Universe.Function(types.Name{Package: pkgClientGoTesting, Name: "NewRootPatchAction"}), + "NewPatchAction": c.Universe.Function(types.Name{Package: pkgClientGoTesting, Name: "NewPatchAction"}), + "NewRootPatchSubresourceAction": c.Universe.Function(types.Name{Package: pkgClientGoTesting, Name: "NewRootPatchSubresourceAction"}), + "NewPatchSubresourceAction": c.Universe.Function(types.Name{Package: pkgClientGoTesting, Name: "NewPatchSubresourceAction"}), + "ExtractFromListOptions": c.Universe.Function(types.Name{Package: pkgClientGoTesting, Name: "ExtractFromListOptions"}), } noMethods := extractBoolTagOrDie("noMethods", t.SecondClosestCommentLines) == true diff --git a/cmd/libs/go2idl/client-gen/generators/generator_for_clientset.go b/cmd/libs/go2idl/client-gen/generators/generator_for_clientset.go index f92d9bc4b49..4a22ac79c91 100644 --- a/cmd/libs/go2idl/client-gen/generators/generator_for_clientset.go +++ b/cmd/libs/go2idl/client-gen/generators/generator_for_clientset.go @@ -32,7 +32,7 @@ import ( type genClientset struct { generator.DefaultGen groups []clientgentypes.GroupVersions - typedClientPath string + clientsetPackage string outputPackage string imports namer.ImportTracker clientsetGenerated bool @@ -57,12 +57,10 @@ 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.typedClientPath, group.Group.NonEmpty(), version.NonEmpty()) - imports = append(imports, strings.ToLower(fmt.Sprintf("%s%s \"%s\"", version.NonEmpty(), group.Group.NonEmpty(), typedClientPath))) + 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))) } } - imports = append(imports, "github.com/golang/glog") - imports = append(imports, "k8s.io/client-go/util/flowcontrol") return } @@ -70,21 +68,21 @@ func (g *genClientset) GenerateType(c *generator.Context, t *types.Type, w io.Wr // TODO: We actually don't need any type information to generate the clientset, // perhaps we can adapt the go2ild framework to this kind of usage. sw := generator.NewSnippetWriter(w, c, "$", "$") - const pkgDiscovery = "k8s.io/client-go/discovery" - const pkgRESTClient = "k8s.io/client-go/rest" allGroups := clientgentypes.ToGroupVersionPackages(g.groups) m := map[string]interface{}{ - "allGroups": allGroups, - "Config": c.Universe.Type(types.Name{Package: pkgRESTClient, Name: "Config"}), - "DefaultKubernetesUserAgent": c.Universe.Function(types.Name{Package: pkgRESTClient, Name: "DefaultKubernetesUserAgent"}), - "RESTClientInterface": c.Universe.Type(types.Name{Package: pkgRESTClient, Name: "Interface"}), - "DiscoveryInterface": c.Universe.Type(types.Name{Package: pkgDiscovery, Name: "DiscoveryInterface"}), - "DiscoveryClient": c.Universe.Type(types.Name{Package: pkgDiscovery, Name: "DiscoveryClient"}), - "NewDiscoveryClientForConfig": c.Universe.Function(types.Name{Package: pkgDiscovery, Name: "NewDiscoveryClientForConfig"}), - "NewDiscoveryClientForConfigOrDie": c.Universe.Function(types.Name{Package: pkgDiscovery, Name: "NewDiscoveryClientForConfigOrDie"}), - "NewDiscoveryClient": c.Universe.Function(types.Name{Package: pkgDiscovery, Name: "NewDiscoveryClient"}), + "allGroups": allGroups, + "Config": c.Universe.Type(types.Name{Package: "k8s.io/client-go/rest", Name: "Config"}), + "DefaultKubernetesUserAgent": c.Universe.Function(types.Name{Package: "k8s.io/client-go/rest", Name: "DefaultKubernetesUserAgent"}), + "RESTClientInterface": c.Universe.Type(types.Name{Package: "k8s.io/client-go/rest", Name: "Interface"}), + "DiscoveryInterface": c.Universe.Type(types.Name{Package: "k8s.io/client-go/discovery", Name: "DiscoveryInterface"}), + "DiscoveryClient": c.Universe.Type(types.Name{Package: "k8s.io/client-go/discovery", Name: "DiscoveryClient"}), + "NewDiscoveryClientForConfig": c.Universe.Function(types.Name{Package: "k8s.io/client-go/discovery", Name: "NewDiscoveryClientForConfig"}), + "NewDiscoveryClientForConfigOrDie": c.Universe.Function(types.Name{Package: "k8s.io/client-go/discovery", Name: "NewDiscoveryClientForConfigOrDie"}), + "NewDiscoveryClient": c.Universe.Function(types.Name{Package: "k8s.io/client-go/discovery", Name: "NewDiscoveryClient"}), + "flowcontrolNewTokenBucketRateLimiter": c.Universe.Function(types.Name{Package: "k8s.io/client-go/util/flowcontrol", Name: "NewTokenBucketRateLimiter"}), + "glogErrorf": c.Universe.Function(types.Name{Package: "github.com/golang/glog", Name: "Errorf"}), } sw.Do(clientsetInterface, m) sw.Do(clientsetTemplate, m) @@ -108,8 +106,8 @@ type Interface interface { Discovery() $.DiscoveryInterface|raw$ $range .allGroups$$.GroupVersion$() $.PackageName$.$.GroupVersion$Interface $if .IsDefaultVersion$// Deprecated: please explicitly pick a version if possible. - $.Group$() $.PackageName$.$.GroupVersion$Interface$end$ - $end$ + $.Group$() $.PackageName$.$.GroupVersion$Interface + $end$$end$ } ` @@ -159,7 +157,7 @@ var newClientsetForConfigTemplate = ` func NewForConfig(c *$.Config|raw$) (*Clientset, error) { configShallowCopy := *c if configShallowCopy.RateLimiter == nil && configShallowCopy.QPS > 0 { - configShallowCopy.RateLimiter = flowcontrol.NewTokenBucketRateLimiter(configShallowCopy.QPS, configShallowCopy.Burst) + configShallowCopy.RateLimiter = $.flowcontrolNewTokenBucketRateLimiter|raw$(configShallowCopy.QPS, configShallowCopy.Burst) } var cs Clientset var err error @@ -170,7 +168,7 @@ $range .allGroups$ cs.$.GroupVersion$Client, err =$.PackageName$.NewForConfig $end$ cs.DiscoveryClient, err = $.NewDiscoveryClientForConfig|raw$(&configShallowCopy) if err!=nil { - glog.Errorf("failed to create the DiscoveryClient: %v", err) + $.glogErrorf|raw$("failed to create the DiscoveryClient: %v", err) return nil, err } return &cs, nil diff --git a/cmd/libs/go2idl/client-gen/generators/generator_for_expansion.go b/cmd/libs/go2idl/client-gen/generators/generator_for_expansion.go index 4125aaddf35..67bac65735a 100644 --- a/cmd/libs/go2idl/client-gen/generators/generator_for_expansion.go +++ b/cmd/libs/go2idl/client-gen/generators/generator_for_expansion.go @@ -29,7 +29,7 @@ import ( // genExpansion produces a file for a group client, e.g. ExtensionsClient for the extension group. type genExpansion struct { generator.DefaultGen - groupPath string + groupPackagePath string // types in a group types []*types.Type } @@ -42,7 +42,7 @@ func (g *genExpansion) Filter(c *generator.Context, t *types.Type) bool { func (g *genExpansion) 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.groupPath, strings.ToLower(t.Name.Name+"_expansion.go"))); os.IsNotExist(err) { + if _, err := os.Stat(filepath.Join(g.groupPackagePath, strings.ToLower(t.Name.Name+"_expansion.go"))); os.IsNotExist(err) { sw.Do(expansionInterfaceTemplate, t) } } 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 158ab9dbbc9..fd514ed07ae 100644 --- a/cmd/libs/go2idl/client-gen/generators/generator_for_group.go +++ b/cmd/libs/go2idl/client-gen/generators/generator_for_group.go @@ -34,7 +34,7 @@ type genGroup struct { // types in this group types []*types.Type imports namer.ImportTracker - inputPacakge string + inputPackage string } var _ generator.Generator = &genGroup{} @@ -57,11 +57,6 @@ func (g *genGroup) Imports(c *generator.Context) (imports []string) { func (g *genGroup) GenerateType(c *generator.Context, t *types.Type, w io.Writer) error { sw := generator.NewSnippetWriter(w, c, "$", "$") - const pkgRESTClient = "k8s.io/client-go/rest" - const pkgAPI = "k8s.io/kubernetes/pkg/api" - const pkgSerializer = "k8s.io/apimachinery/pkg/runtime/serializer" - const pkgUnversioned = "k8s.io/kubernetes/pkg/api/unversioned" - const pkgSchema = "k8s.io/apimachinery/pkg/runtime/schema" apiPath := func(group string) string { if len(g.apiPath) > 0 { @@ -78,27 +73,29 @@ func (g *genGroup) GenerateType(c *generator.Context, t *types.Type, w io.Writer groupName = "" } // allow user to define a group name that's different from the one parsed from the directory. - p := c.Universe.Package(g.inputPacakge) + p := c.Universe.Package(g.inputPackage) if override := types.ExtractCommentTags("+", p.DocComments)["groupName"]; override != nil { groupName = override[0] } m := map[string]interface{}{ - "group": g.group, - "version": g.version, - "GroupVersion": namer.IC(g.group) + namer.IC(g.version), - "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"}), - "RESTClientInterface": c.Universe.Type(types.Name{Package: pkgRESTClient, Name: "Interface"}), - "RESTClientFor": c.Universe.Function(types.Name{Package: pkgRESTClient, Name: "RESTClientFor"}), - "ParseGroupVersion": c.Universe.Function(types.Name{Package: pkgSchema, Name: "ParseGroupVersion"}), - "apiPath": apiPath(g.group), - "apiRegistry": c.Universe.Variable(types.Name{Package: pkgAPI, Name: "Registry"}), - "codecs": c.Universe.Variable(types.Name{Package: pkgAPI, Name: "Codecs"}), - "directCodecFactory": c.Universe.Variable(types.Name{Package: pkgSerializer, Name: "DirectCodecFactory"}), - "Errorf": c.Universe.Variable(types.Name{Package: "fmt", Name: "Errorf"}), + "group": g.group, + "version": g.version, + "GroupVersion": namer.IC(g.group) + namer.IC(g.version), + "groupName": groupName, + "types": g.types, + "apiPath": apiPath(g.group), + "fmtErrorf": c.Universe.Function(types.Name{Package: "fmt", Name: "Errorf"}), + "runtimeAPIVersionInternal": c.Universe.Variable(types.Name{Package: "k8s.io/apimachinery/pkg/runtime", Name: "APIVersionInternal"}), + "schemaGroupVersion": c.Universe.Type(types.Name{Package: "k8s.io/apimachinery/pkg/runtime/schema", Name: "GroupVersion"}), + "schemaParseGroupVersion": c.Universe.Function(types.Name{Package: "k8s.io/apimachinery/pkg/runtime/schema", Name: "ParseGroupVersion"}), + "serializerDirectCodecFactory": c.Universe.Type(types.Name{Package: "k8s.io/apimachinery/pkg/runtime/serializer", Name: "DirectCodecFactory"}), + "restConfig": c.Universe.Type(types.Name{Package: "k8s.io/client-go/rest", Name: "Config"}), + "restDefaultKubernetesUserAgent": c.Universe.Function(types.Name{Package: "k8s.io/client-go/rest", Name: "DefaultKubernetesUserAgent"}), + "restRESTClientInterface": c.Universe.Type(types.Name{Package: "k8s.io/client-go/rest", Name: "Interface"}), + "restRESTClientFor": c.Universe.Function(types.Name{Package: "k8s.io/client-go/rest", Name: "RESTClientFor"}), + "apiCodecs": c.Universe.Variable(types.Name{Package: "k8s.io/kubernetes/pkg/api", Name: "Codecs"}), + "apiRegistry": c.Universe.Variable(types.Name{Package: "k8s.io/kubernetes/pkg/api", Name: "Registry"}), } sw.Do(groupInterfaceTemplate, m) sw.Do(groupClientTemplate, m) @@ -112,7 +109,6 @@ func (g *genGroup) GenerateType(c *generator.Context, t *types.Type, w io.Writer sw.Do(getterImplNamespaced, wrapper) } else { sw.Do(getterImplNonNamespaced, wrapper) - } } sw.Do(newClientForConfigTemplate, m) @@ -130,7 +126,7 @@ func (g *genGroup) GenerateType(c *generator.Context, t *types.Type, w io.Writer var groupInterfaceTemplate = ` type $.GroupVersion$Interface interface { - RESTClient() $.RESTClientInterface|raw$ + RESTClient() $.restRESTClientInterface|raw$ $range .types$ $.|publicPlural$Getter $end$ } @@ -139,7 +135,7 @@ type $.GroupVersion$Interface interface { var groupClientTemplate = ` // $.GroupVersion$Client is used to interact with features provided by the $.groupName$ group. type $.GroupVersion$Client struct { - restClient $.RESTClientInterface|raw$ + restClient $.restRESTClientInterface|raw$ } ` @@ -157,12 +153,12 @@ func (c *$.GroupVersion$Client) $.type|publicPlural$() $.type|public$Interface { var newClientForConfigTemplate = ` // NewForConfig creates a new $.GroupVersion$Client for the given config. -func NewForConfig(c *$.Config|raw$) (*$.GroupVersion$Client, error) { +func NewForConfig(c *$.restConfig|raw$) (*$.GroupVersion$Client, error) { config := *c if err := setConfigDefaults(&config); err != nil { return nil, err } - client, err := $.RESTClientFor|raw$(&config) + client, err := $.restRESTClientFor|raw$(&config) if err != nil { return nil, err } @@ -173,7 +169,7 @@ func NewForConfig(c *$.Config|raw$) (*$.GroupVersion$Client, error) { var newClientForConfigOrDieTemplate = ` // NewForConfigOrDie creates a new $.GroupVersion$Client for the given config and // panics if there is an error in the config. -func NewForConfigOrDie(c *$.Config|raw$) *$.GroupVersion$Client { +func NewForConfigOrDie(c *$.restConfig|raw$) *$.GroupVersion$Client { client, err := NewForConfig(c) if err != nil { panic(err) @@ -185,7 +181,7 @@ func NewForConfigOrDie(c *$.Config|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() $.RESTClientInterface|raw$ { +func (c *$.GroupVersion$Client) RESTClient() $.restRESTClientInterface|raw$ { if c == nil { return nil } @@ -195,26 +191,28 @@ func (c *$.GroupVersion$Client) RESTClient() $.RESTClientInterface|raw$ { var newClientForRESTClientTemplate = ` // New creates a new $.GroupVersion$Client for the given RESTClient. -func New(c $.RESTClientInterface|raw$) *$.GroupVersion$Client { +func New(c $.restRESTClientInterface|raw$) *$.GroupVersion$Client { return &$.GroupVersion$Client{c} } ` + var setInternalVersionClientDefaultsTemplate = ` -func setConfigDefaults(config *$.Config|raw$) error { +func setConfigDefaults(config *$.restConfig|raw$) error { // if $.group$ group is not registered, return an error g, err := $.apiRegistry|raw$.Group("$.groupName$") if err != nil { return err } + config.APIPath = $.apiPath$ if config.UserAgent == "" { - config.UserAgent = $.DefaultKubernetesUserAgent|raw$() + config.UserAgent = $.restDefaultKubernetesUserAgent|raw$() } if config.GroupVersion == nil || config.GroupVersion.Group != g.GroupVersion.Group { copyGroupVersion := g.GroupVersion config.GroupVersion = ©GroupVersion } - config.NegotiatedSerializer = $.codecs|raw$ + config.NegotiatedSerializer = $.apiCodecs|raw$ if config.QPS == 0 { config.QPS = 5 @@ -222,28 +220,29 @@ func setConfigDefaults(config *$.Config|raw$) error { if config.Burst == 0 { config.Burst = 10 } + return nil } ` var setClientDefaultsTemplate = ` -func setConfigDefaults(config *$.Config|raw$) error { - gv, err := $.ParseGroupVersion|raw$("$.groupName$/$.version$") +func setConfigDefaults(config *$.restConfig|raw$) error { + gv, err := $.schemaParseGroupVersion|raw$("$.groupName$/$.version$") if err != nil { return err } // if $.groupName$/$.version$ is not enabled, return an error if ! $.apiRegistry|raw$.IsEnabledVersion(gv) { - return $.Errorf|raw$("$.groupName$/$.version$ is not enabled") + return $.fmtErrorf|raw$("$.groupName$/$.version$ is not enabled") } config.APIPath = $.apiPath$ if config.UserAgent == "" { - config.UserAgent = $.DefaultKubernetesUserAgent|raw$() + config.UserAgent = $.restDefaultKubernetesUserAgent|raw$() } copyGroupVersion := gv config.GroupVersion = ©GroupVersion - config.NegotiatedSerializer = $.directCodecFactory|raw${CodecFactory: $.codecs|raw$} + config.NegotiatedSerializer = $.serializerDirectCodecFactory|raw${CodecFactory: $.apiCodecs|raw$} return nil } diff --git a/cmd/libs/go2idl/client-gen/types/helpers.go b/cmd/libs/go2idl/client-gen/types/helpers.go index 641026470c4..c9aed431740 100644 --- a/cmd/libs/go2idl/client-gen/types/helpers.go +++ b/cmd/libs/go2idl/client-gen/types/helpers.go @@ -94,7 +94,7 @@ func ToGroupVersionPackages(groups []GroupVersions) []GroupVersionPackage { Group: Group(namer.IC(group.Group.NonEmpty())), Version: Version(namer.IC(version.String())), GroupVersion: namer.IC(group.Group.NonEmpty()) + namer.IC(version.String()), - PackageName: strings.ToLower(version.NonEmpty() + group.Group.NonEmpty()), + PackageName: strings.ToLower(group.Group.NonEmpty() + version.NonEmpty()), IsDefaultVersion: version == defaultVersion && version != "", }) } diff --git a/federation/apis/federation/install/install_test.go b/federation/apis/federation/install/install_test.go index 89d0c34b60c..9521ae2c34b 100644 --- a/federation/apis/federation/install/install_test.go +++ b/federation/apis/federation/install/install_test.go @@ -20,12 +20,12 @@ import ( "encoding/json" "testing" + "k8s.io/apimachinery/pkg/api/meta" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/kubernetes/federation/apis/federation" "k8s.io/kubernetes/federation/apis/federation/v1beta1" "k8s.io/kubernetes/pkg/api" - "k8s.io/apimachinery/pkg/api/meta" ) func TestResourceVersioner(t *testing.T) {