github.com/crossplane/upjet@v1.3.0/pkg/pipeline/templates/controller.go.tmpl (about) 1 {{ .Header }} 2 3 {{ .GenStatement }} 4 5 package {{ .Package }} 6 7 import ( 8 "time" 9 10 "github.com/crossplane/crossplane-runtime/pkg/connection" 11 "github.com/crossplane/crossplane-runtime/pkg/event" 12 "github.com/crossplane/crossplane-runtime/pkg/ratelimiter" 13 "github.com/crossplane/crossplane-runtime/pkg/reconciler/managed" 14 xpresource "github.com/crossplane/crossplane-runtime/pkg/resource" 15 "github.com/crossplane/crossplane-runtime/pkg/statemetrics" 16 "github.com/crossplane/upjet/pkg/controller/handler" 17 tjcontroller "github.com/crossplane/upjet/pkg/controller" 18 "github.com/crossplane/upjet/pkg/terraform" 19 "github.com/pkg/errors" 20 ctrl "sigs.k8s.io/controller-runtime" 21 22 {{ .Imports }} 23 ) 24 25 // Setup adds a controller that reconciles {{ .CRD.Kind }} managed resources. 26 func Setup(mgr ctrl.Manager, o tjcontroller.Options) error { 27 name := managed.ControllerName({{ .TypePackageAlias }}{{ .CRD.Kind }}_GroupVersionKind.String()) 28 var initializers managed.InitializerChain 29 {{- if .Initializers }} 30 for _, i := range o.Provider.Resources["{{ .ResourceType }}"].InitializerFns { 31 initializers = append(initializers,i(mgr.GetClient())) 32 } 33 {{- end}} 34 {{- if not .DisableNameInitializer }} 35 initializers = append(initializers, managed.NewNameAsExternalName(mgr.GetClient())) 36 {{- end}} 37 cps := []managed.ConnectionPublisher{managed.NewAPISecretPublisher(mgr.GetClient(), mgr.GetScheme())} 38 if o.SecretStoreConfigGVK != nil { 39 cps = append(cps, connection.NewDetailsManager(mgr.GetClient(), *o.SecretStoreConfigGVK, connection.WithTLSConfig(o.ESSOptions.TLSConfig))) 40 } 41 eventHandler := handler.NewEventHandler(handler.WithLogger(o.Logger.WithValues("gvk", {{ .TypePackageAlias }}{{ .CRD.Kind }}_GroupVersionKind))) 42 {{- if .UseAsync }} 43 ac := tjcontroller.NewAPICallbacks(mgr, xpresource.ManagedKind({{ .TypePackageAlias }}{{ .CRD.Kind }}_GroupVersionKind), tjcontroller.WithEventHandler(eventHandler){{ if or .UseTerraformPluginSDKClient .UseTerraformPluginFrameworkClient }}, tjcontroller.WithStatusUpdates(false){{ end }}) 44 {{- end}} 45 opts := []managed.ReconcilerOption{ 46 managed.WithExternalConnecter( 47 {{- if .UseTerraformPluginSDKClient -}} 48 {{- if .UseAsync }} 49 tjcontroller.NewTerraformPluginSDKAsyncConnector(mgr.GetClient(), o.OperationTrackerStore, o.SetupFn, o.Provider.Resources["{{ .ResourceType }}"], 50 tjcontroller.WithTerraformPluginSDKAsyncLogger(o.Logger), 51 tjcontroller.WithTerraformPluginSDKAsyncConnectorEventHandler(eventHandler), 52 tjcontroller.WithTerraformPluginSDKAsyncCallbackProvider(ac), 53 tjcontroller.WithTerraformPluginSDKAsyncMetricRecorder(metrics.NewMetricRecorder({{ .TypePackageAlias }}{{ .CRD.Kind }}_GroupVersionKind, mgr, o.PollInterval)), 54 {{if .FeaturesPackageAlias -}} 55 tjcontroller.WithTerraformPluginSDKAsyncManagementPolicies(o.Features.Enabled({{ .FeaturesPackageAlias }}EnableBetaManagementPolicies)) 56 {{- end -}} 57 ) 58 {{- else -}} 59 tjcontroller.NewTerraformPluginSDKConnector(mgr.GetClient(), o.SetupFn, o.Provider.Resources["{{ .ResourceType }}"], o.OperationTrackerStore, 60 tjcontroller.WithTerraformPluginSDKLogger(o.Logger), 61 tjcontroller.WithTerraformPluginSDKMetricRecorder(metrics.NewMetricRecorder({{ .TypePackageAlias }}{{ .CRD.Kind }}_GroupVersionKind, mgr, o.PollInterval)), 62 {{if .FeaturesPackageAlias -}} 63 tjcontroller.WithTerraformPluginSDKManagementPolicies(o.Features.Enabled({{ .FeaturesPackageAlias }}EnableBetaManagementPolicies)) 64 {{- end -}} 65 ) 66 {{- end -}} 67 {{- else if .UseTerraformPluginFrameworkClient -}} 68 {{- if .UseAsync }} 69 tjcontroller.NewTerraformPluginFrameworkAsyncConnector(mgr.GetClient(), o.OperationTrackerStore, o.SetupFn, o.Provider.Resources["{{ .ResourceType }}"], 70 tjcontroller.WithTerraformPluginFrameworkAsyncLogger(o.Logger), 71 tjcontroller.WithTerraformPluginFrameworkAsyncConnectorEventHandler(eventHandler), 72 tjcontroller.WithTerraformPluginFrameworkAsyncCallbackProvider(ac), 73 tjcontroller.WithTerraformPluginFrameworkAsyncMetricRecorder(metrics.NewMetricRecorder({{ .TypePackageAlias }}{{ .CRD.Kind }}_GroupVersionKind, mgr, o.PollInterval)), 74 {{if .FeaturesPackageAlias -}} 75 tjcontroller.WithTerraformPluginFrameworkAsyncManagementPolicies(o.Features.Enabled({{ .FeaturesPackageAlias }}EnableBetaManagementPolicies)) 76 {{- end -}} 77 ) 78 {{- else }} 79 tjcontroller.NewTerraformPluginFrameworkConnector(mgr.GetClient(), o.SetupFn, o.Provider.Resources["{{ .ResourceType }}"], o.OperationTrackerStore, 80 tjcontroller.WithTerraformPluginFrameworkLogger(o.Logger), 81 tjcontroller.WithTerraformPluginFrameworkMetricRecorder(metrics.NewMetricRecorder({{ .TypePackageAlias }}{{ .CRD.Kind }}_GroupVersionKind, mgr, o.PollInterval)), 82 {{if .FeaturesPackageAlias -}} 83 tjcontroller.WithTerraformPluginFrameworkManagementPolicies(o.Features.Enabled({{ .FeaturesPackageAlias }}EnableBetaManagementPolicies)) 84 {{- end -}} 85 ) 86 {{- end }} 87 {{- else -}} 88 tjcontroller.NewConnector(mgr.GetClient(), o.WorkspaceStore, o.SetupFn, o.Provider.Resources["{{ .ResourceType }}"], tjcontroller.WithLogger(o.Logger), tjcontroller.WithConnectorEventHandler(eventHandler), 89 {{- if .UseAsync }} 90 tjcontroller.WithCallbackProvider(ac), 91 {{- end }} 92 ) 93 {{- end -}} 94 ), 95 managed.WithLogger(o.Logger.WithValues("controller", name)), 96 managed.WithRecorder(event.NewAPIRecorder(mgr.GetEventRecorderFor(name))), 97 {{- if or .UseTerraformPluginSDKClient .UseTerraformPluginFrameworkClient }} 98 managed.WithFinalizer(tjcontroller.NewOperationTrackerFinalizer(o.OperationTrackerStore, xpresource.NewAPIFinalizer(mgr.GetClient(), managed.FinalizerName))), 99 {{- else }} 100 managed.WithFinalizer(terraform.NewWorkspaceFinalizer(o.WorkspaceStore, xpresource.NewAPIFinalizer(mgr.GetClient(), managed.FinalizerName))), 101 {{- end }} 102 managed.WithTimeout(3*time.Minute), 103 managed.WithInitializers(initializers), 104 managed.WithConnectionPublishers(cps...), 105 managed.WithPollInterval(o.PollInterval), 106 } 107 if o.PollJitter != 0 { 108 opts = append(opts, managed.WithPollJitterHook(o.PollJitter)) 109 } 110 {{- if .FeaturesPackageAlias }} 111 if o.Features.Enabled({{ .FeaturesPackageAlias }}EnableBetaManagementPolicies) { 112 opts = append(opts, managed.WithManagementPolicies()) 113 } 114 {{- end}} 115 if o.MetricOptions != nil { 116 opts = append(opts, managed.WithMetricRecorder(o.MetricOptions.MRMetrics)) 117 } 118 119 // register webhooks for the kind {{ .TypePackageAlias }}{{ .CRD.Kind }} 120 // if they're enabled. 121 if o.StartWebhooks { 122 if err := ctrl.NewWebhookManagedBy(mgr). 123 For(&{{ .TypePackageAlias }}{{ .CRD.Kind }}{}). 124 Complete(); err != nil { 125 return errors.Wrap(err, "cannot register webhook for the kind {{ .TypePackageAlias }}{{ .CRD.Kind }}") 126 } 127 } 128 129 if o.MetricOptions != nil && o.MetricOptions.MRStateMetrics != nil { 130 stateMetricsRecorder := statemetrics.NewMRStateRecorder( 131 mgr.GetClient(), o.Logger, o.MetricOptions.MRStateMetrics, &{{ .TypePackageAlias }}{{ .CRD.Kind }}List{}, o.MetricOptions.PollStateMetricInterval, 132 ) 133 if err := mgr.Add(stateMetricsRecorder); err != nil { 134 return errors.Wrap(err, "cannot register MR state metrics recorder for kind {{ .TypePackageAlias }}{{ .CRD.Kind }}List") 135 } 136 } 137 138 r := managed.NewReconciler(mgr, xpresource.ManagedKind({{ .TypePackageAlias }}{{ .CRD.Kind }}_GroupVersionKind), opts...) 139 140 return ctrl.NewControllerManagedBy(mgr). 141 Named(name). 142 WithOptions(o.ForControllerRuntime()). 143 WithEventFilter(xpresource.DesiredStateChanged()). 144 Watches(&{{ .TypePackageAlias }}{{ .CRD.Kind }}{}, eventHandler). 145 Complete(ratelimiter.NewReconciler(name, r, o.GlobalRateLimiter)) 146 }