in internal/manager/manager.go [70:183]
func newMgr(logger logr.Logger, opts *Options, isController, isReconciler bool) (ctrl.Manager, error) {
opts.Rest.QPS = float32(opts.qps)
scheme := runtime.NewScheme()
err := apiv1.SchemeBuilder.AddToScheme(scheme)
if err != nil {
return nil, err
}
err = corev1.SchemeBuilder.AddToScheme(scheme)
if err != nil {
return nil, err
}
mgrOpts := manager.Options{
Logger: logger,
HealthProbeBindAddress: opts.HealthProbeAddr,
Scheme: scheme,
Metrics: server.Options{
BindAddress: opts.MetricsAddr,
},
BaseContext: func() context.Context {
return logr.NewContext(context.Background(), logger)
},
Cache: cache.Options{
ByObject: make(map[client.Object]cache.ByObject),
},
LeaderElection: opts.LeaderElection,
LeaderElectionNamespace: opts.LeaderElectionNamespace,
LeaderElectionResourceLock: opts.LeaderElectionResourceLock,
LeaderElectionID: opts.LeaderElectionID,
LeaseDuration: &opts.ElectionLeaseDuration,
RenewDeadline: &opts.ElectionLeaseRenewDeadline,
RetryPeriod: &opts.ElectionLeaseRetryPeriod,
LeaderElectionReleaseOnCancel: true,
Controller: config.Controller{SkipNameValidation: ptr.To(true)},
}
if ratioStr := os.Getenv("CHAOS_RATIO"); ratioStr != "" {
mgrOpts.NewClient = func(config *rest.Config, options client.Options) (client.Client, error) {
base, err := client.New(config, options)
if err != nil {
return nil, err
}
ratio, err := strconv.ParseFloat(ratioStr, 64)
if err != nil {
return nil, err
}
return &chaosClient{Client: base, ratio: ratio}, nil
}
}
if isController {
// Only cache pods in the synthesizer pod namespace and owned by this controller
mgrOpts.Cache.ByObject[&corev1.Pod{}] = cache.ByObject{
Namespaces: map[string]cache.Config{
opts.SynthesizerPodNamespace: {
LabelSelector: labels.SelectorFromSet(labels.Set{ManagerLabelKey: ManagerLabelValue}),
},
},
}
}
mgrOpts.Cache.ByObject[&apiv1.Composition{}] = newCacheOptions(opts.CompositionNamespace, opts.CompositionSelector)
sliceCacheOpts := newCacheOptions(opts.CompositionNamespace, labels.Everything())
sliceCacheOpts.UnsafeDisableDeepCopy = ptr.To(true)
sliceCacheOpts.Transform = func(obj any) (any, error) {
slice, ok := obj.(*apiv1.ResourceSlice)
if !ok {
return obj, nil
}
for i := range slice.Spec.Resources {
slice.Spec.Resources[i].Manifest = "" // remove big manifest that we don't need
}
return slice, nil
}
mgrOpts.Cache.ByObject[&apiv1.ResourceSlice{}] = sliceCacheOpts
mgr, err := ctrl.NewManager(opts.Rest, mgrOpts)
if err != nil {
return nil, err
}
if isController {
err = mgr.GetFieldIndexer().IndexField(context.Background(), &apiv1.Composition{}, IdxCompositionsBySynthesizer, func(o client.Object) []string {
comp := o.(*apiv1.Composition)
return []string{comp.Spec.Synthesizer.Name}
})
if err != nil {
return nil, err
}
err = mgr.GetFieldIndexer().IndexField(context.Background(), &apiv1.Composition{}, IdxCompositionsBySymphony, indexController())
if err != nil {
return nil, err
}
err = mgr.GetFieldIndexer().IndexField(context.Background(), &apiv1.Composition{}, IdxCompositionsByBinding, indexResourceBindings())
if err != nil {
return nil, err
}
err = mgr.GetFieldIndexer().IndexField(context.Background(), &apiv1.Synthesizer{}, IdxSynthesizersByRef, indexSynthRefs())
if err != nil {
return nil, err
}
}
mgr.AddHealthzCheck("ping", healthz.Ping)
mgr.AddReadyzCheck("ping", healthz.Ping)
return mgr, nil
}