func (g *genericGenerator) GenerateType(c *generator.Context, t *types.Type, w io.Writer) error { sw := generator.NewSnippetWriter(w, c, "{{", "}}") groups := []group{} schemeGVs := make(map[*version]*types.Type) orderer := namer.Orderer{Namer: namer.NewPrivateNamer(0)} for _, groupVersions := range g.groupVersions { group := group{ Name: namer.IC(groupVersions.Group.NonEmpty()), Versions: []*version{}, } for _, v := range groupVersions.Versions { gv := clientgentypes.GroupVersion{Group: groupVersions.Group, Version: v} version := &version{ Name: namer.IC(v.NonEmpty()), Resources: orderer.OrderTypes(g.typesForGroupVersion[gv]), } schemeGVs[version] = c.Universe.Variable(types.Name{Package: g.typesForGroupVersion[gv][0].Name.Package, Name: "SchemeGroupVersion"}) group.Versions = append(group.Versions, version) } sort.Sort(versionSort(group.Versions)) groups = append(groups, group) } sort.Sort(groupSort(groups)) m := map[string]interface{}{ "cacheGenericLister": c.Universe.Type(cacheGenericLister), "cacheNewGenericLister": c.Universe.Function(cacheNewGenericLister), "cacheSharedIndexInformer": c.Universe.Type(cacheSharedIndexInformer), "groups": groups, "schemeGVs": schemeGVs, "schemaGroupResource": c.Universe.Type(schemaGroupResource), "schemaGroupVersionResource": c.Universe.Type(schemaGroupVersionResource), } sw.Do(genericInformer, m) sw.Do(forResource, m) return sw.Error() }
// 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) } customArgs, ok := arguments.CustomArgs.(clientgenargs.Args) if !ok { glog.Fatalf("cannot convert arguments.CustomArgs to clientgenargs.Args") } includedTypesOverrides := customArgs.IncludedTypesOverrides generatedBy := generatedBy(customArgs) gvToTypes := map[unversioned.GroupVersion][]*types.Type{} for gv, inputDir := range customArgs.GroupVersionToInputPath { p := context.Universe.Package(inputDir) for n, t := range p.Types { // filter out types which are not included in user specified overrides. typesOverride, ok := includedTypesOverrides[gv] if ok { found := false for _, typeStr := range typesOverride { if typeStr == n { found = true break } } if !found { continue } } else { // User has not specified any override for this group version. // filter out types which dont have genclient=true. if extractBoolTagOrDie("genclient", t.SecondClosestCommentLines) == false { continue } } if _, found := gvToTypes[gv]; !found { gvToTypes[gv] = []*types.Type{} } gvToTypes[gv] = append(gvToTypes[gv], t) } } var packageList []generator.Package typedClientBasePath := filepath.Join(customArgs.ClientsetOutputPath, customArgs.ClientsetName, "typed") packageList = append(packageList, packageForClientset(customArgs, typedClientBasePath, boilerplate, generatedBy)) if customArgs.FakeClient { packageList = append(packageList, fake.PackageForClientset(customArgs, typedClientBasePath, boilerplate, generatedBy)) } // If --clientset-only=true, we don't regenerate the individual typed clients. if customArgs.ClientsetOnly { return generator.Packages(packageList) } orderer := namer.Orderer{Namer: namer.NewPrivateNamer(0)} for _, gv := range customArgs.GroupVersions { types := gvToTypes[gv] inputPath := customArgs.GroupVersionToInputPath[gv] packageList = append(packageList, packageForGroup(normalization.GroupVersion(gv), orderer.OrderTypes(types), typedClientBasePath, arguments.OutputBase, inputPath, boilerplate, generatedBy)) if customArgs.FakeClient { packageList = append(packageList, fake.PackageForGroup(normalization.GroupVersion(gv), orderer.OrderTypes(types), typedClientBasePath, arguments.OutputBase, inputPath, boilerplate, generatedBy)) } } return generator.Packages(packageList) }
// 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) } boilerplate = append(boilerplate, []byte(generatedBy())...) customArgs, ok := arguments.CustomArgs.(*CustomArgs) if !ok { glog.Fatalf("Wrong CustomArgs type: %T", arguments.CustomArgs) } var packageList generator.Packages typesForGroupVersion := make(map[clientgentypes.GroupVersion][]*types.Type) groupVersions := make(map[string]clientgentypes.GroupVersions) for _, inputDir := range arguments.InputDirs { p := context.Universe.Package(inputDir) objectMeta, err := objectMetaForPackage(p) if err != nil { glog.Fatal(err) } if objectMeta == nil { // no types in this package had genclient continue } var gv clientgentypes.GroupVersion if isInternal(objectMeta) { lastSlash := strings.LastIndex(p.Path, "/") if lastSlash == -1 { glog.Fatalf("error constructing internal group version for package %q", p.Path) } gv.Group = clientgentypes.Group(p.Path[lastSlash+1:]) } else { parts := strings.Split(p.Path, "/") gv.Group = clientgentypes.Group(parts[len(parts)-2]) gv.Version = clientgentypes.Version(parts[len(parts)-1]) } var typesToGenerate []*types.Type for _, t := range p.Types { // filter out types which dont have genclient=true. if extractBoolTagOrDie("genclient", t.SecondClosestCommentLines) == false { continue } // filter out types which have noMethods if extractBoolTagOrDie("noMethods", t.SecondClosestCommentLines) == true { continue } typesToGenerate = append(typesToGenerate, t) if _, ok := typesForGroupVersion[gv]; !ok { typesForGroupVersion[gv] = []*types.Type{} } typesForGroupVersion[gv] = append(typesForGroupVersion[gv], t) } if len(typesToGenerate) == 0 { continue } icGroupName := namer.IC(gv.Group.NonEmpty()) groupVersionsEntry, ok := groupVersions[icGroupName] if !ok { groupVersionsEntry = clientgentypes.GroupVersions{ Group: gv.Group, } } groupVersionsEntry.Versions = append(groupVersionsEntry.Versions, gv.Version) groupVersions[icGroupName] = groupVersionsEntry orderer := namer.Orderer{Namer: namer.NewPrivateNamer(0)} typesToGenerate = orderer.OrderTypes(typesToGenerate) packageList = append(packageList, versionPackage(arguments.OutputPackagePath, gv, boilerplate, typesToGenerate, customArgs.InternalClientSetPackage, customArgs.VersionedClientSetPackage, customArgs.ListersPackage)) } packageList = append(packageList, factoryInterfacePackage(arguments.OutputPackagePath, boilerplate, customArgs.InternalClientSetPackage, customArgs.VersionedClientSetPackage, typesForGroupVersion)) packageList = append(packageList, factoryPackage(arguments.OutputPackagePath, boilerplate, groupVersions, customArgs.InternalClientSetPackage, customArgs.VersionedClientSetPackage, typesForGroupVersion)) for _, groupVersionsEntry := range groupVersions { packageList = append(packageList, groupPackage(arguments.OutputPackagePath, groupVersionsEntry, boilerplate)) } return packageList }
// 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) } boilerplate = append(boilerplate, []byte(generatedBy())...) var packageList generator.Packages for _, inputDir := range arguments.InputDirs { p := context.Universe.Package(inputDir) objectMeta, err := objectMetaForPackage(p) if err != nil { glog.Fatal(err) } if objectMeta == nil { // no types in this package had genclient continue } var gv clientgentypes.GroupVersion var internalGVPkg string if isInternal(objectMeta) { lastSlash := strings.LastIndex(p.Path, "/") if lastSlash == -1 { glog.Fatalf("error constructing internal group version for package %q", p.Path) } gv.Group = clientgentypes.Group(p.Path[lastSlash+1:]) internalGVPkg = p.Path } else { parts := strings.Split(p.Path, "/") gv.Group = clientgentypes.Group(parts[len(parts)-2]) gv.Version = clientgentypes.Version(parts[len(parts)-1]) internalGVPkg = strings.Join(parts[0:len(parts)-1], "/") } var typesToGenerate []*types.Type for _, t := range p.Types { // filter out types which dont have genclient=true. if extractBoolTagOrDie("genclient", t.SecondClosestCommentLines) == false { continue } typesToGenerate = append(typesToGenerate, t) } orderer := namer.Orderer{Namer: namer.NewPrivateNamer(0)} typesToGenerate = orderer.OrderTypes(typesToGenerate) packagePath := filepath.Join(arguments.OutputPackagePath, strings.ToLower(gv.Group.NonEmpty()), strings.ToLower(gv.Version.NonEmpty())) packageList = append(packageList, &generator.DefaultPackage{ PackageName: strings.ToLower(gv.Version.NonEmpty()), PackagePath: packagePath, HeaderText: boilerplate, GeneratorFunc: func(c *generator.Context) (generators []generator.Generator) { generators = append(generators, &expansionGenerator{ DefaultGen: generator.DefaultGen{ OptionalName: "expansion_generated", }, packagePath: filepath.Join(arguments.OutputBase, packagePath), types: typesToGenerate, }) for _, t := range typesToGenerate { generators = append(generators, &listerGenerator{ DefaultGen: generator.DefaultGen{ OptionalName: strings.ToLower(t.Name.Name), }, outputPackage: arguments.OutputPackagePath, groupVersion: gv, internalGVPkg: internalGVPkg, typeToGenerate: t, imports: generator.NewImportTracker(), objectMeta: objectMeta, }) } return generators }, FilterFunc: func(c *generator.Context, t *types.Type) bool { // piggy-back on types that are tagged for client-gen return extractBoolTagOrDie("genclient", t.SecondClosestCommentLines) == true }, }) } return packageList }