func packageForGroup(gv unversioned.GroupVersion, typeList []*types.Type, packageBasePath string, srcTreePath string, boilerplate []byte, generatedBy string) generator.Package { outputPackagePath := filepath.Join(packageBasePath, gv.Group, gv.Version) return &generator.DefaultPackage{ PackageName: gv.Version, PackagePath: outputPackagePath, HeaderText: boilerplate, PackageDocumentation: []byte( generatedBy + `// This package has the automatically generated typed clients. `), // GeneratorFunc returns a list of generators. Each generator makes a // single file. GeneratorFunc: func(c *generator.Context) (generators []generator.Generator) { generators = []generator.Generator{ // Always generate a "doc.go" file. generator.DefaultGen{OptionalName: "doc"}, } // Since we want a file per type that we generate a client for, we // have to provide a function for this. for _, t := range typeList { generators = append(generators, &genClientForType{ DefaultGen: generator.DefaultGen{ OptionalName: strings.ToLower(c.Namers["private"].Name(t)), }, outputPackage: outputPackagePath, group: normalization.BeforeFirstDot(gv.Group), typeToMatch: t, imports: generator.NewImportTracker(), }) } generators = append(generators, &genGroup{ DefaultGen: generator.DefaultGen{ OptionalName: normalization.BeforeFirstDot(gv.Group) + "_client", }, outputPackage: outputPackagePath, group: gv.Group, version: gv.Version, types: typeList, imports: generator.NewImportTracker(), }) expansionFileName := "generated_expansion" // To avoid overriding user's manual modification, only generate the expansion file if it doesn't exist. if _, err := os.Stat(filepath.Join(srcTreePath, outputPackagePath, expansionFileName+".go")); os.IsNotExist(err) { generators = append(generators, &genExpansion{ DefaultGen: generator.DefaultGen{ OptionalName: expansionFileName, }, types: typeList, }) } return generators }, FilterFunc: func(c *generator.Context, t *types.Type) bool { return types.ExtractCommentTags("+", t.SecondClosestCommentLines)["genclient"] == "true" }, } }
func packageForGroup(gv unversioned.GroupVersion, typeList []*types.Type, packageBasePath string, apiPath 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, PackagePath: outputPackagePath, HeaderText: boilerplate, PackageDocumentation: []byte( generatedBy + `// This package has the automatically generated typed clients. `), // GeneratorFunc returns a list of generators. Each generator makes a // single file. GeneratorFunc: func(c *generator.Context) (generators []generator.Generator) { generators = []generator.Generator{ // Always generate a "doc.go" file. generator.DefaultGen{OptionalName: "doc"}, } // Since we want a file per type that we generate a client for, we // have to provide a function for this. for _, t := range typeList { generators = append(generators, &genClientForType{ DefaultGen: generator.DefaultGen{ OptionalName: strings.ToLower(c.Namers["private"].Name(t)), }, outputPackage: outputPackagePath, group: normalization.BeforeFirstDot(gv.Group), typeToMatch: t, imports: generator.NewImportTracker(), }) } generators = append(generators, &genGroup{ DefaultGen: generator.DefaultGen{ OptionalName: normalization.BeforeFirstDot(gv.Group) + "_client", }, outputPackage: outputPackagePath, inputPacakge: inputPath, group: gv.Group, version: gv.Version, apiPath: apiPath, types: typeList, imports: generator.NewImportTracker(), }) expansionFileName := "generated_expansion" generators = append(generators, &genExpansion{ groupPath: filepath.Join(srcTreePath, outputPackagePath), DefaultGen: generator.DefaultGen{ OptionalName: expansionFileName, }, types: typeList, }) return generators }, FilterFunc: func(c *generator.Context, t *types.Type) bool { return extractBoolTagOrDie("genclient", t.SecondClosestCommentLines) == true }, } }
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) return &generator.DefaultPackage{ PackageName: "fake", PackagePath: outputPackagePath, HeaderText: boilerplate, PackageDocumentation: []byte( generatedBy + `// Package fake has the automatically generated clients. `), // GeneratorFunc returns a list of generators. Each generator makes a // single file. GeneratorFunc: func(c *generator.Context) (generators []generator.Generator) { generators = []generator.Generator{ // Always generate a "doc.go" file. generator.DefaultGen{OptionalName: "doc"}, } // Since we want a file per type that we generate a client for, we // have to provide a function for this. for _, t := range typeList { generators = append(generators, &genFakeForType{ DefaultGen: generator.DefaultGen{ OptionalName: "fake_" + strings.ToLower(c.Namers["private"].Name(t)), }, outputPackage: outputPackagePath, group: normalization.BeforeFirstDot(gv.Group), inputPackage: inputPath, version: gv.Version, typeToMatch: t, imports: generator.NewImportTracker(), }) } generators = append(generators, &genFakeForGroup{ DefaultGen: generator.DefaultGen{ OptionalName: "fake_" + normalization.BeforeFirstDot(gv.Group) + "_client", }, outputPackage: outputPackagePath, realClientPath: realClientPath, group: normalization.BeforeFirstDot(gv.Group), types: typeList, imports: generator.NewImportTracker(), }) return generators }, FilterFunc: func(c *generator.Context, t *types.Type) bool { return types.ExtractCommentTags("+", t.SecondClosestCommentLines)["genclient"] == "true" }, } }
func packageForGroup(group string, version string, typeList []*types.Type, basePath string, boilerplate []byte) generator.Package { outputPackagePath := filepath.Join(basePath, group, version) return &generator.DefaultPackage{ PackageName: version, PackagePath: outputPackagePath, HeaderText: boilerplate, PackageDocumentation: []byte( `// Package unversioned has the automatically generated clients for unversioned resources. `), // GeneratorFunc returns a list of generators. Each generator makes a // single file. GeneratorFunc: func(c *generator.Context) (generators []generator.Generator) { generators = []generator.Generator{ // Always generate a "doc.go" file. generator.DefaultGen{OptionalName: "doc"}, } // Since we want a file per type that we generate a client for, we // have to provide a function for this. for _, t := range typeList { generators = append(generators, &genClientForType{ DefaultGen: generator.DefaultGen{ // Use the privatized version of the // type name as the file name. // // TODO: make a namer that converts // camelCase to '-' separation for file // names? OptionalName: c.Namers["private"].Name(t), }, outputPackage: outputPackagePath, group: group, typeToMatch: t, imports: generator.NewImportTracker(), }) } generators = append(generators, &genGroup{ DefaultGen: generator.DefaultGen{ OptionalName: group + "_client", }, outputPackage: outputPackagePath, group: group, types: typeList, imports: generator.NewImportTracker(), }) return generators }, FilterFunc: func(c *generator.Context, t *types.Type) bool { return types.ExtractCommentTags("+", t.SecondClosestCommentLines)["genclient"] == "true" }, } }
func PackageForClientset(customArgs clientgenargs.Args, typedClientBasePath 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"), HeaderText: boilerplate, PackageDocumentation: []byte( generatedBy + `// This package has the automatically generated fake clientset. `), // GeneratorFunc returns a list of generators. Each generator generates a // single file. GeneratorFunc: func(c *generator.Context) (generators []generator.Generator) { generators = []generator.Generator{ // Always generate a "doc.go" file. generator.DefaultGen{OptionalName: "doc"}, &genClientset{ DefaultGen: generator.DefaultGen{ OptionalName: "clientset_generated", }, groupVersions: customArgs.GroupVersions, typedClientPath: typedClientBasePath, outputPackage: "fake", imports: generator.NewImportTracker(), clientsetPath: filepath.Join(customArgs.ClientsetOutputPath, customArgs.ClientsetName), }, } return generators }, } }
func packageForClientset(customArgs clientgenargs.Args, typedClientBasePath string, boilerplate []byte) generator.Package { return &generator.DefaultPackage{ PackageName: customArgs.ClientsetName, PackagePath: filepath.Join(customArgs.ClientsetOutputPath, customArgs.ClientsetName), HeaderText: boilerplate, PackageDocumentation: []byte( `// This package has the automatically generated clientset. `), // GeneratorFunc returns a list of generators. Each generator generates a // single file. GeneratorFunc: func(c *generator.Context) (generators []generator.Generator) { generators = []generator.Generator{ &genClientset{ DefaultGen: generator.DefaultGen{ OptionalName: "clientset", }, groupVersions: customArgs.GroupVersions, typedClientPath: typedClientBasePath, outputPackage: customArgs.ClientsetName, imports: generator.NewImportTracker(), }, } return generators }, } }
func PackageForClientset(typedClientBasePath string, groupVersions []unversioned.GroupVersion, boilerplate []byte) generator.Package { return &generator.DefaultPackage{ // TODO: we'll generate fake clientset for different release in the future. // Package name and path are hard coded for now. PackageName: "fake", PackagePath: "k8s.io/kubernetes/pkg/client/testing/fake", HeaderText: boilerplate, PackageDocumentation: []byte( `// This package has the automatically generated fake clientset. `), // GeneratorFunc returns a list of generators. Each generator generates a // single file. GeneratorFunc: func(c *generator.Context) (generators []generator.Generator) { generators = []generator.Generator{ &genClientset{ DefaultGen: generator.DefaultGen{ OptionalName: "clientset_generated", }, groupVersions: groupVersions, typedClientPath: typedClientBasePath, outputPackage: "fake", imports: generator.NewImportTracker(), }, } return generators }, } }
func NewGenDeepCopy(sanitizedName, targetPackage string) generator.Generator { return &genDeepCopy{ DefaultGen: generator.DefaultGen{ OptionalName: sanitizedName, }, targetPackage: targetPackage, imports: generator.NewImportTracker(), typesForInit: make([]*types.Type, 0), } }
func NewOpenAPIGen(sanitizedName string, targetType *types.Type, context *generator.Context) generator.Generator { return &openAPIGen{ DefaultGen: generator.DefaultGen{ OptionalName: sanitizedName, }, imports: generator.NewImportTracker(), targetType: targetType, context: context, } }
func NewGenConversion(sanitizedName, targetPackage string, preexisting conversions) generator.Generator { return &genConversion{ DefaultGen: generator.DefaultGen{ OptionalName: sanitizedName, }, targetPackage: targetPackage, preexisting: preexisting, imports: generator.NewImportTracker(), typesForInit: make([]conversionType, 0), } }
func NewGenConversion(sanitizedName, targetPackage string, manualConversions conversionFuncMap, manualDefaulters defaulterFuncMap, peerPkgs []string) generator.Generator { return &genConversion{ DefaultGen: generator.DefaultGen{ OptionalName: sanitizedName, }, targetPackage: targetPackage, peerPackages: peerPkgs, manualConversions: manualConversions, manualDefaulters: manualDefaulters, imports: generator.NewImportTracker(), typesForInit: make([]conversionPair, 0), } }
func NewGenDeepCopy(sanitizedName, targetPackage string, boundingDirs []string, allTypes, registerTypes bool) generator.Generator { return &genDeepCopy{ DefaultGen: generator.DefaultGen{ OptionalName: sanitizedName, }, targetPackage: targetPackage, boundingDirs: boundingDirs, allTypes: allTypes, registerTypes: registerTypes, imports: generator.NewImportTracker(), typesForInit: make([]*types.Type, 0), } }
func NewGenDeepCopy(sanitizedName, targetPackage string, generateInitFunc, requireExplicitTag bool, canInlineTypeFn CanInlineTypeFunc) generator.Generator { return &genDeepCopy{ DefaultGen: generator.DefaultGen{ OptionalName: sanitizedName, }, targetPackage: targetPackage, imports: generator.NewImportTracker(), typesForInit: make([]*types.Type, 0), generateInitFunc: generateInitFunc, requireExplicitTag: requireExplicitTag, canInlineTypeFn: canInlineTypeFn, } }
// Packages makes the client package definition. func Packages(context *generator.Context, arguments *args.GeneratorArgs) generator.Packages { boilerplate, err := arguments.LoadGoBoilerplate() if err != nil { glog.Fatalf("Failed loading boilerplate: %v", err) } return generator.Packages{&generator.DefaultPackage{ PackageName: "unversioned", PackagePath: arguments.OutputPackagePath, HeaderText: append(boilerplate, []byte( ` // This file was autogenerated by the command: // $ `+strings.Join(os.Args, " ")+` // Do not edit it manually! `)...), PackageDocumentation: []byte( `// Package unversioned has the automatically generated clients for unversioned resources. `), // GeneratorFunc returns a list of generators. Each generator makes a // single file. GeneratorFunc: func(c *generator.Context) (generators []generator.Generator) { generators = []generator.Generator{ // Always generate a "doc.go" file. generator.DefaultGen{OptionalName: "doc"}, } // Since we want a file per type that we generate a client for, we // have to provide a function for this. for _, t := range c.Order { generators = append(generators, &genClientForType{ DefaultGen: generator.DefaultGen{ // Use the privatized version of the // type name as the file name. // // TODO: make a namer that converts // camelCase to '-' separation for file // names? OptionalName: c.Namers["private"].Name(t), }, outputPackage: arguments.OutputPackagePath, typeToMatch: t, imports: generator.NewImportTracker(), }) } return generators }, FilterFunc: func(c *generator.Context, t *types.Type) bool { return types.ExtractCommentTags("+", t.CommentLines)["genclient"] == "true" }, }} }
// Packages makes the client package definition. func Packages(context *generator.Context, arguments *args.GeneratorArgs) generator.Packages { boilerplate, err := arguments.LoadGoBoilerplate() if err != nil { glog.Fatalf("Failed loading boilerplate: %v", err) } groupToTypes := map[string][]*types.Type{} for _, inputDir := range arguments.InputDirs { p := context.Universe.Package(inputDir) for _, t := range p.Types { if types.ExtractCommentTags("+", t.CommentLines)["genclient"] != "true" { continue } group := filepath.Base(t.Name.Package) // Special case for the legacy API. if group == "api" { group = "" } if _, found := groupToTypes[group]; !found { groupToTypes[group] = []*types.Type{} } groupToTypes[group] = append(groupToTypes[group], t) } } return generator.Packages{&generator.DefaultPackage{ PackageName: filepath.Base(arguments.OutputPackagePath), PackagePath: arguments.OutputPackagePath, HeaderText: boilerplate, PackageDocumentation: []byte( `// Package unversioned has the automatically generated clients for unversioned resources. `), // GeneratorFunc returns a list of generators. Each generator makes a // single file. GeneratorFunc: func(c *generator.Context) (generators []generator.Generator) { generators = []generator.Generator{ // Always generate a "doc.go" file. generator.DefaultGen{OptionalName: "doc"}, } // Since we want a file per type that we generate a client for, we // have to provide a function for this. for _, t := range c.Order { generators = append(generators, &genClientForType{ DefaultGen: generator.DefaultGen{ // Use the privatized version of the // type name as the file name. // // TODO: make a namer that converts // camelCase to '-' separation for file // names? OptionalName: c.Namers["private"].Name(t), }, outputPackage: arguments.OutputPackagePath, typeToMatch: t, imports: generator.NewImportTracker(), }) } for group, types := range groupToTypes { generators = append(generators, &genGroup{ DefaultGen: generator.DefaultGen{ OptionalName: group, }, outputPackage: arguments.OutputPackagePath, group: group, types: types, imports: generator.NewImportTracker(), }) } return generators }, FilterFunc: func(c *generator.Context, t *types.Type) bool { return types.ExtractCommentTags("+", t.CommentLines)["genclient"] == "true" }, }} }
// Packages makes the sets package definition. func Packages(_ *generator.Context, arguments *args.GeneratorArgs) generator.Packages { boilerplate, err := arguments.LoadGoBoilerplate() if err != nil { glog.Fatalf("Failed loading boilerplate: %v", err) } return generator.Packages{&generator.DefaultPackage{ PackageName: "sets", PackagePath: arguments.OutputPackagePath, HeaderText: append(boilerplate, []byte( ` // This file was autogenerated by set-gen. Do not edit it manually! `)...), PackageDocumentation: []byte( `// Package sets has auto-generated set types. `), // GeneratorFunc returns a list of generators. Each generator makes a // single file. GeneratorFunc: func(c *generator.Context) (generators []generator.Generator) { generators = []generator.Generator{ // Always generate a "doc.go" file. generator.DefaultGen{OptionalName: "doc"}, // Make a separate file for the Empty type, since it's shared by every type. generator.DefaultGen{ OptionalName: "empty", OptionalBody: []byte(emptyTypeDecl), }, } // Since we want a file per type that we generate a set for, we // have to provide a function for this. for _, t := range c.Order { generators = append(generators, &genSet{ DefaultGen: generator.DefaultGen{ // Use the privatized version of the // type name as the file name. // // TODO: make a namer that converts // camelCase to '-' separation for file // names? OptionalName: c.Namers["private"].Name(t), }, outputPackage: arguments.OutputPackagePath, typeToMatch: t, imports: generator.NewImportTracker(), }) } return generators }, FilterFunc: func(c *generator.Context, t *types.Type) bool { // It would be reasonable to filter by the type's package here. // It might be necessary if your input directory has a big // import graph. switch t.Kind { case types.Map, types.Slice, types.Pointer: // These types can't be keys in a map. return false case types.Builtin: return true case types.Struct: // Only some structs can be keys in a map. This is triggered by the line // // +genset // or // // +genset=true return types.ExtractCommentTags("+", t.CommentLines)["genset"] == "true" } return false }, }} }