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  }