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  `