knative.dev/pkg@v0.0.0-20260602142205-ac97e43f6622/client/injection/kube/reconciler/apps/v1/deployment/controller.go (about) 1 /* 2 Copyright 2022 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 // Code generated by injection-gen. DO NOT EDIT. 18 19 package deployment 20 21 import ( 22 context "context" 23 fmt "fmt" 24 reflect "reflect" 25 strings "strings" 26 27 zap "go.uber.org/zap" 28 corev1 "k8s.io/api/core/v1" 29 labels "k8s.io/apimachinery/pkg/labels" 30 types "k8s.io/apimachinery/pkg/types" 31 watch "k8s.io/apimachinery/pkg/watch" 32 scheme "k8s.io/client-go/kubernetes/scheme" 33 v1 "k8s.io/client-go/kubernetes/typed/core/v1" 34 record "k8s.io/client-go/tools/record" 35 client "knative.dev/pkg/client/injection/kube/client" 36 deployment "knative.dev/pkg/client/injection/kube/informers/apps/v1/deployment" 37 controller "knative.dev/pkg/controller" 38 logging "knative.dev/pkg/logging" 39 logkey "knative.dev/pkg/logging/logkey" 40 reconciler "knative.dev/pkg/reconciler" 41 ) 42 43 const ( 44 defaultControllerAgentName = "deployment-controller" 45 defaultFinalizerName = "deployments.apps" 46 ) 47 48 // NewImpl returns a controller.Impl that handles queuing and feeding work from 49 // the queue through an implementation of controller.Reconciler, delegating to 50 // the provided Interface and optional Finalizer methods. OptionsFn is used to return 51 // controller.ControllerOptions to be used by the internal reconciler. 52 func NewImpl(ctx context.Context, r Interface, optionsFns ...controller.OptionsFn) *controller.Impl { 53 logger := logging.FromContext(ctx) 54 55 // Check the options function input. It should be 0 or 1. 56 if len(optionsFns) > 1 { 57 logger.Fatal("Up to one options function is supported, found: ", len(optionsFns)) 58 } 59 60 deploymentInformer := deployment.Get(ctx) 61 62 lister := deploymentInformer.Lister() 63 64 var promoteFilterFunc func(obj interface{}) bool 65 var promoteFunc = func(bkt reconciler.Bucket) {} 66 67 rec := &reconcilerImpl{ 68 LeaderAwareFuncs: reconciler.LeaderAwareFuncs{ 69 PromoteFunc: func(bkt reconciler.Bucket, enq func(reconciler.Bucket, types.NamespacedName)) error { 70 71 // Signal promotion event 72 promoteFunc(bkt) 73 74 all, err := lister.List(labels.Everything()) 75 if err != nil { 76 return err 77 } 78 for _, elt := range all { 79 if promoteFilterFunc != nil { 80 if ok := promoteFilterFunc(elt); !ok { 81 continue 82 } 83 } 84 enq(bkt, types.NamespacedName{ 85 Namespace: elt.GetNamespace(), 86 Name: elt.GetName(), 87 }) 88 } 89 return nil 90 }, 91 }, 92 Client: client.Get(ctx), 93 Lister: lister, 94 reconciler: r, 95 finalizerName: defaultFinalizerName, 96 } 97 98 ctrType := reflect.TypeOf(r).Elem() 99 ctrTypeName := fmt.Sprintf("%s.%s", ctrType.PkgPath(), ctrType.Name()) 100 ctrTypeName = strings.ReplaceAll(ctrTypeName, "/", ".") 101 102 logger = logger.With( 103 zap.String(logkey.ControllerType, ctrTypeName), 104 zap.String(logkey.Kind, "apps.Deployment"), 105 ) 106 107 impl := controller.NewContext(ctx, rec, controller.ControllerOptions{WorkQueueName: ctrTypeName, Logger: logger}) 108 agentName := defaultControllerAgentName 109 110 // Pass impl to the options. Save any optional results. 111 for _, fn := range optionsFns { 112 opts := fn(impl) 113 if opts.ConfigStore != nil { 114 rec.configStore = opts.ConfigStore 115 } 116 if opts.FinalizerName != "" { 117 rec.finalizerName = opts.FinalizerName 118 } 119 if opts.AgentName != "" { 120 agentName = opts.AgentName 121 } 122 if opts.SkipStatusUpdates { 123 rec.skipStatusUpdates = true 124 } 125 if opts.DemoteFunc != nil { 126 rec.DemoteFunc = opts.DemoteFunc 127 } 128 if opts.PromoteFilterFunc != nil { 129 promoteFilterFunc = opts.PromoteFilterFunc 130 } 131 if opts.PromoteFunc != nil { 132 promoteFunc = opts.PromoteFunc 133 } 134 if opts.UseServerSideApplyForFinalizers { 135 if opts.FinalizerFieldManager == "" { 136 logger.Fatal("FinalizerFieldManager must be provided when UseServerSideApplyForFinalizers is enabled") 137 } 138 rec.useServerSideApplyForFinalizers = true 139 rec.finalizerFieldManager = opts.FinalizerFieldManager 140 rec.forceApplyFinalizers = opts.ForceApplyFinalizers 141 } 142 } 143 144 rec.Recorder = createRecorder(ctx, agentName) 145 146 return impl 147 } 148 149 func createRecorder(ctx context.Context, agentName string) record.EventRecorder { 150 logger := logging.FromContext(ctx) 151 152 recorder := controller.GetEventRecorder(ctx) 153 if recorder == nil { 154 // Create event broadcaster 155 logger.Debug("Creating event broadcaster") 156 eventBroadcaster := record.NewBroadcaster() 157 watches := []watch.Interface{ 158 eventBroadcaster.StartLogging(logger.Named("event-broadcaster").Infof), 159 eventBroadcaster.StartRecordingToSink( 160 &v1.EventSinkImpl{Interface: client.Get(ctx).CoreV1().Events("")}), 161 } 162 recorder = eventBroadcaster.NewRecorder(scheme.Scheme, corev1.EventSource{Component: agentName}) 163 go func() { 164 <-ctx.Done() 165 for _, w := range watches { 166 w.Stop() 167 } 168 }() 169 } 170 171 return recorder 172 } 173 174 func init() { 175 scheme.AddToScheme(scheme.Scheme) 176 }