client-gen: general cleanup

This commit is contained in:
Dr. Stefan Schimanski 2017-02-19 14:03:29 +01:00
parent 0834ff7943
commit 49c536baee
10 changed files with 144 additions and 147 deletions

View File

@ -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") 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 { func packageForGroup(gv clientgentypes.GroupVersion, typeList []*types.Type, clientsetPackage string, apiPath string, srcTreePath string, inputPackage string, boilerplate []byte, generatedBy string) generator.Package {
outputPackagePath := strings.ToLower(filepath.Join(packageBasePath, gv.Group.NonEmpty(), gv.Version.NonEmpty())) groupVersionClientPackage := strings.ToLower(filepath.Join(clientsetPackage, "typed", gv.Group.NonEmpty(), gv.Version.NonEmpty()))
return &generator.DefaultPackage{ return &generator.DefaultPackage{
PackageName: strings.ToLower(gv.Version.NonEmpty()), PackageName: strings.ToLower(gv.Version.NonEmpty()),
PackagePath: outputPackagePath, PackagePath: groupVersionClientPackage,
HeaderText: boilerplate, HeaderText: boilerplate,
PackageDocumentation: []byte( PackageDocumentation: []byte(
generatedBy + generatedBy +
@ -85,7 +85,7 @@ func packageForGroup(gv clientgentypes.GroupVersion, typeList []*types.Type, pac
DefaultGen: generator.DefaultGen{ DefaultGen: generator.DefaultGen{
OptionalName: strings.ToLower(c.Namers["private"].Name(t)), OptionalName: strings.ToLower(c.Namers["private"].Name(t)),
}, },
outputPackage: outputPackagePath, outputPackage: groupVersionClientPackage,
group: gv.Group.NonEmpty(), group: gv.Group.NonEmpty(),
version: gv.Version.String(), version: gv.Version.String(),
typeToMatch: t, typeToMatch: t,
@ -97,8 +97,8 @@ func packageForGroup(gv clientgentypes.GroupVersion, typeList []*types.Type, pac
DefaultGen: generator.DefaultGen{ DefaultGen: generator.DefaultGen{
OptionalName: gv.Group.NonEmpty() + "_client", OptionalName: gv.Group.NonEmpty() + "_client",
}, },
outputPackage: outputPackagePath, outputPackage: groupVersionClientPackage,
inputPacakge: inputPath, inputPackage: inputPackage,
group: gv.Group.NonEmpty(), group: gv.Group.NonEmpty(),
version: gv.Version.String(), version: gv.Version.String(),
apiPath: apiPath, apiPath: apiPath,
@ -108,7 +108,7 @@ func packageForGroup(gv clientgentypes.GroupVersion, typeList []*types.Type, pac
expansionFileName := "generated_expansion" expansionFileName := "generated_expansion"
generators = append(generators, &genExpansion{ generators = append(generators, &genExpansion{
groupPath: filepath.Join(srcTreePath, outputPackagePath), groupPackagePath: filepath.Join(srcTreePath, groupVersionClientPackage),
DefaultGen: generator.DefaultGen{ DefaultGen: generator.DefaultGen{
OptionalName: expansionFileName, 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{ return &generator.DefaultPackage{
PackageName: customArgs.ClientsetName, PackageName: customArgs.ClientsetName,
PackagePath: filepath.Join(customArgs.ClientsetOutputPath, customArgs.ClientsetName), PackagePath: clientsetPackage,
HeaderText: boilerplate, HeaderText: boilerplate,
PackageDocumentation: []byte( PackageDocumentation: []byte(
generatedBy + generatedBy +
@ -144,7 +144,7 @@ func packageForClientset(customArgs clientgenargs.Args, typedClientBasePath stri
OptionalName: "clientset", OptionalName: "clientset",
}, },
groups: customArgs.Groups, groups: customArgs.Groups,
typedClientPath: typedClientBasePath, clientsetPackage: clientsetPackage,
outputPackage: customArgs.ClientsetName, outputPackage: customArgs.ClientsetName,
imports: generator.NewImportTracker(), imports: generator.NewImportTracker(),
}, },
@ -201,11 +201,11 @@ func Packages(context *generator.Context, arguments *args.GeneratorArgs) generat
} }
var packageList []generator.Package 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 { 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. // 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} gv := clientgentypes.GroupVersion{Group: group.Group, Version: version}
types := gvToTypes[gv] types := gvToTypes[gv]
inputPath := customArgs.GroupVersionToInputPath[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 { 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))
} }
} }
} }

View File

@ -28,13 +28,13 @@ import (
clientgentypes "k8s.io/kubernetes/cmd/libs/go2idl/client-gen/types" 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 { func PackageForGroup(gv clientgentypes.GroupVersion, typeList []*types.Type, clientsetPackage string, inputPackage string, boilerplate []byte, generatedBy string) generator.Package {
outputPackagePath := strings.ToLower(filepath.Join(packageBasePath, gv.Group.NonEmpty(), gv.Version.NonEmpty(), "fake")) 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 // 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{ return &generator.DefaultPackage{
PackageName: "fake", PackageName: "fake",
PackagePath: outputPackagePath, PackagePath: outputPackage,
HeaderText: boilerplate, HeaderText: boilerplate,
PackageDocumentation: []byte( PackageDocumentation: []byte(
generatedBy + generatedBy +
@ -54,10 +54,10 @@ func PackageForGroup(gv clientgentypes.GroupVersion, typeList []*types.Type, pac
DefaultGen: generator.DefaultGen{ DefaultGen: generator.DefaultGen{
OptionalName: "fake_" + strings.ToLower(c.Namers["private"].Name(t)), OptionalName: "fake_" + strings.ToLower(c.Namers["private"].Name(t)),
}, },
outputPackage: outputPackagePath, outputPackage: outputPackage,
inputPackage: inputPackage,
group: gv.Group.NonEmpty(), group: gv.Group.NonEmpty(),
version: gv.Version.String(), version: gv.Version.String(),
inputPackage: inputPath,
typeToMatch: t, typeToMatch: t,
imports: generator.NewImportTracker(), imports: generator.NewImportTracker(),
}) })
@ -67,8 +67,8 @@ func PackageForGroup(gv clientgentypes.GroupVersion, typeList []*types.Type, pac
DefaultGen: generator.DefaultGen{ DefaultGen: generator.DefaultGen{
OptionalName: "fake_" + gv.Group.NonEmpty() + "_client", OptionalName: "fake_" + gv.Group.NonEmpty() + "_client",
}, },
outputPackage: outputPackagePath, outputPackage: outputPackage,
realClientPath: realClientPath, realClientPackage: realClientPackage,
group: gv.Group.NonEmpty(), group: gv.Group.NonEmpty(),
version: gv.Version.String(), version: gv.Version.String(),
types: typeList, types: typeList,
@ -90,12 +90,12 @@ func extractBoolTagOrDie(key string, lines []string) bool {
return val 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{ return &generator.DefaultPackage{
// TODO: we'll generate fake clientset for different release in the future. // TODO: we'll generate fake clientset for different release in the future.
// Package name and path are hard coded for now. // Package name and path are hard coded for now.
PackageName: "fake", PackageName: "fake",
PackagePath: filepath.Join(customArgs.ClientsetOutputPath, customArgs.ClientsetName, "fake"), PackagePath: filepath.Join(fakeClientsetPackage, "fake"),
HeaderText: boilerplate, HeaderText: boilerplate,
PackageDocumentation: []byte( PackageDocumentation: []byte(
generatedBy + generatedBy +
@ -113,10 +113,10 @@ func PackageForClientset(customArgs clientgenargs.Args, typedClientBasePath stri
OptionalName: "clientset_generated", OptionalName: "clientset_generated",
}, },
groups: customArgs.Groups, groups: customArgs.Groups,
typedClientPath: typedClientBasePath, fakeClientsetPackage: fakeClientsetPackage,
outputPackage: "fake", outputPackage: "fake",
imports: generator.NewImportTracker(), imports: generator.NewImportTracker(),
clientsetPath: filepath.Join(customArgs.ClientsetOutputPath, customArgs.ClientsetName), realClientsetPackage: filepath.Join(customArgs.ClientsetOutputPath, customArgs.ClientsetName),
}, },
} }
return generators return generators

View File

@ -32,12 +32,12 @@ import (
type genClientset struct { type genClientset struct {
generator.DefaultGen generator.DefaultGen
groups []clientgentypes.GroupVersions groups []clientgentypes.GroupVersions
typedClientPath string fakeClientsetPackage string
outputPackage string outputPackage string
imports namer.ImportTracker imports namer.ImportTracker
clientsetGenerated bool clientsetGenerated bool
// the import path of the generated real clientset. // the import path of the generated real clientset.
clientsetPath string realClientsetPackage string
} }
var _ generator.Generator = &genClientset{} var _ generator.Generator = &genClientset{}
@ -59,14 +59,15 @@ func (g *genClientset) Imports(c *generator.Context) (imports []string) {
imports = append(imports, g.imports.ImportLines()...) imports = append(imports, g.imports.ImportLines()...)
for _, group := range g.groups { for _, group := range g.groups {
for _, version := range group.Versions { for _, version := range group.Versions {
typedClientPath := filepath.Join(g.typedClientPath, group.Group.NonEmpty(), version.NonEmpty()) groupClientPackage := filepath.Join(g.fakeClientsetPackage, "typed", group.Group.NonEmpty(), version.NonEmpty())
imports = append(imports, strings.ToLower(fmt.Sprintf("%s%s \"%s\"", version.NonEmpty(), group.Group.NonEmpty(), typedClientPath))) fakeGroupClientPackage := filepath.Join(groupClientPackage, "fake")
fakeTypedClientPath := filepath.Join(typedClientPath, "fake")
imports = append(imports, strings.ToLower(fmt.Sprintf("fake%s%s \"%s\"", version.NonEmpty(), group.Group.NonEmpty(), fakeTypedClientPath))) 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 // 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 for the code in commonTemplate
imports = append(imports, imports = append(imports,
"k8s.io/kubernetes/pkg/api", "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. // perhaps we can adapt the go2ild framework to this kind of usage.
sw := generator.NewSnippetWriter(w, c, "$", "$") sw := generator.NewSnippetWriter(w, c, "$", "$")
sw.Do(common, nil)
sw.Do(checkImpl, nil)
allGroups := clientgentypes.ToGroupVersionPackages(g.groups) allGroups := clientgentypes.ToGroupVersionPackages(g.groups)
sw.Do(common, nil)
sw.Do(checkImpl, nil)
for _, g := range allGroups { for _, g := range allGroups {
sw.Do(clientsetInterfaceImplTemplate, g) sw.Do(clientsetInterfaceImplTemplate, g)
// don't generated the default method if generating internalversion clientset // don't generated the default method if generating internalversion clientset

View File

@ -31,7 +31,7 @@ import (
type genFakeForGroup struct { type genFakeForGroup struct {
generator.DefaultGen generator.DefaultGen
outputPackage string outputPackage string
realClientPath string realClientPackage string
group string group string
version string version string
// types in this group // types in this group
@ -53,27 +53,27 @@ func (g *genFakeForGroup) Namers(c *generator.Context) namer.NameSystems {
} }
func (g *genFakeForGroup) Imports(c *generator.Context) (imports []string) { 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 return imports
} }
func (g *genFakeForGroup) GenerateType(c *generator.Context, t *types.Type, w io.Writer) error { func (g *genFakeForGroup) GenerateType(c *generator.Context, t *types.Type, w io.Writer) error {
sw := generator.NewSnippetWriter(w, c, "$", "$") sw := generator.NewSnippetWriter(w, c, "$", "$")
const pkgTestingCore = "k8s.io/client-go/testing"
const pkgRESTClient = "k8s.io/client-go/rest"
m := map[string]interface{}{ m := map[string]interface{}{
"group": g.group, "group": g.group,
"GroupVersion": namer.IC(g.group) + namer.IC(g.version), "GroupVersion": namer.IC(g.group) + namer.IC(g.version),
"Fake": c.Universe.Type(types.Name{Package: pkgTestingCore, Name: "Fake"}), "Fake": c.Universe.Type(types.Name{Package: "k8s.io/client-go/testing", Name: "Fake"}),
"RESTClientInterface": c.Universe.Type(types.Name{Package: pkgRESTClient, Name: "Interface"}), "RESTClientInterface": c.Universe.Type(types.Name{Package: "k8s.io/client-go/rest", Name: "Interface"}),
"RESTClient": c.Universe.Type(types.Name{Package: pkgRESTClient, Name: "RESTClient"}), "RESTClient": c.Universe.Type(types.Name{Package: "k8s.io/client-go/rest", Name: "RESTClient"}),
} }
sw.Do(groupClientTemplate, m) sw.Do(groupClientTemplate, m)
for _, t := range g.types { for _, t := range g.types {
wrapper := map[string]interface{}{ wrapper := map[string]interface{}{
"type": t, "type": t,
"GroupVersion": namer.IC(g.group) + namer.IC(g.version), "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) namespaced := !extractBoolTagOrDie("nonNamespaced", t.SecondClosestCommentLines)
if namespaced { if namespaced {

View File

@ -87,7 +87,6 @@ func hasObjectMeta(t *types.Type) bool {
func (g *genFakeForType) GenerateType(c *generator.Context, t *types.Type, w io.Writer) error { func (g *genFakeForType) GenerateType(c *generator.Context, t *types.Type, w io.Writer) error {
sw := generator.NewSnippetWriter(w, c, "$", "$") sw := generator.NewSnippetWriter(w, c, "$", "$")
pkg := filepath.Base(t.Name.Package) pkg := filepath.Base(t.Name.Package)
const pkgTestingCore = "k8s.io/client-go/testing"
namespaced := !extractBoolTagOrDie("nonNamespaced", t.SecondClosestCommentLines) namespaced := !extractBoolTagOrDie("nonNamespaced", t.SecondClosestCommentLines)
canonicalGroup := g.group canonicalGroup := g.group
if canonicalGroup == "core" { if canonicalGroup == "core" {
@ -105,6 +104,7 @@ func (g *genFakeForType) GenerateType(c *generator.Context, t *types.Type, w io.
groupName = override[0] groupName = override[0]
} }
const pkgClientGoTesting = "k8s.io/client-go/testing"
m := map[string]interface{}{ m := map[string]interface{}{
"type": t, "type": t,
"package": pkg, "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"}), "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"}), "watchInterface": c.Universe.Type(types.Name{Package: "k8s.io/apimachinery/pkg/watch", Name: "Interface"}),
"NewRootListAction": c.Universe.Function(types.Name{Package: pkgTestingCore, Name: "NewRootListAction"}), "NewRootListAction": c.Universe.Function(types.Name{Package: pkgClientGoTesting, Name: "NewRootListAction"}),
"NewListAction": c.Universe.Function(types.Name{Package: pkgTestingCore, Name: "NewListAction"}), "NewListAction": c.Universe.Function(types.Name{Package: pkgClientGoTesting, Name: "NewListAction"}),
"NewRootGetAction": c.Universe.Function(types.Name{Package: pkgTestingCore, Name: "NewRootGetAction"}), "NewRootGetAction": c.Universe.Function(types.Name{Package: pkgClientGoTesting, Name: "NewRootGetAction"}),
"NewGetAction": c.Universe.Function(types.Name{Package: pkgTestingCore, Name: "NewGetAction"}), "NewGetAction": c.Universe.Function(types.Name{Package: pkgClientGoTesting, Name: "NewGetAction"}),
"NewRootDeleteAction": c.Universe.Function(types.Name{Package: pkgTestingCore, Name: "NewRootDeleteAction"}), "NewRootDeleteAction": c.Universe.Function(types.Name{Package: pkgClientGoTesting, Name: "NewRootDeleteAction"}),
"NewDeleteAction": c.Universe.Function(types.Name{Package: pkgTestingCore, Name: "NewDeleteAction"}), "NewDeleteAction": c.Universe.Function(types.Name{Package: pkgClientGoTesting, Name: "NewDeleteAction"}),
"NewRootDeleteCollectionAction": c.Universe.Function(types.Name{Package: pkgTestingCore, Name: "NewRootDeleteCollectionAction"}), "NewRootDeleteCollectionAction": c.Universe.Function(types.Name{Package: pkgClientGoTesting, Name: "NewRootDeleteCollectionAction"}),
"NewDeleteCollectionAction": c.Universe.Function(types.Name{Package: pkgTestingCore, Name: "NewDeleteCollectionAction"}), "NewDeleteCollectionAction": c.Universe.Function(types.Name{Package: pkgClientGoTesting, Name: "NewDeleteCollectionAction"}),
"NewRootUpdateAction": c.Universe.Function(types.Name{Package: pkgTestingCore, Name: "NewRootUpdateAction"}), "NewRootUpdateAction": c.Universe.Function(types.Name{Package: pkgClientGoTesting, Name: "NewRootUpdateAction"}),
"NewUpdateAction": c.Universe.Function(types.Name{Package: pkgTestingCore, Name: "NewUpdateAction"}), "NewUpdateAction": c.Universe.Function(types.Name{Package: pkgClientGoTesting, Name: "NewUpdateAction"}),
"NewRootCreateAction": c.Universe.Function(types.Name{Package: pkgTestingCore, Name: "NewRootCreateAction"}), "NewRootCreateAction": c.Universe.Function(types.Name{Package: pkgClientGoTesting, Name: "NewRootCreateAction"}),
"NewCreateAction": c.Universe.Function(types.Name{Package: pkgTestingCore, Name: "NewCreateAction"}), "NewCreateAction": c.Universe.Function(types.Name{Package: pkgClientGoTesting, Name: "NewCreateAction"}),
"NewRootWatchAction": c.Universe.Function(types.Name{Package: pkgTestingCore, Name: "NewRootWatchAction"}), "NewRootWatchAction": c.Universe.Function(types.Name{Package: pkgClientGoTesting, Name: "NewRootWatchAction"}),
"NewWatchAction": c.Universe.Function(types.Name{Package: pkgTestingCore, Name: "NewWatchAction"}), "NewWatchAction": c.Universe.Function(types.Name{Package: pkgClientGoTesting, Name: "NewWatchAction"}),
"NewUpdateSubresourceAction": c.Universe.Function(types.Name{Package: pkgTestingCore, Name: "NewUpdateSubresourceAction"}), "NewUpdateSubresourceAction": c.Universe.Function(types.Name{Package: pkgClientGoTesting, Name: "NewUpdateSubresourceAction"}),
"NewRootUpdateSubresourceAction": c.Universe.Function(types.Name{Package: pkgTestingCore, Name: "NewRootUpdateSubresourceAction"}), "NewRootUpdateSubresourceAction": c.Universe.Function(types.Name{Package: pkgClientGoTesting, Name: "NewRootUpdateSubresourceAction"}),
"NewRootPatchAction": c.Universe.Function(types.Name{Package: pkgTestingCore, Name: "NewRootPatchAction"}), "NewRootPatchAction": c.Universe.Function(types.Name{Package: pkgClientGoTesting, Name: "NewRootPatchAction"}),
"NewPatchAction": c.Universe.Function(types.Name{Package: pkgTestingCore, Name: "NewPatchAction"}), "NewPatchAction": c.Universe.Function(types.Name{Package: pkgClientGoTesting, Name: "NewPatchAction"}),
"NewRootPatchSubresourceAction": c.Universe.Function(types.Name{Package: pkgTestingCore, Name: "NewRootPatchSubresourceAction"}), "NewRootPatchSubresourceAction": c.Universe.Function(types.Name{Package: pkgClientGoTesting, Name: "NewRootPatchSubresourceAction"}),
"NewPatchSubresourceAction": c.Universe.Function(types.Name{Package: pkgTestingCore, Name: "NewPatchSubresourceAction"}), "NewPatchSubresourceAction": c.Universe.Function(types.Name{Package: pkgClientGoTesting, Name: "NewPatchSubresourceAction"}),
"ExtractFromListOptions": c.Universe.Function(types.Name{Package: pkgTestingCore, Name: "ExtractFromListOptions"}), "ExtractFromListOptions": c.Universe.Function(types.Name{Package: pkgClientGoTesting, Name: "ExtractFromListOptions"}),
} }
noMethods := extractBoolTagOrDie("noMethods", t.SecondClosestCommentLines) == true noMethods := extractBoolTagOrDie("noMethods", t.SecondClosestCommentLines) == true

View File

@ -32,7 +32,7 @@ import (
type genClientset struct { type genClientset struct {
generator.DefaultGen generator.DefaultGen
groups []clientgentypes.GroupVersions groups []clientgentypes.GroupVersions
typedClientPath string clientsetPackage string
outputPackage string outputPackage string
imports namer.ImportTracker imports namer.ImportTracker
clientsetGenerated bool clientsetGenerated bool
@ -57,12 +57,10 @@ func (g *genClientset) Imports(c *generator.Context) (imports []string) {
imports = append(imports, g.imports.ImportLines()...) imports = append(imports, g.imports.ImportLines()...)
for _, group := range g.groups { for _, group := range g.groups {
for _, version := range group.Versions { for _, version := range group.Versions {
typedClientPath := filepath.Join(g.typedClientPath, group.Group.NonEmpty(), version.NonEmpty()) typedClientPath := filepath.Join(g.clientsetPackage, "typed", group.Group.NonEmpty(), version.NonEmpty())
imports = append(imports, strings.ToLower(fmt.Sprintf("%s%s \"%s\"", version.NonEmpty(), group.Group.NonEmpty(), typedClientPath))) 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 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, // 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. // perhaps we can adapt the go2ild framework to this kind of usage.
sw := generator.NewSnippetWriter(w, c, "$", "$") sw := generator.NewSnippetWriter(w, c, "$", "$")
const pkgDiscovery = "k8s.io/client-go/discovery"
const pkgRESTClient = "k8s.io/client-go/rest"
allGroups := clientgentypes.ToGroupVersionPackages(g.groups) allGroups := clientgentypes.ToGroupVersionPackages(g.groups)
m := map[string]interface{}{ m := map[string]interface{}{
"allGroups": allGroups, "allGroups": allGroups,
"Config": c.Universe.Type(types.Name{Package: pkgRESTClient, Name: "Config"}), "Config": c.Universe.Type(types.Name{Package: "k8s.io/client-go/rest", Name: "Config"}),
"DefaultKubernetesUserAgent": c.Universe.Function(types.Name{Package: pkgRESTClient, Name: "DefaultKubernetesUserAgent"}), "DefaultKubernetesUserAgent": c.Universe.Function(types.Name{Package: "k8s.io/client-go/rest", Name: "DefaultKubernetesUserAgent"}),
"RESTClientInterface": c.Universe.Type(types.Name{Package: pkgRESTClient, Name: "Interface"}), "RESTClientInterface": c.Universe.Type(types.Name{Package: "k8s.io/client-go/rest", Name: "Interface"}),
"DiscoveryInterface": c.Universe.Type(types.Name{Package: pkgDiscovery, Name: "DiscoveryInterface"}), "DiscoveryInterface": c.Universe.Type(types.Name{Package: "k8s.io/client-go/discovery", Name: "DiscoveryInterface"}),
"DiscoveryClient": c.Universe.Type(types.Name{Package: pkgDiscovery, Name: "DiscoveryClient"}), "DiscoveryClient": c.Universe.Type(types.Name{Package: "k8s.io/client-go/discovery", Name: "DiscoveryClient"}),
"NewDiscoveryClientForConfig": c.Universe.Function(types.Name{Package: pkgDiscovery, Name: "NewDiscoveryClientForConfig"}), "NewDiscoveryClientForConfig": c.Universe.Function(types.Name{Package: "k8s.io/client-go/discovery", Name: "NewDiscoveryClientForConfig"}),
"NewDiscoveryClientForConfigOrDie": c.Universe.Function(types.Name{Package: pkgDiscovery, Name: "NewDiscoveryClientForConfigOrDie"}), "NewDiscoveryClientForConfigOrDie": c.Universe.Function(types.Name{Package: "k8s.io/client-go/discovery", Name: "NewDiscoveryClientForConfigOrDie"}),
"NewDiscoveryClient": c.Universe.Function(types.Name{Package: pkgDiscovery, Name: "NewDiscoveryClient"}), "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(clientsetInterface, m)
sw.Do(clientsetTemplate, m) sw.Do(clientsetTemplate, m)
@ -108,8 +106,8 @@ type Interface interface {
Discovery() $.DiscoveryInterface|raw$ Discovery() $.DiscoveryInterface|raw$
$range .allGroups$$.GroupVersion$() $.PackageName$.$.GroupVersion$Interface $range .allGroups$$.GroupVersion$() $.PackageName$.$.GroupVersion$Interface
$if .IsDefaultVersion$// Deprecated: please explicitly pick a version if possible. $if .IsDefaultVersion$// Deprecated: please explicitly pick a version if possible.
$.Group$() $.PackageName$.$.GroupVersion$Interface$end$ $.Group$() $.PackageName$.$.GroupVersion$Interface
$end$ $end$$end$
} }
` `
@ -159,7 +157,7 @@ var newClientsetForConfigTemplate = `
func NewForConfig(c *$.Config|raw$) (*Clientset, error) { func NewForConfig(c *$.Config|raw$) (*Clientset, error) {
configShallowCopy := *c configShallowCopy := *c
if configShallowCopy.RateLimiter == nil && configShallowCopy.QPS > 0 { 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 cs Clientset
var err error var err error
@ -170,7 +168,7 @@ $range .allGroups$ cs.$.GroupVersion$Client, err =$.PackageName$.NewForConfig
$end$ $end$
cs.DiscoveryClient, err = $.NewDiscoveryClientForConfig|raw$(&configShallowCopy) cs.DiscoveryClient, err = $.NewDiscoveryClientForConfig|raw$(&configShallowCopy)
if err!=nil { 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 nil, err
} }
return &cs, nil return &cs, nil

View File

@ -29,7 +29,7 @@ import (
// genExpansion produces a file for a group client, e.g. ExtensionsClient for the extension group. // genExpansion produces a file for a group client, e.g. ExtensionsClient for the extension group.
type genExpansion struct { type genExpansion struct {
generator.DefaultGen generator.DefaultGen
groupPath string groupPackagePath string
// types in a group // types in a group
types []*types.Type 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 { func (g *genExpansion) GenerateType(c *generator.Context, t *types.Type, w io.Writer) error {
sw := generator.NewSnippetWriter(w, c, "$", "$") sw := generator.NewSnippetWriter(w, c, "$", "$")
for _, t := range g.types { 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) sw.Do(expansionInterfaceTemplate, t)
} }
} }

View File

@ -34,7 +34,7 @@ type genGroup struct {
// types in this group // types in this group
types []*types.Type types []*types.Type
imports namer.ImportTracker imports namer.ImportTracker
inputPacakge string inputPackage string
} }
var _ generator.Generator = &genGroup{} 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 { func (g *genGroup) GenerateType(c *generator.Context, t *types.Type, w io.Writer) error {
sw := generator.NewSnippetWriter(w, c, "$", "$") 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 { apiPath := func(group string) string {
if len(g.apiPath) > 0 { if len(g.apiPath) > 0 {
@ -78,7 +73,7 @@ func (g *genGroup) GenerateType(c *generator.Context, t *types.Type, w io.Writer
groupName = "" groupName = ""
} }
// allow user to define a group name that's different from the one parsed from the directory. // 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 { if override := types.ExtractCommentTags("+", p.DocComments)["groupName"]; override != nil {
groupName = override[0] groupName = override[0]
} }
@ -89,16 +84,18 @@ func (g *genGroup) GenerateType(c *generator.Context, t *types.Type, w io.Writer
"GroupVersion": namer.IC(g.group) + namer.IC(g.version), "GroupVersion": namer.IC(g.group) + namer.IC(g.version),
"groupName": groupName, "groupName": groupName,
"types": g.types, "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), "apiPath": apiPath(g.group),
"apiRegistry": c.Universe.Variable(types.Name{Package: pkgAPI, Name: "Registry"}), "fmtErrorf": c.Universe.Function(types.Name{Package: "fmt", Name: "Errorf"}),
"codecs": c.Universe.Variable(types.Name{Package: pkgAPI, Name: "Codecs"}), "runtimeAPIVersionInternal": c.Universe.Variable(types.Name{Package: "k8s.io/apimachinery/pkg/runtime", Name: "APIVersionInternal"}),
"directCodecFactory": c.Universe.Variable(types.Name{Package: pkgSerializer, Name: "DirectCodecFactory"}), "schemaGroupVersion": c.Universe.Type(types.Name{Package: "k8s.io/apimachinery/pkg/runtime/schema", Name: "GroupVersion"}),
"Errorf": c.Universe.Variable(types.Name{Package: "fmt", Name: "Errorf"}), "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(groupInterfaceTemplate, m)
sw.Do(groupClientTemplate, 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) sw.Do(getterImplNamespaced, wrapper)
} else { } else {
sw.Do(getterImplNonNamespaced, wrapper) sw.Do(getterImplNonNamespaced, wrapper)
} }
} }
sw.Do(newClientForConfigTemplate, m) sw.Do(newClientForConfigTemplate, m)
@ -130,7 +126,7 @@ func (g *genGroup) GenerateType(c *generator.Context, t *types.Type, w io.Writer
var groupInterfaceTemplate = ` var groupInterfaceTemplate = `
type $.GroupVersion$Interface interface { type $.GroupVersion$Interface interface {
RESTClient() $.RESTClientInterface|raw$ RESTClient() $.restRESTClientInterface|raw$
$range .types$ $.|publicPlural$Getter $range .types$ $.|publicPlural$Getter
$end$ $end$
} }
@ -139,7 +135,7 @@ type $.GroupVersion$Interface interface {
var groupClientTemplate = ` var groupClientTemplate = `
// $.GroupVersion$Client is used to interact with features provided by the $.groupName$ group. // $.GroupVersion$Client is used to interact with features provided by the $.groupName$ group.
type $.GroupVersion$Client struct { 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 = ` var newClientForConfigTemplate = `
// NewForConfig creates a new $.GroupVersion$Client for the given config. // 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 config := *c
if err := setConfigDefaults(&config); err != nil { if err := setConfigDefaults(&config); err != nil {
return nil, err return nil, err
} }
client, err := $.RESTClientFor|raw$(&config) client, err := $.restRESTClientFor|raw$(&config)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -173,7 +169,7 @@ func NewForConfig(c *$.Config|raw$) (*$.GroupVersion$Client, error) {
var newClientForConfigOrDieTemplate = ` var newClientForConfigOrDieTemplate = `
// NewForConfigOrDie creates a new $.GroupVersion$Client for the given config and // NewForConfigOrDie creates a new $.GroupVersion$Client for the given config and
// panics if there is an error in the config. // 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) client, err := NewForConfig(c)
if err != nil { if err != nil {
panic(err) panic(err)
@ -185,7 +181,7 @@ func NewForConfigOrDie(c *$.Config|raw$) *$.GroupVersion$Client {
var getRESTClient = ` var getRESTClient = `
// RESTClient returns a RESTClient that is used to communicate // RESTClient returns a RESTClient that is used to communicate
// with API server by this client implementation. // with API server by this client implementation.
func (c *$.GroupVersion$Client) RESTClient() $.RESTClientInterface|raw$ { func (c *$.GroupVersion$Client) RESTClient() $.restRESTClientInterface|raw$ {
if c == nil { if c == nil {
return nil return nil
} }
@ -195,26 +191,28 @@ func (c *$.GroupVersion$Client) RESTClient() $.RESTClientInterface|raw$ {
var newClientForRESTClientTemplate = ` var newClientForRESTClientTemplate = `
// New creates a new $.GroupVersion$Client for the given RESTClient. // 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} return &$.GroupVersion$Client{c}
} }
` `
var setInternalVersionClientDefaultsTemplate = ` var setInternalVersionClientDefaultsTemplate = `
func setConfigDefaults(config *$.Config|raw$) error { func setConfigDefaults(config *$.restConfig|raw$) error {
// if $.group$ group is not registered, return an error // if $.group$ group is not registered, return an error
g, err := $.apiRegistry|raw$.Group("$.groupName$") g, err := $.apiRegistry|raw$.Group("$.groupName$")
if err != nil { if err != nil {
return err return err
} }
config.APIPath = $.apiPath$ config.APIPath = $.apiPath$
if config.UserAgent == "" { if config.UserAgent == "" {
config.UserAgent = $.DefaultKubernetesUserAgent|raw$() config.UserAgent = $.restDefaultKubernetesUserAgent|raw$()
} }
if config.GroupVersion == nil || config.GroupVersion.Group != g.GroupVersion.Group { if config.GroupVersion == nil || config.GroupVersion.Group != g.GroupVersion.Group {
copyGroupVersion := g.GroupVersion copyGroupVersion := g.GroupVersion
config.GroupVersion = &copyGroupVersion config.GroupVersion = &copyGroupVersion
} }
config.NegotiatedSerializer = $.codecs|raw$ config.NegotiatedSerializer = $.apiCodecs|raw$
if config.QPS == 0 { if config.QPS == 0 {
config.QPS = 5 config.QPS = 5
@ -222,28 +220,29 @@ func setConfigDefaults(config *$.Config|raw$) error {
if config.Burst == 0 { if config.Burst == 0 {
config.Burst = 10 config.Burst = 10
} }
return nil return nil
} }
` `
var setClientDefaultsTemplate = ` var setClientDefaultsTemplate = `
func setConfigDefaults(config *$.Config|raw$) error { func setConfigDefaults(config *$.restConfig|raw$) error {
gv, err := $.ParseGroupVersion|raw$("$.groupName$/$.version$") gv, err := $.schemaParseGroupVersion|raw$("$.groupName$/$.version$")
if err != nil { if err != nil {
return err return err
} }
// if $.groupName$/$.version$ is not enabled, return an error // if $.groupName$/$.version$ is not enabled, return an error
if ! $.apiRegistry|raw$.IsEnabledVersion(gv) { if ! $.apiRegistry|raw$.IsEnabledVersion(gv) {
return $.Errorf|raw$("$.groupName$/$.version$ is not enabled") return $.fmtErrorf|raw$("$.groupName$/$.version$ is not enabled")
} }
config.APIPath = $.apiPath$ config.APIPath = $.apiPath$
if config.UserAgent == "" { if config.UserAgent == "" {
config.UserAgent = $.DefaultKubernetesUserAgent|raw$() config.UserAgent = $.restDefaultKubernetesUserAgent|raw$()
} }
copyGroupVersion := gv copyGroupVersion := gv
config.GroupVersion = &copyGroupVersion config.GroupVersion = &copyGroupVersion
config.NegotiatedSerializer = $.directCodecFactory|raw${CodecFactory: $.codecs|raw$} config.NegotiatedSerializer = $.serializerDirectCodecFactory|raw${CodecFactory: $.apiCodecs|raw$}
return nil return nil
} }

View File

@ -94,7 +94,7 @@ func ToGroupVersionPackages(groups []GroupVersions) []GroupVersionPackage {
Group: Group(namer.IC(group.Group.NonEmpty())), Group: Group(namer.IC(group.Group.NonEmpty())),
Version: Version(namer.IC(version.String())), Version: Version(namer.IC(version.String())),
GroupVersion: namer.IC(group.Group.NonEmpty()) + 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 != "", IsDefaultVersion: version == defaultVersion && version != "",
}) })
} }

View File

@ -20,12 +20,12 @@ import (
"encoding/json" "encoding/json"
"testing" "testing"
"k8s.io/apimachinery/pkg/api/meta"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime"
"k8s.io/kubernetes/federation/apis/federation" "k8s.io/kubernetes/federation/apis/federation"
"k8s.io/kubernetes/federation/apis/federation/v1beta1" "k8s.io/kubernetes/federation/apis/federation/v1beta1"
"k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api"
"k8s.io/apimachinery/pkg/api/meta"
) )
func TestResourceVersioner(t *testing.T) { func TestResourceVersioner(t *testing.T) {