func (g *genDefaulter) GenerateType(c *generator.Context, t *types.Type, w io.Writer) error { if _, ok := g.newDefaulters[t]; !ok { return nil } glog.V(5).Infof("generating for type %v", t) callTree := buildCallTreeForType(t, true, g.existingDefaulters, g.newDefaulters) if callTree == nil { glog.V(5).Infof(" no defaulters defined") return nil } i := 0 callTree.VisitInOrder(func(ancestors []*callNode, current *callNode) { if len(current.call) == 0 { return } path := callPath(append(ancestors, current)) glog.V(5).Infof(" %d: %s", i, path) i++ }) sw := generator.NewSnippetWriter(w, c, "$", "$") g.generateDefaulter(t, callTree, sw) return sw.Error() }
func (g *factoryGenerator) GenerateType(c *generator.Context, t *types.Type, w io.Writer) error { sw := generator.NewSnippetWriter(w, c, "{{", "}}") glog.V(5).Infof("processing type %v", t) gvInterfaces := make(map[string]*types.Type) gvNewFuncs := make(map[string]*types.Type) for groupName := range g.groupVersions { gvInterfaces[groupName] = c.Universe.Type(types.Name{Package: packageForGroup(g.outputPackage, g.groupVersions[groupName].Group), Name: "Interface"}) gvNewFuncs[groupName] = c.Universe.Function(types.Name{Package: packageForGroup(g.outputPackage, g.groupVersions[groupName].Group), Name: "New"}) } m := map[string]interface{}{ "cacheSharedIndexInformer": c.Universe.Type(cacheSharedIndexInformer), "groupVersions": g.groupVersions, "gvInterfaces": gvInterfaces, "gvNewFuncs": gvNewFuncs, "interfacesNewInternalInformerFunc": c.Universe.Type(types.Name{Package: g.internalInterfacesPackage, Name: "NewInternalInformerFunc"}), "interfacesNewVersionedInformerFunc": c.Universe.Type(types.Name{Package: g.internalInterfacesPackage, Name: "NewVersionedInformerFunc"}), "informerFactoryInterface": c.Universe.Type(types.Name{Package: g.internalInterfacesPackage, Name: "SharedInformerFactory"}), "internalClientSetInterface": c.Universe.Type(types.Name{Package: g.internalClientSetPackage, Name: "Interface"}), "reflectType": c.Universe.Type(reflectType), "runtimeObject": c.Universe.Type(runtimeObject), "syncMutex": c.Universe.Type(syncMutex), "timeDuration": c.Universe.Type(timeDuration), "versionedClientSetInterface": c.Universe.Type(types.Name{Package: g.versionedClientSetPackage, Name: "Interface"}), } sw.Do(sharedInformerFactoryStruct, m) sw.Do(sharedInformerFactoryInterface, m) return sw.Error() }
func (g *listerGenerator) GenerateType(c *generator.Context, t *types.Type, w io.Writer) error { sw := generator.NewSnippetWriter(w, c, "$", "$") glog.V(5).Infof("processing type %v", t) m := map[string]interface{}{ "Resource": c.Universe.Function(types.Name{Package: g.internalGVPkg, Name: "Resource"}), "type": t, "objectMeta": g.objectMeta, } namespaced := !extractBoolTagOrDie("nonNamespaced", t.SecondClosestCommentLines) if namespaced { sw.Do(typeListerInterface, m) } else { sw.Do(typeListerInterface_NonNamespaced, m) } sw.Do(typeListerStruct, m) sw.Do(typeListerConstructor, m) sw.Do(typeLister_List, m) if namespaced { sw.Do(typeLister_NamespaceLister, m) sw.Do(namespaceListerInterface, m) sw.Do(namespaceListerStruct, m) sw.Do(namespaceLister_List, m) sw.Do(namespaceLister_Get, m) } else { sw.Do(typeLister_NonNamespacedGet, m) } return sw.Error() }
func (g *genFakeForGroup) GenerateType(c *generator.Context, t *types.Type, w io.Writer) error { sw := generator.NewSnippetWriter(w, c, "$", "$") const pkgTestingCore = "k8s.io/kubernetes/pkg/client/testing/core" const pkgRESTClient = "k8s.io/kubernetes/pkg/client/restclient" m := map[string]interface{}{ "group": g.group, "Group": namer.IC(g.group), "Fake": c.Universe.Type(types.Name{Package: pkgTestingCore, Name: "Fake"}), "RESTClient": c.Universe.Type(types.Name{Package: pkgRESTClient, Name: "RESTClient"}), } sw.Do(groupClientTemplate, m) for _, t := range g.types { wrapper := map[string]interface{}{ "type": t, "Group": namer.IC(g.group), "realClientPackage": filepath.Base(g.realClientPath), } namespaced := !extractBoolTagOrDie("nonNamespaced", t.SecondClosestCommentLines) if namespaced { sw.Do(getterImplNamespaced, wrapper) } else { sw.Do(getterImplNonNamespaced, wrapper) } } sw.Do(getRESTClient, m) return sw.Error() }
func (g *genDeepCopy) Init(c *generator.Context, w io.Writer) error { cloner := c.Universe.Type(types.Name{Package: conversionPackagePath, Name: "Cloner"}) g.imports.AddType(cloner) if !g.registerTypes { // TODO: We should come up with a solution to register all generated // deep-copy functions. However, for now, to avoid import cycles // we register only those explicitly requested. return nil } glog.V(5).Infof("registering types in pkg %q", g.targetPackage) sw := generator.NewSnippetWriter(w, c, "$", "$") sw.Do("func init() {\n", nil) sw.Do("SchemeBuilder.Register(RegisterDeepCopies)\n", nil) sw.Do("}\n\n", nil) scheme := c.Universe.Type(types.Name{Package: runtimePackagePath, Name: "Scheme"}) schemePtr := &types.Type{ Kind: types.Pointer, Elem: scheme, } sw.Do("// RegisterDeepCopies adds deep-copy functions to the given scheme. Public\n", nil) sw.Do("// to allow building arbitrary schemes.\n", nil) sw.Do("func RegisterDeepCopies(scheme $.|raw$) error {\n", schemePtr) sw.Do("return scheme.AddGeneratedDeepCopyFuncs(\n", nil) for _, t := range g.typesForInit { args := argsFromType(t). With("typeof", c.Universe.Package("reflect").Function("TypeOf")) sw.Do("conversion.GeneratedDeepCopyFunc{Fn: $.type|dcFnName$, InType: $.typeof|raw$(&$.type|raw${})},\n", args) } sw.Do(")\n", nil) sw.Do("}\n\n", nil) return sw.Error() }
// GenerateType makes the body of a file implementing a set for type t. func (g *genProtoIDL) GenerateType(c *generator.Context, t *types.Type, w io.Writer) error { sw := generator.NewSnippetWriter(w, c, "$", "$") b := bodyGen{ locator: &protobufLocator{ namer: c.Namers["proto"].(ProtobufFromGoNamer), tracker: g.imports, universe: c.Universe, localGoPackage: g.localGoPackage.Package, }, localPackage: g.localPackage, omitGogo: g.omitGogo, omitFieldTypes: g.omitFieldTypes, t: t, } switch t.Kind { case types.Alias: return b.doAlias(sw) case types.Struct: return b.doStruct(sw) default: return b.unknown(sw) } }
func (g *genClientset) GenerateType(c *generator.Context, t *types.Type, w io.Writer) error { // 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, "$", "$") sw.Do(common, nil) sw.Do(checkImpl, nil) type arg struct { Group string PackageName string } allGroups := []arg{} for _, gv := range g.groupVersions { group := normalization.BeforeFirstDot(normalization.Group(gv.Group)) version := normalization.Version(gv.Version) allGroups = append(allGroups, arg{namer.IC(group), version + group}) } for _, g := range allGroups { sw.Do(clientsetInterfaceImplTemplate, g) } return sw.Error() }
func (g *informerGenerator) GenerateType(c *generator.Context, t *types.Type, w io.Writer) error { sw := generator.NewSnippetWriter(w, c, "$", "$") glog.V(5).Infof("processing type %v", t) //listerPackage := "k8s.io/kubernetes/pkg/client/listers/" + g.groupVersion.Group.NonEmpty() + "/" + strings.ToLower(g.groupVersion.Version.NonEmpty()) listerPackage := fmt.Sprintf("%s/%s/%s", g.listersPackage, g.groupVersion.Group.NonEmpty(), strings.ToLower(g.groupVersion.Version.NonEmpty())) var ( clientSetInterface, namespaceAll *types.Type informerFor string ) if len(g.groupVersion.Version) == 0 { clientSetInterface = c.Universe.Type(types.Name{Package: g.internalClientSetPackage, Name: "Interface"}) namespaceAll = c.Universe.Type(apiNamespaceAll) informerFor = "InternalInformerFor" } else { clientSetInterface = c.Universe.Type(types.Name{Package: g.versionedClientSetPackage, Name: "Interface"}) namespaceAll = c.Universe.Type(v1NamespaceAll) informerFor = "VersionedInformerFor" } m := map[string]interface{}{ "apiScheme": c.Universe.Type(apiScheme), "cacheIndexers": c.Universe.Type(cacheIndexers), "cacheListWatch": c.Universe.Type(cacheListWatch), "cacheMetaNamespaceIndexFunc": c.Universe.Function(cacheMetaNamespaceIndexFunc), "cacheNamespaceIndex": c.Universe.Variable(cacheNamespaceIndex), "cacheNewSharedIndexInformer": c.Universe.Function(cacheNewSharedIndexInformer), "cacheSharedIndexInformer": c.Universe.Type(cacheSharedIndexInformer), "clientSetInterface": clientSetInterface, "group": namer.IC(g.groupVersion.Group.NonEmpty()), "informerFor": informerFor, "interfacesSharedInformerFactory": c.Universe.Type(interfacesSharedInformerFactory), "listOptions": c.Universe.Type(listOptions), "lister": c.Universe.Type(types.Name{Package: listerPackage, Name: t.Name.Name + "Lister"}), "namespaceAll": namespaceAll, "namespaced": !extractBoolTagOrDie("nonNamespaced", t.SecondClosestCommentLines), "newLister": c.Universe.Function(types.Name{Package: listerPackage, Name: "New" + t.Name.Name + "Lister"}), "runtimeObject": c.Universe.Type(runtimeObject), "timeDuration": c.Universe.Type(timeDuration), "type": t, "v1ListOptions": c.Universe.Type(v1ListOptions), "version": namer.IC(g.groupVersion.Version.String()), "watchInterface": c.Universe.Type(watchInterface), } sw.Do(typeInformerInterface, m) sw.Do(typeInformerStruct, m) if len(g.groupVersion.Version) == 0 { sw.Do(typeInformerConstructorInternal, m) } else { sw.Do(typeInformerConstructorVersioned, m) } sw.Do(typeInformerInformer, m) sw.Do(typeInformerLister, m) return sw.Error() }
func (g *genConversion) GenerateType(c *generator.Context, t *types.Type, w io.Writer) error { glog.V(5).Infof("generating for type %v", t) peerType := getPeerTypeFor(c, t, g.peerPackages) sw := generator.NewSnippetWriter(w, c, "$", "$") g.generateConversion(t, peerType, sw) g.generateConversion(peerType, t, sw) return sw.Error() }
// GenerateType makes the body of a file implementing a set for type t. func (g *genSet) GenerateType(c *generator.Context, t *types.Type, w io.Writer) error { sw := generator.NewSnippetWriter(w, c, "$", "$") sw.Do(setCode, g.args(t)) sw.Do("func less$.type|public$(lhs, rhs $.type|raw$) bool {\n", g.args(t)) g.lessBody(sw, t) sw.Do("}\n", g.args(t)) return sw.Error() }
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) { sw.Do(expansionInterfaceTemplate, t) } } return sw.Error() }
func (g *openAPIGen) GenerateType(c *generator.Context, t *types.Type, w io.Writer) error { glog.V(5).Infof("generating for type %v", t) sw := generator.NewSnippetWriter(w, c, "$", "$") err := newOpenAPITypeWriter(sw).generate(t) if err != nil { return err } return sw.Error() }
func (g *genDeepCopy) Init(c *generator.Context, w io.Writer) error { cloner := c.Universe.Type(types.Name{Package: conversionPackagePath, Name: "Cloner"}) g.imports.AddType(cloner) if !g.registerTypes { sw := generator.NewSnippetWriter(w, c, "$", "$") sw.Do("// GetGeneratedDeepCopyFuncs returns the generated funcs, since we aren't registering them.\n", nil) sw.Do("func GetGeneratedDeepCopyFuncs() []conversion.GeneratedDeepCopyFunc{\n", nil) sw.Do("return []conversion.GeneratedDeepCopyFunc{\n", nil) for _, t := range g.typesForInit { args := argsFromType(t). With("typeof", c.Universe.Package("reflect").Function("TypeOf")) sw.Do("{Fn: $.type|dcFnName$, InType: $.typeof|raw$(&$.type|raw${})},\n", args) } sw.Do("}\n", nil) sw.Do("}\n\n", nil) return sw.Error() } glog.V(5).Infof("Registering types in pkg %q", g.targetPackage) sw := generator.NewSnippetWriter(w, c, "$", "$") sw.Do("func init() {\n", nil) sw.Do("SchemeBuilder.Register(RegisterDeepCopies)\n", nil) sw.Do("}\n\n", nil) scheme := c.Universe.Type(types.Name{Package: runtimePackagePath, Name: "Scheme"}) schemePtr := &types.Type{ Kind: types.Pointer, Elem: scheme, } sw.Do("// RegisterDeepCopies adds deep-copy functions to the given scheme. Public\n", nil) sw.Do("// to allow building arbitrary schemes.\n", nil) sw.Do("func RegisterDeepCopies(scheme $.|raw$) error {\n", schemePtr) sw.Do("return scheme.AddGeneratedDeepCopyFuncs(\n", nil) for _, t := range g.typesForInit { args := argsFromType(t). With("typeof", c.Universe.Package("reflect").Function("TypeOf")) sw.Do("conversion.GeneratedDeepCopyFunc{Fn: $.type|dcFnName$, InType: $.typeof|raw$(&$.type|raw${})},\n", args) } sw.Do(")\n", nil) sw.Do("}\n\n", nil) return sw.Error() }
func (g *versionInterfaceGenerator) GenerateType(c *generator.Context, t *types.Type, w io.Writer) error { sw := generator.NewSnippetWriter(w, c, "$", "$") m := map[string]interface{}{ "interfacesSharedInformerFactory": c.Universe.Type(types.Name{Package: g.internalInterfacesPackage, Name: "SharedInformerFactory"}), "types": g.types, } sw.Do(versionTemplate, m) return sw.Error() }
func (g *expansionGenerator) 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.packagePath, strings.ToLower(t.Name.Name+"_expansion.go"))); os.IsNotExist(err) { sw.Do(expansionInterfaceTemplate, t) namespaced := !extractBoolTagOrDie("nonNamespaced", t.SecondClosestCommentLines) if namespaced { sw.Do(namespacedExpansionInterfaceTemplate, t) } } } return sw.Error() }
// Returns all manually-defined conversion functions in the package. func getManualConversionFunctions(context *generator.Context, pkg *types.Package, manualMap conversionFuncMap) { scopeName := types.Ref(conversionPackagePath, "Scope").Name errorName := types.Ref("", "error").Name buffer := &bytes.Buffer{} sw := generator.NewSnippetWriter(buffer, context, "$", "$") for _, f := range pkg.Functions { if f.Underlying == nil || f.Underlying.Kind != types.Func { glog.Errorf("Malformed function: %#v", f) continue } if f.Underlying.Signature == nil { glog.Errorf("Function without signature: %#v", f) continue } signature := f.Underlying.Signature // Check whether the function is conversion function. // Note that all of them have signature: // func Convert_inType_To_outType(inType, outType, conversion.Scope) error if signature.Receiver != nil { continue } if len(signature.Parameters) != 3 || signature.Parameters[2].Name != scopeName { continue } if len(signature.Results) != 1 || signature.Results[0].Name != errorName { continue } inType := signature.Parameters[0] outType := signature.Parameters[1] if inType.Kind != types.Pointer || outType.Kind != types.Pointer { continue } // Now check if the name satisfies the convention. // TODO: This should call the Namer directly. args := argsFromType(inType.Elem, outType.Elem) sw.Do("Convert_$.inType|public$_To_$.outType|public$", args) if f.Name.Name == buffer.String() { key := conversionPair{inType.Elem, outType.Elem} // We might scan the same package twice, and that's OK. if v, ok := manualMap[key]; ok && v != nil && v.Name.Package != pkg.Path { panic(fmt.Sprintf("duplicate static conversion defined: %#v", key)) } manualMap[key] = f } buffer.Reset() } }
func (g *genDeepCopy) GenerateType(c *generator.Context, t *types.Type, w io.Writer) error { if !g.needsGeneration(t) { return nil } glog.V(5).Infof("generating for type %v", t) sw := generator.NewSnippetWriter(w, c, "$", "$") args := argsFromType(t). With("clonerType", types.Ref(conversionPackagePath, "Cloner")) sw.Do("func $.type|dcFnName$(in interface{}, out interface{}, c *$.clonerType|raw$) error {{\n", args) sw.Do("in := in.(*$.type|raw$)\nout := out.(*$.type|raw$)\n", argsFromType(t)) g.generateFor(t, sw) sw.Do("return nil\n", nil) sw.Do("}}\n\n", nil) return sw.Error() }
func (g *factoryInterfaceGenerator) GenerateType(c *generator.Context, t *types.Type, w io.Writer) error { sw := generator.NewSnippetWriter(w, c, "{{", "}}") glog.V(5).Infof("processing type %v", t) m := map[string]interface{}{ "cacheSharedIndexInformer": c.Universe.Type(cacheSharedIndexInformer), "internalClientSetInterface": c.Universe.Type(types.Name{Package: g.internalClientSetPackage, Name: "Interface"}), "runtimeObject": c.Universe.Type(runtimeObject), "timeDuration": c.Universe.Type(timeDuration), "versionedClientSetInterface": c.Universe.Type(types.Name{Package: g.versionedClientSetPackage, Name: "Interface"}), } sw.Do(externalSharedInformerFactoryInterface, m) return sw.Error() }
// Returns all manually-defined defaulting functions in the package. func getManualDefaultingFunctions(context *generator.Context, pkg *types.Package, manualMap defaulterFuncMap) { buffer := &bytes.Buffer{} sw := generator.NewSnippetWriter(buffer, context, "$", "$") for _, f := range pkg.Functions { if f.Underlying == nil || f.Underlying.Kind != types.Func { glog.Errorf("Malformed function: %#v", f) continue } if f.Underlying.Signature == nil { glog.Errorf("Function without signature: %#v", f) continue } signature := f.Underlying.Signature // Check whether the function is conversion function. // Note that all of them have signature: // func Convert_inType_To_outType(inType, outType, conversion.Scope) error if signature.Receiver != nil { continue } if len(signature.Parameters) != 1 { continue } if len(signature.Results) != 0 { continue } inType := signature.Parameters[0] if inType.Kind != types.Pointer { continue } // Now check if the name satisfies the convention. args := defaultingArgsFromType(inType.Elem) sw.Do("$.inType|defaultfn$", args) if f.Name.Name == buffer.String() { key := inType.Elem // We might scan the same package twice, and that's OK. if v, ok := manualMap[key]; ok && v != nil && v.Name.Package != pkg.Path { panic(fmt.Sprintf("duplicate static defaulter defined: %#v", key)) } manualMap[key] = f } buffer.Reset() } }
func testOpenAPITypeWritter(t *testing.T, code string) (error, *assert.Assertions, *bytes.Buffer) { assert := assert.New(t) var testFiles = map[string]string{ "base/foo/bar.go": code, } rawNamer := namer.NewRawNamer("o", nil) namers := namer.NameSystems{ "raw": namer.NewRawNamer("", nil), } builder, universe, _ := construct(t, testFiles, rawNamer) context, err := generator.NewContext(builder, namers, "raw") if err != nil { t.Fatal(err) } buffer := &bytes.Buffer{} sw := generator.NewSnippetWriter(buffer, context, "$", "$") blahT := universe.Type(types.Name{Package: "base/foo", Name: "Blah"}) return newOpenAPITypeWriter(sw).generate(blahT), assert, buffer }
func (g *genClientset) GenerateType(c *generator.Context, t *types.Type, w io.Writer) error { // 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/kubernetes/pkg/client/typed/discovery" const pkgRESTClient = "k8s.io/kubernetes/pkg/client/restclient" type arg struct { Group string PackageName string } allGroups := []arg{} for _, gv := range g.groupVersions { group := normalization.BeforeFirstDot(normalization.Group(gv.Group)) version := normalization.Version(gv.Version) allGroups = append(allGroups, arg{namer.IC(group), version + group}) } 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"}), } sw.Do(clientsetInterfaceTemplate, m) sw.Do(clientsetTemplate, m) for _, g := range allGroups { sw.Do(clientsetInterfaceImplTemplate, g) } sw.Do(getDiscoveryTemplate, m) sw.Do(newClientsetForConfigTemplate, m) sw.Do(newClientsetForConfigOrDieTemplate, m) sw.Do(newClientsetForRESTClientTemplate, m) return sw.Error() }
func (g *genDefaulter) Init(c *generator.Context, w io.Writer) error { sw := generator.NewSnippetWriter(w, c, "$", "$") scheme := c.Universe.Type(types.Name{Package: runtimePackagePath, Name: "Scheme"}) schemePtr := &types.Type{ Kind: types.Pointer, Elem: scheme, } sw.Do("// RegisterDefaults adds defaulters functions to the given scheme.\n", nil) sw.Do("// Public to allow building arbitrary schemes.\n", nil) sw.Do("// All generated defaulters are covering - they call all nested defaulters.\n", nil) sw.Do("func RegisterDefaults(scheme $.|raw$) error {\n", schemePtr) for _, t := range g.typesForInit { args := defaultingArgsFromType(t) sw.Do("scheme.AddTypeDefaultingFunc(&$.inType|raw${}, func(obj interface{}) { $.inType|objectdefaultfn$(obj.(*$.inType|raw$)) })\n", args) } sw.Do("return nil\n", nil) sw.Do("}\n\n", nil) return sw.Error() }
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() }
func (g *genClientset) GenerateType(c *generator.Context, t *types.Type, w io.Writer) error { // 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, "$", "$") sw.Do(common, nil) sw.Do(checkImpl, nil) allGroups := clientgentypes.ToGroupVersionPackages(g.groups) for _, g := range allGroups { sw.Do(clientsetInterfaceImplTemplate, g) // don't generated the default method if generating internalversion clientset if g.IsDefaultVersion && g.Version != "" { sw.Do(clientsetInterfaceDefaultVersionImpl, g) } } return sw.Error() }
func (g *groupInterfaceGenerator) GenerateType(c *generator.Context, t *types.Type, w io.Writer) error { sw := generator.NewSnippetWriter(w, c, "$", "$") versions := make([]versionData, 0, len(g.groupVersions.Versions)) for _, version := range g.groupVersions.Versions { gv := clientgentypes.GroupVersion{Group: g.groupVersions.Group, Version: version} versionPackage := filepath.Join(g.outputPackage, strings.ToLower(gv.Version.NonEmpty())) iface := c.Universe.Type(types.Name{Package: versionPackage, Name: "Interface"}) versions = append(versions, versionData{ Name: namer.IC(version.NonEmpty()), Interface: iface, New: c.Universe.Function(types.Name{Package: versionPackage, Name: "New"}), }) } m := map[string]interface{}{ "interfacesSharedInformerFactory": c.Universe.Type(interfacesSharedInformerFactory), "versions": versions, } sw.Do(groupTemplate, m) return sw.Error() }
func (g *genClientset) GenerateType(c *generator.Context, t *types.Type, w io.Writer) error { // 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/kubernetes/pkg/client/typed/discovery" const pkgRESTClient = "k8s.io/kubernetes/pkg/client/restclient" 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"}), } sw.Do(clientsetInterface, m) sw.Do(clientsetTemplate, m) for _, g := range allGroups { sw.Do(clientsetInterfaceImplTemplate, g) // don't generated the default method if generating internalversion clientset if g.IsDefaultVersion && g.Version != "" { sw.Do(clientsetInterfaceDefaultVersionImpl, g) } } sw.Do(getDiscoveryTemplate, m) sw.Do(newClientsetForConfigTemplate, m) sw.Do(newClientsetForConfigOrDieTemplate, m) sw.Do(newClientsetForRESTClientTemplate, m) return sw.Error() }
func (g *genConversion) Init(c *generator.Context, w io.Writer) error { sw := generator.NewSnippetWriter(w, c, "$", "$") sw.Do("func init() {\n", nil) sw.Do("SchemeBuilder.Register(RegisterConversions)\n", nil) sw.Do("}\n", nil) scheme := c.Universe.Type(types.Name{Package: runtimePackagePath, Name: "Scheme"}) schemePtr := &types.Type{ Kind: types.Pointer, Elem: scheme, } sw.Do("// RegisterConversions adds conversion functions to the given scheme.\n", nil) sw.Do("// Public to allow building arbitrary schemes.\n", nil) sw.Do("func RegisterConversions(scheme $.|raw$) error {\n", schemePtr) sw.Do("return scheme.AddGeneratedConversionFuncs(\n", nil) for _, t := range g.types { peerType := getPeerTypeFor(c, t, g.peerPackages) sw.Do(nameTmpl+",\n", argsFromType(t, peerType)) sw.Do(nameTmpl+",\n", argsFromType(peerType, t)) } sw.Do(")\n", nil) sw.Do("}\n\n", nil) return sw.Error() }
// GenerateType makes the body of a file implementing the individual typed client for type t. func (g *genClientForType) GenerateType(c *generator.Context, t *types.Type, w io.Writer) error { sw := generator.NewSnippetWriter(w, c, "$", "$") pkg := filepath.Base(t.Name.Package) namespaced := !extractBoolTagOrDie("nonNamespaced", t.SecondClosestCommentLines) m := map[string]interface{}{ "type": t, "package": pkg, "Package": namer.IC(pkg), "Group": namer.IC(g.group), "watchInterface": c.Universe.Type(types.Name{Package: "k8s.io/kubernetes/pkg/watch", Name: "Interface"}), "RESTClientInterface": c.Universe.Type(types.Name{Package: "k8s.io/kubernetes/pkg/client/restclient", Name: "Interface"}), "apiParameterCodec": c.Universe.Type(types.Name{Package: "k8s.io/kubernetes/pkg/api", Name: "ParameterCodec"}), "PatchType": c.Universe.Type(types.Name{Package: "k8s.io/kubernetes/pkg/api", Name: "PatchType"}), "namespaced": namespaced, } if g.version == "unversioned" { m["DeleteOptions"] = c.Universe.Type(types.Name{Package: "k8s.io/kubernetes/pkg/api", Name: "DeleteOptions"}) m["ListOptions"] = c.Universe.Type(types.Name{Package: "k8s.io/kubernetes/pkg/api", Name: "ListOptions"}) } else { m["DeleteOptions"] = c.Universe.Type(types.Name{Package: "k8s.io/kubernetes/pkg/api/v1", Name: "DeleteOptions"}) m["ListOptions"] = c.Universe.Type(types.Name{Package: "k8s.io/kubernetes/pkg/api/v1", Name: "ListOptions"}) } sw.Do(getterComment, m) if namespaced { sw.Do(getterNamesapced, m) } else { sw.Do(getterNonNamesapced, m) } noMethods := extractBoolTagOrDie("noMethods", t.SecondClosestCommentLines) == true sw.Do(interfaceTemplate1, m) if !noMethods { sw.Do(interfaceTemplate2, m) // Include the UpdateStatus method if the type has a status if hasStatus(t) { sw.Do(interfaceUpdateStatusTemplate, m) } sw.Do(interfaceTemplate3, m) } sw.Do(interfaceTemplate4, m) if namespaced { sw.Do(structNamespaced, m) sw.Do(newStructNamespaced, m) } else { sw.Do(structNonNamespaced, m) sw.Do(newStructNonNamespaced, m) } if !noMethods { sw.Do(createTemplate, m) sw.Do(updateTemplate, m) // Generate the UpdateStatus method if the type has a status if hasStatus(t) { sw.Do(updateStatusTemplate, m) } sw.Do(deleteTemplate, m) sw.Do(deleteCollectionTemplate, m) sw.Do(getTemplate, m) sw.Do(listTemplate, m) sw.Do(watchTemplate, m) sw.Do(patchTemplate, m) } return sw.Error() }
func (g *genGroup) GenerateType(c *generator.Context, t *types.Type, w io.Writer) error { sw := generator.NewSnippetWriter(w, c, "$", "$") const pkgRESTClient = "k8s.io/kubernetes/pkg/client/restclient" const pkgRegistered = "k8s.io/kubernetes/pkg/apimachinery/registered" const pkgAPI = "k8s.io/kubernetes/pkg/api" const pkgSerializer = "k8s.io/kubernetes/pkg/runtime/serializer" apiPath := func(group string) string { if len(g.apiPath) > 0 { return `"` + g.apiPath + `"` } if group == "core" { return `"/api"` } return `"/apis"` } groupName := g.group if g.group == "core" { groupName = "" } // allow user to define a group name that's different from the one parsed from the directory. p := c.Universe.Package(g.inputPacakge) if override := types.ExtractCommentTags("+", p.DocComments)["groupName"]; override != nil { groupName = override[0] } m := map[string]interface{}{ "group": normalization.BeforeFirstDot(g.group), "Group": namer.IC(normalization.BeforeFirstDot(g.group)), "groupName": groupName, "types": g.types, "Config": c.Universe.Type(types.Name{Package: pkgRESTClient, Name: "Config"}), "DefaultKubernetesUserAgent": c.Universe.Function(types.Name{Package: pkgRESTClient, Name: "DefaultKubernetesUserAgent"}), "RESTClientInterface": c.Universe.Type(types.Name{Package: pkgRESTClient, Name: "Interface"}), "RESTClientFor": c.Universe.Function(types.Name{Package: pkgRESTClient, Name: "RESTClientFor"}), "latestGroup": c.Universe.Variable(types.Name{Package: pkgRegistered, Name: "Group"}), "GroupOrDie": c.Universe.Variable(types.Name{Package: pkgRegistered, Name: "GroupOrDie"}), "apiPath": apiPath(g.group), "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"}), } sw.Do(groupInterfaceTemplate, m) sw.Do(groupClientTemplate, m) for _, t := range g.types { wrapper := map[string]interface{}{ "type": t, "Group": namer.IC(normalization.BeforeFirstDot(g.group)), } namespaced := !extractBoolTagOrDie("nonNamespaced", t.SecondClosestCommentLines) if namespaced { sw.Do(getterImplNamespaced, wrapper) } else { sw.Do(getterImplNonNamespaced, wrapper) } } sw.Do(newClientForConfigTemplate, m) sw.Do(newClientForConfigOrDieTemplate, m) sw.Do(newClientForRESTClientTemplate, m) if g.version == "unversioned" { sw.Do(setInternalVersionClientDefaultsTemplate, m) } else { sw.Do(setClientDefaultsTemplate, m) } sw.Do(getRESTClient, m) return sw.Error() }
func (g *openAPIGen) Finalize(c *generator.Context, w io.Writer) error { sw := generator.NewSnippetWriter(w, c, "$", "$") sw.Do("}\n", nil) return sw.Error() }