knative.dev/pkg@v0.0.0-20260602142205-ac97e43f6622/codegen/cmd/injection-gen/generators/reconciler/reconciler_controller_stub.go (about) 1 /* 2 Copyright 2020 The Knative Authors 3 4 Licensed under the Apache License, Version 2.0 (the "License"); 5 you may not use this file except in compliance with the License. 6 You may obtain a copy of the License at 7 8 http://www.apache.org/licenses/LICENSE-2.0 9 10 Unless required by applicable law or agreed to in writing, software 11 distributed under the License is distributed on an "AS IS" BASIS, 12 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 See the License for the specific language governing permissions and 14 limitations under the License. 15 */ 16 17 package reconciler 18 19 import ( 20 "io" 21 22 "k8s.io/gengo/v2/generator" 23 "k8s.io/gengo/v2/namer" 24 "k8s.io/gengo/v2/types" 25 "k8s.io/klog/v2" 26 ) 27 28 // reconcilerControllerStubGenerator produces a file of the stub of the 29 // controller for a custom impl with injection. 30 type reconcilerControllerStubGenerator struct { 31 generator.GoGenerator 32 outputPackage string 33 imports namer.ImportTracker 34 typeToGenerate *types.Type 35 36 reconcilerPkg string 37 informerPackagePath string 38 reconcilerClasses []string 39 hasReconcilerClass bool 40 } 41 42 var _ generator.Generator = (*reconcilerControllerStubGenerator)(nil) 43 44 func (g *reconcilerControllerStubGenerator) Filter(c *generator.Context, t *types.Type) bool { 45 // Only process the type for this generator. 46 return t == g.typeToGenerate 47 } 48 49 func (g *reconcilerControllerStubGenerator) Namers(c *generator.Context) namer.NameSystems { 50 return namer.NameSystems{ 51 "raw": namer.NewRawNamer(g.outputPackage, g.imports), 52 } 53 } 54 55 func (g *reconcilerControllerStubGenerator) Imports(c *generator.Context) (imports []string) { 56 imports = append(imports, g.imports.ImportLines()...) 57 return imports 58 } 59 60 func (g *reconcilerControllerStubGenerator) GenerateType(c *generator.Context, t *types.Type, w io.Writer) error { 61 sw := generator.NewSnippetWriter(w, c, "{{", "}}") 62 63 klog.V(5).Info("processing type ", t) 64 65 m := map[string]interface{}{ 66 "type": t, 67 "classes": g.reconcilerClasses, 68 "hasClass": g.hasReconcilerClass, 69 "informerGet": c.Universe.Function(types.Name{ 70 Package: g.informerPackagePath, 71 Name: "Get", 72 }), 73 "controllerImpl": c.Universe.Type(types.Name{Package: "knative.dev/pkg/controller", Name: "Impl"}), 74 "reconcilerNewImpl": c.Universe.Type(types.Name{ 75 Package: g.reconcilerPkg, 76 Name: "NewImpl", 77 }), 78 "loggingFromContext": c.Universe.Function(types.Name{ 79 Package: "knative.dev/pkg/logging", 80 Name: "FromContext", 81 }), 82 "contextContext": c.Universe.Type(types.Name{ 83 Package: "context", 84 Name: "Context", 85 }), 86 "configmapWatcher": c.Universe.Type(types.Name{ 87 Package: "knative.dev/pkg/configmap", 88 Name: "Watcher", 89 }), 90 "classAnnotationKey": c.Universe.Variable(types.Name{ 91 Package: g.reconcilerPkg, 92 Name: "ClassAnnotationKey", 93 }), 94 "classAnnotationKeys": c.Universe.Variable(types.Name{ 95 Package: g.reconcilerPkg, 96 Name: "ClassAnnotationKeys", 97 }), 98 "annotationFilterFunc": c.Universe.Function(types.Name{ 99 Package: "knative.dev/pkg/reconciler", 100 Name: "AnnotationFilterFunc", 101 }), 102 "orFilterFunc": c.Universe.Function(types.Name{ 103 Package: "knative.dev/pkg/reconciler", 104 Name: "Or", 105 }), 106 "filterHandler": c.Universe.Type(types.Name{ 107 Package: "k8s.io/client-go/tools/cache", 108 Name: "FilteringResourceEventHandler", 109 }), 110 } 111 112 sw.Do(reconcilerControllerStub, m) 113 114 return sw.Error() 115 } 116 117 var reconcilerControllerStub = ` 118 // TODO: PLEASE COPY AND MODIFY THIS FILE AS A STARTING POINT 119 120 // NewController creates a Reconciler for {{.type|public}} and returns the result of NewImpl. 121 func NewController( 122 ctx {{.contextContext|raw}}, 123 cmw {{.configmapWatcher|raw}}, 124 ) *{{.controllerImpl|raw}} { 125 logger := {{.loggingFromContext|raw}}(ctx) 126 127 {{.type|lowercaseSingular}}Informer := {{.informerGet|raw}}(ctx) 128 129 {{if .hasClass}} 130 classValue := "default" // TODO: update this to the appropriate value. 131 {{if len .classes | eq 1 }} 132 classFilter := {{.annotationFilterFunc|raw}}({{.classAnnotationKey|raw}}, classValue, false /*allowUnset*/) 133 {{else if gt (len .classes) 1 }} 134 filterFuncs := make([]func(interface{}) bool, 0, len({{.classAnnotationKeys|raw}})) 135 136 for _, key := range {{.classAnnotationKeys|raw}} { 137 filterFuncs = append(filterFuncs, {{.annotationFilterFunc|raw}}(key, classValue, false /*allowUnset*/)) 138 } 139 140 classFilter := {{.orFilterFunc|raw}}(filterFuncs...) 141 {{end}} 142 {{end}} 143 144 // TODO: setup additional informers here. 145 {{if .hasClass}}// TODO: remember to use the classFilter from above to filter appropriately.{{end}} 146 147 r := &Reconciler{} 148 impl := {{.reconcilerNewImpl|raw}}(ctx, r{{if .hasClass}}, classValue{{end}}) 149 150 logger.Info("Setting up event handlers.") 151 152 {{if .hasClass}} 153 {{.type|lowercaseSingular}}Informer.Informer().AddEventHandler({{.filterHandler|raw}}{ 154 FilterFunc: classFilter, 155 Handler: controller.HandleAll(impl.Enqueue), 156 }) 157 {{else}} 158 {{.type|lowercaseSingular}}Informer.Informer().AddEventHandler(controller.HandleAll(impl.Enqueue)) 159 {{end}} 160 161 // TODO: add additional informer event handlers here. 162 163 return impl 164 } 165 `