@@ -36,6 +36,7 @@ import (
3636 "github.com/GoogleCloudPlatform/k8s-config-connector/pkg/krmtotf"
3737 "github.com/GoogleCloudPlatform/k8s-config-connector/pkg/lease/leaser"
3838 "github.com/GoogleCloudPlatform/k8s-config-connector/pkg/managementconflict"
39+ metricstransport "github.com/GoogleCloudPlatform/k8s-config-connector/pkg/metrics/transport"
3940 "github.com/GoogleCloudPlatform/k8s-config-connector/pkg/resourceoverrides"
4041 "github.com/GoogleCloudPlatform/k8s-config-connector/pkg/resourceoverrides/operations"
4142 "github.com/GoogleCloudPlatform/k8s-config-connector/pkg/servicemapping/servicemappingloader"
@@ -44,6 +45,7 @@ import (
4445 "github.com/go-logr/logr"
4546 tfschema "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
4647 "github.com/hashicorp/terraform-plugin-sdk/v2/terraform"
48+
4749 "golang.org/x/sync/semaphore"
4850 corev1 "k8s.io/api/core/v1"
4951 apiextensions "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
@@ -60,6 +62,8 @@ import (
6062 "sigs.k8s.io/controller-runtime/pkg/predicate"
6163 "sigs.k8s.io/controller-runtime/pkg/reconcile"
6264 "sigs.k8s.io/controller-runtime/pkg/source"
65+
66+ tpgconfig "github.com/hashicorp/terraform-provider-google-beta/google-beta/transport"
6367)
6468
6569var logger = log .Log
@@ -76,6 +80,7 @@ type Reconciler struct {
7680 smLoader * servicemappingloader.ServiceMappingLoader
7781 logger logr.Logger
7882 jitterGenerator jitter.Generator
83+ controllerName string
7984 // Fields used for triggering reconciliations when dependencies are ready
8085 immediateReconcileRequests chan event.GenericEvent
8186 resourceWatcherRoutines * semaphore.Weighted // Used to cap number of goroutines watching unready dependencies
@@ -160,10 +165,12 @@ func NewReconciler(mgr manager.Manager,
160165 immediateReconcileRequests : immediateReconcileRequests ,
161166 resourceWatcherRoutines : resourceWatcherRoutines ,
162167 jitterGenerator : jitterGenerator ,
168+ controllerName : controllerName ,
163169 }, nil
164170}
165171
166172func (r * Reconciler ) Reconcile (ctx context.Context , req reconcile.Request ) (res reconcile.Result , err error ) {
173+
167174 r .schemaRefMu .RLock ()
168175 defer r .schemaRefMu .RUnlock ()
169176 r .logger .Info ("starting reconcile" , "resource" , req .NamespacedName )
@@ -248,7 +255,14 @@ func (r *Reconciler) Reconcile(ctx context.Context, req reconcile.Request) (res
248255 if err := resourceoverrides .Handler .PreActuationTransform (& resource .Resource ); err != nil {
249256 return reconcile.Result {}, r .HandlePreActuationTransformFailed (ctx , & resource .Resource , fmt .Errorf ("error applying pre-actuation transformation to resource '%v': %w" , req .NamespacedName .String (), err ))
250257 }
251- requeue , err := r .sync (ctx , resource )
258+
259+ meta , err := cloneAndChangeContext (ctx , r .provider .Meta (), r .controllerName )
260+ if err != nil {
261+ log .FromContext (ctx ).Error (err , "error cloning and changing context; metrics may not show up" )
262+ meta = r .provider .Meta ()
263+ }
264+
265+ requeue , err := r .sync (ctx , resource , meta )
252266 if err != nil {
253267 return reconcile.Result {}, err
254268 }
@@ -263,7 +277,7 @@ func (r *Reconciler) Reconcile(ctx context.Context, req reconcile.Request) (res
263277 return reconcile.Result {RequeueAfter : jitteredPeriod }, nil
264278}
265279
266- func (r * Reconciler ) sync (ctx context.Context , krmResource * krmtotf.Resource ) (requeue bool , err error ) {
280+ func (r * Reconciler ) sync (ctx context.Context , krmResource * krmtotf.Resource , tfProviderMeta interface {} ) (requeue bool , err error ) {
267281 // isolate any panics to only this function
268282 defer execution .RecoverWithInternalError (& err )
269283 if ! krmResource .GetDeletionTimestamp ().IsZero () {
@@ -318,7 +332,7 @@ func (r *Reconciler) sync(ctx context.Context, krmResource *krmtotf.Resource) (r
318332 return false , err
319333 }
320334 r .logger .Info ("deleting underlying resource" , "resource" , k8s .GetNamespacedName (krmResource ))
321- if _ , err := krmResource .TFResource .Apply (ctx , liveState , & terraform.InstanceDiff {Destroy : true }, r . provider . Meta () ); err != nil {
335+ if _ , err := krmResource .TFResource .Apply (ctx , liveState , & terraform.InstanceDiff {Destroy : true }, tfProviderMeta ); err != nil {
322336 return false , r .HandleDeleteFailed (ctx , & krmResource .Resource , fmt .Errorf ("error deleting resource: %v" , err ))
323337 }
324338 return false , r .handleDeleted (ctx , krmResource )
@@ -360,7 +374,7 @@ func (r *Reconciler) sync(ctx context.Context, krmResource *krmtotf.Resource) (r
360374 if err := resourceoverrides .Handler .PreTerraformApply (ctx , krmResource .GroupVersionKind (), & operations.PreTerraformApply {KRMResource : krmResource , TerraformConfig : config , LiveState : liveState }); err != nil {
361375 return false , r .HandleUpdateFailed (ctx , & krmResource .Resource , fmt .Errorf ("error applying pre-apply transformation to resource: %w" , err ))
362376 }
363- diff , err := krmResource .TFResource .Diff (ctx , liveState , config , r . provider . Meta () )
377+ diff , err := krmResource .TFResource .Diff (ctx , liveState , config , tfProviderMeta )
364378 if err != nil {
365379 return false , r .HandleUpdateFailed (ctx , & krmResource .Resource , fmt .Errorf ("error calculating diff: %w" , err ))
366380 }
@@ -410,7 +424,7 @@ func (r *Reconciler) sync(ctx context.Context, krmResource *krmtotf.Resource) (r
410424 d .RequiresNew = false
411425 }
412426 }
413- newState , diagnostics := krmResource .TFResource .Apply (ctx , liveState , diff , r . provider . Meta () )
427+ newState , diagnostics := krmResource .TFResource .Apply (ctx , liveState , diff , tfProviderMeta )
414428 if err := krmtotf .NewErrorFromDiagnostics (diagnostics ); err != nil {
415429 r .logger .Error (err , "error applying desired state" , "resource" , krmResource .GetNamespacedName ())
416430 return false , r .HandleUpdateFailed (ctx , & krmResource .Resource , fmt .Errorf ("error applying desired state: %w" , err ))
@@ -637,3 +651,28 @@ func updateObservedSecretVersionsAnnotationFor(resource *krmtotf.Resource, secre
637651 hasSensitiveFields := tfresource .TFResourceHasSensitiveFields (resource .TFResource )
638652 return k8s .UpdateOrRemoveObservedSecretVersionsAnnotation (& resource .Resource , secretVersions , hasSensitiveFields )
639653}
654+
655+ // This is needed because the terraform provider framework does not provide a way to pass context to the provider functions.
656+ // The context is instead stored in the meta object.
657+ // We need to pass a context with the controller name to the metrics transport, so that the metrics can be labeled with the controller name.
658+ func cloneAndChangeContext (ctx context.Context , meta interface {}, controllerName string ) (interface {}, error ) {
659+ baseConfig , ok := meta .(* tpgconfig.Config )
660+ if ! ok {
661+ return nil , fmt .Errorf ("meta is not of type *tpgconfig.Config" )
662+ }
663+ metaC := * baseConfig
664+
665+ if baseConfig .ImpersonateServiceAccountDelegates != nil {
666+ metaC .ImpersonateServiceAccountDelegates = make ([]string , len (baseConfig .ImpersonateServiceAccountDelegates ))
667+ copy (metaC .ImpersonateServiceAccountDelegates , baseConfig .ImpersonateServiceAccountDelegates )
668+ }
669+
670+ if baseConfig .Scopes != nil {
671+ metaC .Scopes = make ([]string , len (baseConfig .Scopes ))
672+ copy (metaC .Scopes , baseConfig .Scopes )
673+ }
674+
675+ // This is the one field we are intentionally changing.
676+ metaC .Context = metricstransport .WithControllerName (ctx , controllerName ) // for metrics transport
677+ return & metaC , nil
678+ }
0 commit comments