From bd22d53d9cb589d0635f69ca5cea15a4e1bed43f Mon Sep 17 00:00:00 2001 From: Scott Andrews Date: Wed, 29 Mar 2023 15:31:24 -0400 Subject: [PATCH 1/4] Experimental update to generic reconciler-runtime Signed-off-by: Scott Andrews --- controllers/servicebinding_controller.go | 35 ++++---- controllers/servicebinding_controller_test.go | 26 +++--- controllers/webhook_controller.go | 71 ++++++++------- controllers/webhook_controller_test.go | 90 +++++++++++-------- go.mod | 14 +-- go.sum | 28 +++--- rbac/cani_test.go | 18 ++-- resolver/cluster_test.go | 21 ++++- 8 files changed, 165 insertions(+), 138 deletions(-) diff --git a/controllers/servicebinding_controller.go b/controllers/servicebinding_controller.go index 79a6059..076ee8c 100644 --- a/controllers/servicebinding_controller.go +++ b/controllers/servicebinding_controller.go @@ -28,7 +28,6 @@ import ( "k8s.io/apimachinery/pkg/runtime" ctlr "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/builder" - "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/handler" "sigs.k8s.io/controller-runtime/pkg/reconcile" "sigs.k8s.io/controller-runtime/pkg/source" @@ -44,12 +43,11 @@ import ( //+kubebuilder:rbac:groups=core,resources=events,verbs=get;list;watch;create;update;patch;delete // ServiceBindingReconciler reconciles a ServiceBinding object -func ServiceBindingReconciler(c reconcilers.Config) *reconcilers.ResourceReconciler { - return &reconcilers.ResourceReconciler{ - Type: &servicebindingv1beta1.ServiceBinding{}, - Reconciler: &reconcilers.WithFinalizer{ +func ServiceBindingReconciler(c reconcilers.Config) *reconcilers.ResourceReconciler[*servicebindingv1beta1.ServiceBinding] { + return &reconcilers.ResourceReconciler[*servicebindingv1beta1.ServiceBinding]{ + Reconciler: &reconcilers.WithFinalizer[*servicebindingv1beta1.ServiceBinding]{ Finalizer: servicebindingv1beta1.GroupVersion.Group + "/finalizer", - Reconciler: reconcilers.Sequence{ + Reconciler: reconcilers.Sequence[*servicebindingv1beta1.ServiceBinding]{ ResolveBindingSecret(), ResolveWorkloads(), ProjectBinding(), @@ -61,8 +59,8 @@ func ServiceBindingReconciler(c reconcilers.Config) *reconcilers.ResourceReconci } } -func ResolveBindingSecret() reconcilers.SubReconciler { - return &reconcilers.SyncReconciler{ +func ResolveBindingSecret() reconcilers.SubReconciler[*servicebindingv1beta1.ServiceBinding] { + return &reconcilers.SyncReconciler[*servicebindingv1beta1.ServiceBinding]{ Name: "ResolveBindingSecret", Sync: func(ctx context.Context, resource *servicebindingv1beta1.ServiceBinding) error { c := reconcilers.RetrieveConfigOrDie(ctx) @@ -119,11 +117,11 @@ func ResolveBindingSecret() reconcilers.SubReconciler { } } -func ResolveWorkloads() reconcilers.SubReconciler { - return &reconcilers.SyncReconciler{ +func ResolveWorkloads() reconcilers.SubReconciler[*servicebindingv1beta1.ServiceBinding] { + return &reconcilers.SyncReconciler[*servicebindingv1beta1.ServiceBinding]{ Name: "ResolveWorkloads", SyncDuringFinalization: true, - Sync: func(ctx context.Context, resource *servicebindingv1beta1.ServiceBinding) (reconcile.Result, error) { + SyncWithResult: func(ctx context.Context, resource *servicebindingv1beta1.ServiceBinding) (reconcile.Result, error) { c := reconcilers.RetrieveConfigOrDie(ctx) ref := corev1.ObjectReference{ @@ -164,8 +162,8 @@ func ResolveWorkloads() reconcilers.SubReconciler { //+kubebuilder:rbac:groups=servicebinding.io,resources=clusterworkloadresourcemappings,verbs=get;list;watch -func ProjectBinding() reconcilers.SubReconciler { - return &reconcilers.SyncReconciler{ +func ProjectBinding() reconcilers.SubReconciler[*servicebindingv1beta1.ServiceBinding] { + return &reconcilers.SyncReconciler[*servicebindingv1beta1.ServiceBinding]{ Name: "ProjectBinding", SyncDuringFinalization: true, Sync: func(ctx context.Context, resource *servicebindingv1beta1.ServiceBinding) error { @@ -201,16 +199,15 @@ func ProjectBinding() reconcilers.SubReconciler { } } -func PatchWorkloads() reconcilers.SubReconciler { - workloadManager := &reconcilers.ResourceManager{ +func PatchWorkloads() reconcilers.SubReconciler[*servicebindingv1beta1.ServiceBinding] { + workloadManager := &reconcilers.ResourceManager[*unstructured.Unstructured]{ Name: "PatchWorkloads", - Type: &unstructured.Unstructured{}, MergeBeforeUpdate: func(current, desired *unstructured.Unstructured) { current.SetUnstructuredContent(desired.UnstructuredContent()) }, } - return &reconcilers.SyncReconciler{ + return &reconcilers.SyncReconciler[*servicebindingv1beta1.ServiceBinding]{ Name: "PatchWorkloads", SyncDuringFinalization: true, Sync: func(ctx context.Context, resource *servicebindingv1beta1.ServiceBinding) error { @@ -222,8 +219,8 @@ func PatchWorkloads() reconcilers.SubReconciler { } for i := range workloads { - workload := workloads[i].(client.Object) - projectedWorkload := projectedWorkloads[i].(client.Object) + workload := workloads[i].(*unstructured.Unstructured) + projectedWorkload := projectedWorkloads[i].(*unstructured.Unstructured) if workload.GetUID() != projectedWorkload.GetUID() || workload.GetResourceVersion() != projectedWorkload.GetResourceVersion() { panic(fmt.Errorf("workload and projectedWorkload must have the same uid and resourceVersion")) } diff --git a/controllers/servicebinding_controller_test.go b/controllers/servicebinding_controller_test.go index 81215cb..21ad724 100644 --- a/controllers/servicebinding_controller_test.go +++ b/controllers/servicebinding_controller_test.go @@ -51,7 +51,7 @@ func TestServiceBindingReconciler(t *testing.T) { name := "my-binding" uid := types.UID("dde10100-d7b3-4cba-9430-51d60a8612a6") secretName := "my-secret" - key := types.NamespacedName{Namespace: namespace, Name: name} + request := reconcilers.Request{NamespacedName: types.NamespacedName{Namespace: namespace, Name: name}} podSpecableMapping := `{"versions":[{"version":"*","annotations":".spec.template.metadata.annotations","containers":[{"path":".spec.template.spec.initContainers[*]","name":".name","env":".env","volumeMounts":".volumeMounts"},{"path":".spec.template.spec.containers[*]","name":".name","env":".env","volumeMounts":".volumeMounts"}],"volumes":".spec.template.spec.volumes"}]}` @@ -157,7 +157,7 @@ func TestServiceBindingReconciler(t *testing.T) { rts := rtesting.ReconcilerTests{ "in sync": { - Key: key, + Request: request, GivenObjects: []client.Object{ serviceBinding. MetadataDie(func(d *diemetav1.ObjectMetaDie) { @@ -181,7 +181,7 @@ func TestServiceBindingReconciler(t *testing.T) { }, }, "newly created, resolves secret": { - Key: key, + Request: request, GivenObjects: []client.Object{ serviceBinding, workload, @@ -215,7 +215,7 @@ func TestServiceBindingReconciler(t *testing.T) { }, }, "has resolved secret, project into workload": { - Key: key, + Request: request, GivenObjects: []client.Object{ serviceBinding. MetadataDie(func(d *diemetav1.ObjectMetaDie) { @@ -254,7 +254,7 @@ func TestServiceBindingReconciler(t *testing.T) { }, }, "terminating": { - Key: key, + Request: request, GivenObjects: []client.Object{ serviceBinding. MetadataDie(func(d *diemetav1.ObjectMetaDie) { @@ -330,7 +330,7 @@ func TestResolveBindingSecret(t *testing.T) { }, } - rts := rtesting.SubReconcilerTests{ + rts := rtesting.SubReconcilerTests[*servicebindingv1beta1.ServiceBinding]{ "in sync": { Resource: serviceBinding. SpecDie(func(d *dieservicebindingv1beta1.ServiceBindingSpecDie) { @@ -501,7 +501,7 @@ func TestResolveBindingSecret(t *testing.T) { }, } - rts.Run(t, scheme, func(t *testing.T, tc *rtesting.SubReconcilerTestCase, c reconcilers.Config) reconcilers.SubReconciler { + rts.Run(t, scheme, func(t *testing.T, tc *rtesting.SubReconcilerTestCase[*servicebindingv1beta1.ServiceBinding], c reconcilers.Config) reconcilers.SubReconciler[*servicebindingv1beta1.ServiceBinding] { return controllers.ResolveBindingSecret() }) } @@ -542,7 +542,7 @@ func TestResolveWorkload(t *testing.T) { d.AddLabel("app", "not") }) - rts := rtesting.SubReconcilerTests{ + rts := rtesting.SubReconcilerTests[*servicebindingv1beta1.ServiceBinding]{ "resolve named workload": { Resource: serviceBinding. SpecDie(func(d *dieservicebindingv1beta1.ServiceBindingSpecDie) { @@ -726,7 +726,7 @@ func TestResolveWorkload(t *testing.T) { }, } - rts.Run(t, scheme, func(t *testing.T, tc *rtesting.SubReconcilerTestCase, c reconcilers.Config) reconcilers.SubReconciler { + rts.Run(t, scheme, func(t *testing.T, tc *rtesting.SubReconcilerTestCase[*servicebindingv1beta1.ServiceBinding], c reconcilers.Config) reconcilers.SubReconciler[*servicebindingv1beta1.ServiceBinding] { return controllers.ResolveWorkloads() }) } @@ -840,7 +840,7 @@ func TestProjectBinding(t *testing.T) { unstructured.SetNestedSlice(unprojectedWorkload.UnstructuredContent(), containers, "spec", "template", "spec", "containers") unstructured.SetNestedSlice(unprojectedWorkload.UnstructuredContent(), []interface{}{}, "spec", "template", "spec", "volumes") - rts := rtesting.SubReconcilerTests{ + rts := rtesting.SubReconcilerTests[*servicebindingv1beta1.ServiceBinding]{ "project workload": { Resource: serviceBinding. SpecDie(func(d *dieservicebindingv1beta1.ServiceBindingSpecDie) { @@ -892,7 +892,7 @@ func TestProjectBinding(t *testing.T) { }, } - rts.Run(t, scheme, func(t *testing.T, tc *rtesting.SubReconcilerTestCase, c reconcilers.Config) reconcilers.SubReconciler { + rts.Run(t, scheme, func(t *testing.T, tc *rtesting.SubReconcilerTestCase[*servicebindingv1beta1.ServiceBinding], c reconcilers.Config) reconcilers.SubReconciler[*servicebindingv1beta1.ServiceBinding] { restMapper := c.RESTMapper().(*meta.DefaultRESTMapper) restMapper.Add(schema.GroupVersionKind{Group: "apps", Version: "v1", Kind: "Deployment"}, meta.RESTScopeNamespace) return controllers.ProjectBinding() @@ -943,7 +943,7 @@ func TestPatchWorkloads(t *testing.T) { }) }) - rts := rtesting.SubReconcilerTests{ + rts := rtesting.SubReconcilerTests[*servicebindingv1beta1.ServiceBinding]{ "in sync": { Resource: serviceBinding. StatusDie(func(d *dieservicebindingv1beta1.ServiceBindingStatusDie) { @@ -1141,7 +1141,7 @@ func TestPatchWorkloads(t *testing.T) { }, } - rts.Run(t, scheme, func(t *testing.T, tc *rtesting.SubReconcilerTestCase, c reconcilers.Config) reconcilers.SubReconciler { + rts.Run(t, scheme, func(t *testing.T, tc *rtesting.SubReconcilerTestCase[*servicebindingv1beta1.ServiceBinding], c reconcilers.Config) reconcilers.SubReconciler[*servicebindingv1beta1.ServiceBinding] { return controllers.PatchWorkloads() }) } diff --git a/controllers/webhook_controller.go b/controllers/webhook_controller.go index a0854ee..722b48d 100644 --- a/controllers/webhook_controller.go +++ b/controllers/webhook_controller.go @@ -49,23 +49,25 @@ import ( //+kubebuilder:rbac:groups=core,resources=events,verbs=get;list;watch;create;update;patch;delete // AdmissionProjector reconciles a MutatingWebhookConfiguration object -func AdmissionProjectorReconciler(c reconcilers.Config, name string, accessChecker rbac.AccessChecker) *reconcilers.AggregateReconciler { +func AdmissionProjectorReconciler(c reconcilers.Config, name string, accessChecker rbac.AccessChecker) *reconcilers.AggregateReconciler[*admissionregistrationv1.MutatingWebhookConfiguration] { req := reconcile.Request{ NamespacedName: types.NamespacedName{ Name: name, }, } - return &reconcilers.AggregateReconciler{ + return &reconcilers.AggregateReconciler[*admissionregistrationv1.MutatingWebhookConfiguration]{ Name: "AdmissionProjector", - Type: &admissionregistrationv1.MutatingWebhookConfiguration{}, Request: req, - Reconciler: reconcilers.Sequence{ - LoadServiceBindings(req), - InterceptGVKs(), - WebhookRules([]admissionregistrationv1.OperationType{admissionregistrationv1.Create, admissionregistrationv1.Update}, accessChecker), + Reconciler: &reconcilers.CastResource[*admissionregistrationv1.MutatingWebhookConfiguration, client.Object]{ + Type: &unstructured.Unstructured{}, + Reconciler: reconcilers.Sequence[client.Object]{ + LoadServiceBindings(req), + InterceptGVKs(), + WebhookRules([]admissionregistrationv1.OperationType{admissionregistrationv1.Create, admissionregistrationv1.Update}, accessChecker), + }, }, - DesiredResource: func(ctx context.Context, resource *admissionregistrationv1.MutatingWebhookConfiguration) (client.Object, error) { + DesiredResource: func(ctx context.Context, resource *admissionregistrationv1.MutatingWebhookConfiguration) (*admissionregistrationv1.MutatingWebhookConfiguration, error) { if resource == nil || len(resource.Webhooks) != 1 { // the webhook config isn't in a form that we expect, ignore it return resource, nil @@ -81,7 +83,7 @@ func AdmissionProjectorReconciler(c reconcilers.Config, name string, accessCheck } current.Webhooks[0].Rules = desired.Webhooks[0].Rules }, - Sanitize: func(resource *admissionregistrationv1.MutatingWebhookConfiguration) []admissionregistrationv1.RuleWithOperations { + Sanitize: func(resource *admissionregistrationv1.MutatingWebhookConfiguration) interface{} { if resource == nil || len(resource.Webhooks) == 0 { return nil } @@ -98,11 +100,10 @@ func AdmissionProjectorReconciler(c reconcilers.Config, name string, accessCheck } } -func AdmissionProjectorWebhook(c reconcilers.Config) *reconcilers.AdmissionWebhookAdapter { - return &reconcilers.AdmissionWebhookAdapter{ +func AdmissionProjectorWebhook(c reconcilers.Config) *reconcilers.AdmissionWebhookAdapter[*unstructured.Unstructured] { + return &reconcilers.AdmissionWebhookAdapter[*unstructured.Unstructured]{ Name: "AdmissionProjectorWebhook", - Type: &unstructured.Unstructured{}, - Reconciler: &reconcilers.SyncReconciler{ + Reconciler: &reconcilers.SyncReconciler[*unstructured.Unstructured]{ Sync: func(ctx context.Context, workload *unstructured.Unstructured) error { c := reconcilers.RetrieveConfigOrDie(ctx) @@ -157,24 +158,26 @@ func AdmissionProjectorWebhook(c reconcilers.Config) *reconcilers.AdmissionWebho //+kubebuilder:rbac:groups=core,resources=events,verbs=get;list;watch;create;update;patch;delete // TriggerReconciler reconciles a ValidatingWebhookConfiguration object -func TriggerReconciler(c reconcilers.Config, name string, accessChecker rbac.AccessChecker) *reconcilers.AggregateReconciler { +func TriggerReconciler(c reconcilers.Config, name string, accessChecker rbac.AccessChecker) *reconcilers.AggregateReconciler[*admissionregistrationv1.ValidatingWebhookConfiguration] { req := reconcile.Request{ NamespacedName: types.NamespacedName{ Name: name, }, } - return &reconcilers.AggregateReconciler{ + return &reconcilers.AggregateReconciler[*admissionregistrationv1.ValidatingWebhookConfiguration]{ Name: "Trigger", - Type: &admissionregistrationv1.ValidatingWebhookConfiguration{}, Request: req, - Reconciler: reconcilers.Sequence{ - LoadServiceBindings(req), - TriggerGVKs(), - InterceptGVKs(), - WebhookRules([]admissionregistrationv1.OperationType{admissionregistrationv1.Create, admissionregistrationv1.Update, admissionregistrationv1.Delete}, accessChecker), + Reconciler: &reconcilers.CastResource[*admissionregistrationv1.ValidatingWebhookConfiguration, client.Object]{ + Type: &unstructured.Unstructured{}, + Reconciler: reconcilers.Sequence[client.Object]{ + LoadServiceBindings(req), + TriggerGVKs(), + InterceptGVKs(), + WebhookRules([]admissionregistrationv1.OperationType{admissionregistrationv1.Create, admissionregistrationv1.Update, admissionregistrationv1.Delete}, accessChecker), + }, }, - DesiredResource: func(ctx context.Context, resource *admissionregistrationv1.ValidatingWebhookConfiguration) (client.Object, error) { + DesiredResource: func(ctx context.Context, resource *admissionregistrationv1.ValidatingWebhookConfiguration) (*admissionregistrationv1.ValidatingWebhookConfiguration, error) { if resource == nil || len(resource.Webhooks) != 1 { // the webhook config isn't in a form that we expect, ignore it return resource, nil @@ -190,7 +193,7 @@ func TriggerReconciler(c reconcilers.Config, name string, accessChecker rbac.Acc } current.Webhooks[0].Rules = desired.Webhooks[0].Rules }, - Sanitize: func(resource *admissionregistrationv1.ValidatingWebhookConfiguration) []admissionregistrationv1.RuleWithOperations { + Sanitize: func(resource *admissionregistrationv1.ValidatingWebhookConfiguration) interface{} { if resource == nil || len(resource.Webhooks) == 0 { return nil } @@ -201,11 +204,11 @@ func TriggerReconciler(c reconcilers.Config, name string, accessChecker rbac.Acc } } -func TriggerWebhook(c reconcilers.Config, serviceBindingController controller.Controller) *reconcilers.AdmissionWebhookAdapter { - return &reconcilers.AdmissionWebhookAdapter{ +func TriggerWebhook(c reconcilers.Config, serviceBindingController controller.Controller) *reconcilers.AdmissionWebhookAdapter[*unstructured.Unstructured] { + return &reconcilers.AdmissionWebhookAdapter[*unstructured.Unstructured]{ Name: "AdmissionProjectorWebhook", Type: &unstructured.Unstructured{}, - Reconciler: &reconcilers.SyncReconciler{ + Reconciler: &reconcilers.SyncReconciler[*unstructured.Unstructured]{ Sync: func(ctx context.Context, trigger *unstructured.Unstructured) error { log := logr.FromContextOrDiscard(ctx) c := reconcilers.RetrieveConfigOrDie(ctx) @@ -243,8 +246,8 @@ func TriggerWebhook(c reconcilers.Config, serviceBindingController controller.Co } } -func LoadServiceBindings(req reconcile.Request) reconcilers.SubReconciler { - return &reconcilers.SyncReconciler{ +func LoadServiceBindings(req reconcile.Request) reconcilers.SubReconciler[client.Object] { + return &reconcilers.SyncReconciler[client.Object]{ Name: "LoadServiceBindings", Sync: func(ctx context.Context, _ client.Object) error { c := reconcilers.RetrieveConfigOrDie(ctx) @@ -269,8 +272,8 @@ func LoadServiceBindings(req reconcile.Request) reconcilers.SubReconciler { } } -func InterceptGVKs() reconcilers.SubReconciler { - return &reconcilers.SyncReconciler{ +func InterceptGVKs() reconcilers.SubReconciler[client.Object] { + return &reconcilers.SyncReconciler[client.Object]{ Name: "InterceptGVKs", Sync: func(ctx context.Context, _ client.Object) error { serviceBindings := RetrieveServiceBindings(ctx) @@ -289,8 +292,8 @@ func InterceptGVKs() reconcilers.SubReconciler { } } -func TriggerGVKs() reconcilers.SubReconciler { - return &reconcilers.SyncReconciler{ +func TriggerGVKs() reconcilers.SubReconciler[client.Object] { + return &reconcilers.SyncReconciler[client.Object]{ Name: "TriggerGVKs", Sync: func(ctx context.Context, _ client.Object) error { serviceBindings := RetrieveServiceBindings(ctx) @@ -313,8 +316,8 @@ func TriggerGVKs() reconcilers.SubReconciler { } } -func WebhookRules(operations []admissionregistrationv1.OperationType, accessChecker rbac.AccessChecker) reconcilers.SubReconciler { - return &reconcilers.SyncReconciler{ +func WebhookRules(operations []admissionregistrationv1.OperationType, accessChecker rbac.AccessChecker) reconcilers.SubReconciler[client.Object] { + return &reconcilers.SyncReconciler[client.Object]{ Name: "WebhookRules", Sync: func(ctx context.Context, _ client.Object) error { log := logr.FromContextOrDiscard(ctx) diff --git a/controllers/webhook_controller_test.go b/controllers/webhook_controller_test.go index 5818e61..9b8797c 100644 --- a/controllers/webhook_controller_test.go +++ b/controllers/webhook_controller_test.go @@ -60,7 +60,7 @@ import ( func TestAdmissionProjectorReconciler(t *testing.T) { name := "my-webhook" - key := types.NamespacedName{Name: name} + request := reconcilers.Request{NamespacedName: types.NamespacedName{Name: name}} scheme := runtime.NewScheme() utilruntime.Must(clientgoscheme.AddToScheme(scheme)) @@ -109,7 +109,7 @@ func TestAdmissionProjectorReconciler(t *testing.T) { rts := rtesting.ReconcilerTests{ "in sync": { - Key: key, + Request: request, GivenObjects: []client.Object{ webhook, serviceBinding, @@ -122,7 +122,7 @@ func TestAdmissionProjectorReconciler(t *testing.T) { }, }, "update": { - Key: key, + Request: request, GivenObjects: []client.Object{ webhook. WebhookDie("projector.servicebinding.io", func(d *dieadmissionregistrationv1.MutatingWebhookDie) { @@ -144,8 +144,10 @@ func TestAdmissionProjectorReconciler(t *testing.T) { }, }, "ignore other keys": { - Key: types.NamespacedName{ - Name: "other-webhook", + Request: reconcilers.Request{ + NamespacedName: types.NamespacedName{ + Name: "other-webhook", + }, }, GivenObjects: []client.Object{ webhook. @@ -156,7 +158,7 @@ func TestAdmissionProjectorReconciler(t *testing.T) { }, }, "ignore malformed webhook": { - Key: key, + Request: request, GivenObjects: []client.Object{ webhook. Webhooks(), @@ -522,7 +524,7 @@ func TestAdmissionProjectorWebhook(t *testing.T) { func TestTriggerReconciler(t *testing.T) { name := "my-webhook" - key := types.NamespacedName{Name: name} + request := reconcilers.Request{NamespacedName: types.NamespacedName{Name: name}} scheme := runtime.NewScheme() utilruntime.Must(clientgoscheme.AddToScheme(scheme)) @@ -581,7 +583,7 @@ func TestTriggerReconciler(t *testing.T) { rts := rtesting.ReconcilerTests{ "in sync": { - Key: key, + Request: request, GivenObjects: []client.Object{ webhook, serviceBinding, @@ -596,7 +598,7 @@ func TestTriggerReconciler(t *testing.T) { }, }, "update": { - Key: key, + Request: request, GivenObjects: []client.Object{ webhook. WebhookDie("trigger.servicebinding.io", func(d *dieadmissionregistrationv1.ValidatingWebhookDie) { @@ -620,8 +622,10 @@ func TestTriggerReconciler(t *testing.T) { }, }, "ignore other keys": { - Key: types.NamespacedName{ - Name: "other-webhook", + Request: reconcilers.Request{ + NamespacedName: types.NamespacedName{ + Name: "other-webhook", + }, }, GivenObjects: []client.Object{ webhook. @@ -632,7 +636,7 @@ func TestTriggerReconciler(t *testing.T) { }, }, "ignore malformed webhook": { - Key: key, + Request: request, GivenObjects: []client.Object{ webhook. Webhooks(), @@ -768,7 +772,9 @@ func TestLoadServiceBindings(t *testing.T) { utilruntime.Must(clientgoscheme.AddToScheme(scheme)) utilruntime.Must(servicebindingv1beta1.AddToScheme(scheme)) - webhook := dieadmissionregistrationv1.ValidatingWebhookConfigurationBlank + webhook := dieadmissionregistrationv1.ValidatingWebhookConfigurationBlank. + APIVersion("admissionregistration.k8s.io"). + Kind("ValidatingWebhookConfiguration") serviceBinding := dieservicebindingv1beta1.ServiceBindingBlank. MetadataDie(func(d *diemetav1.ObjectMetaDie) { @@ -788,9 +794,9 @@ func TestLoadServiceBindings(t *testing.T) { }) }) - rts := rtesting.SubReconcilerTests{ + rts := rtesting.SubReconcilerTests[client.Object]{ "list all servicebindings": { - Resource: webhook, + Resource: webhook.DieReleaseUnstructured(), GivenObjects: []client.Object{ serviceBinding, }, @@ -801,7 +807,7 @@ func TestLoadServiceBindings(t *testing.T) { }, }, "error listing all servicebindings": { - Resource: webhook, + Resource: webhook.DieReleaseUnstructured(), GivenObjects: []client.Object{ serviceBinding, }, @@ -812,7 +818,7 @@ func TestLoadServiceBindings(t *testing.T) { }, } - rts.Run(t, scheme, func(t *testing.T, tc *rtesting.SubReconcilerTestCase, c reconcilers.Config) reconcilers.SubReconciler { + rts.Run(t, scheme, func(t *testing.T, tc *rtesting.SubReconcilerTestCase[client.Object], c reconcilers.Config) reconcilers.SubReconciler[client.Object] { req := reconcile.Request{NamespacedName: types.NamespacedName{Name: "my-webhook"}} return controllers.LoadServiceBindings(req) }) @@ -823,7 +829,9 @@ func TestInterceptGVKs(t *testing.T) { utilruntime.Must(clientgoscheme.AddToScheme(scheme)) utilruntime.Must(servicebindingv1beta1.AddToScheme(scheme)) - webhook := dieadmissionregistrationv1.ValidatingWebhookConfigurationBlank + webhook := dieadmissionregistrationv1.ValidatingWebhookConfigurationBlank. + APIVersion("admissionregistration.k8s.io"). + Kind("ValidatingWebhookConfiguration") serviceBinding := dieservicebindingv1beta1.ServiceBindingBlank. MetadataDie(func(d *diemetav1.ObjectMetaDie) { @@ -843,9 +851,9 @@ func TestInterceptGVKs(t *testing.T) { }) }) - rts := rtesting.SubReconcilerTests{ + rts := rtesting.SubReconcilerTests[client.Object]{ "collect workload gvks": { - Resource: webhook, + Resource: webhook.DieReleaseUnstructured(), GivenStashedValues: map[reconcilers.StashKey]interface{}{ controllers.ServiceBindingsStashKey: []servicebindingv1beta1.ServiceBinding{ serviceBinding.DieRelease(), @@ -858,7 +866,7 @@ func TestInterceptGVKs(t *testing.T) { }, }, "append workload gvks": { - Resource: webhook, + Resource: webhook.DieReleaseUnstructured(), GivenStashedValues: map[reconcilers.StashKey]interface{}{ controllers.ServiceBindingsStashKey: []servicebindingv1beta1.ServiceBinding{ serviceBinding.DieRelease(), @@ -876,7 +884,7 @@ func TestInterceptGVKs(t *testing.T) { }, } - rts.Run(t, scheme, func(t *testing.T, tc *rtesting.SubReconcilerTestCase, c reconcilers.Config) reconcilers.SubReconciler { + rts.Run(t, scheme, func(t *testing.T, tc *rtesting.SubReconcilerTestCase[client.Object], c reconcilers.Config) reconcilers.SubReconciler[client.Object] { return controllers.InterceptGVKs() }) } @@ -886,7 +894,9 @@ func TestTriggerGVKs(t *testing.T) { utilruntime.Must(clientgoscheme.AddToScheme(scheme)) utilruntime.Must(servicebindingv1beta1.AddToScheme(scheme)) - webhook := dieadmissionregistrationv1.ValidatingWebhookConfigurationBlank + webhook := dieadmissionregistrationv1.ValidatingWebhookConfigurationBlank. + APIVersion("admissionregistration.k8s.io"). + Kind("ValidatingWebhookConfiguration") serviceBinding := dieservicebindingv1beta1.ServiceBindingBlank. MetadataDie(func(d *diemetav1.ObjectMetaDie) { @@ -906,9 +916,9 @@ func TestTriggerGVKs(t *testing.T) { }) }) - rts := rtesting.SubReconcilerTests{ + rts := rtesting.SubReconcilerTests[client.Object]{ "collect service gvks": { - Resource: webhook, + Resource: webhook.DieReleaseUnstructured(), GivenStashedValues: map[reconcilers.StashKey]interface{}{ controllers.ServiceBindingsStashKey: []servicebindingv1beta1.ServiceBinding{ serviceBinding.DieRelease(), @@ -921,7 +931,7 @@ func TestTriggerGVKs(t *testing.T) { }, }, "append service gvks": { - Resource: webhook, + Resource: webhook.DieReleaseUnstructured(), GivenStashedValues: map[reconcilers.StashKey]interface{}{ controllers.ServiceBindingsStashKey: []servicebindingv1beta1.ServiceBinding{ serviceBinding.DieRelease(), @@ -938,7 +948,7 @@ func TestTriggerGVKs(t *testing.T) { }, }, "ignore direct binding": { - Resource: webhook, + Resource: webhook.DieReleaseUnstructured(), GivenStashedValues: map[reconcilers.StashKey]interface{}{ controllers.ServiceBindingsStashKey: []servicebindingv1beta1.ServiceBinding{ serviceBinding. @@ -957,7 +967,7 @@ func TestTriggerGVKs(t *testing.T) { }, } - rts.Run(t, scheme, func(t *testing.T, tc *rtesting.SubReconcilerTestCase, c reconcilers.Config) reconcilers.SubReconciler { + rts.Run(t, scheme, func(t *testing.T, tc *rtesting.SubReconcilerTestCase[client.Object], c reconcilers.Config) reconcilers.SubReconciler[client.Object] { return controllers.TriggerGVKs() }) } @@ -967,15 +977,17 @@ func TestWebhookRules(t *testing.T) { utilruntime.Must(clientgoscheme.AddToScheme(scheme)) utilruntime.Must(servicebindingv1beta1.AddToScheme(scheme)) - webhook := dieadmissionregistrationv1.ValidatingWebhookConfigurationBlank + webhook := dieadmissionregistrationv1.ValidatingWebhookConfigurationBlank. + APIVersion("admissionregistration.k8s.io"). + Kind("ValidatingWebhookConfiguration") operations := []admissionregistrationv1.OperationType{ admissionregistrationv1.Connect, } - rts := rtesting.SubReconcilerTests{ + rts := rtesting.SubReconcilerTests[client.Object]{ "empty": { - Resource: webhook, + Resource: webhook.DieReleaseUnstructured(), GivenStashedValues: map[reconcilers.StashKey]interface{}{ controllers.ObservedGVKsStashKey: []schema.GroupVersionKind{}, }, @@ -984,7 +996,7 @@ func TestWebhookRules(t *testing.T) { }, }, "convert": { - Resource: webhook, + Resource: webhook.DieReleaseUnstructured(), GivenStashedValues: map[reconcilers.StashKey]interface{}{ controllers.ObservedGVKsStashKey: []schema.GroupVersionKind{ {Group: "apps", Version: "v1", Kind: "Deployment"}, @@ -1010,7 +1022,7 @@ func TestWebhookRules(t *testing.T) { }, }, "dedup versions": { - Resource: webhook, + Resource: webhook.DieReleaseUnstructured(), GivenStashedValues: map[reconcilers.StashKey]interface{}{ controllers.ObservedGVKsStashKey: []schema.GroupVersionKind{ {Group: "apps", Version: "v1", Kind: "Deployment"}, @@ -1037,7 +1049,7 @@ func TestWebhookRules(t *testing.T) { }, }, "merge resources of same group": { - Resource: webhook, + Resource: webhook.DieReleaseUnstructured(), GivenStashedValues: map[reconcilers.StashKey]interface{}{ controllers.ObservedGVKsStashKey: []schema.GroupVersionKind{ {Group: "apps", Version: "v1", Kind: "StatefulSet"}, @@ -1066,7 +1078,7 @@ func TestWebhookRules(t *testing.T) { }, }, "preserve resources of different group": { - Resource: webhook, + Resource: webhook.DieReleaseUnstructured(), GivenStashedValues: map[reconcilers.StashKey]interface{}{ controllers.ObservedGVKsStashKey: []schema.GroupVersionKind{ {Group: "batch", Version: "v1", Kind: "Job"}, @@ -1103,7 +1115,7 @@ func TestWebhookRules(t *testing.T) { }, }, "error on unknown resource": { - Resource: webhook, + Resource: webhook.DieReleaseUnstructured(), GivenStashedValues: map[reconcilers.StashKey]interface{}{ controllers.ObservedGVKsStashKey: []schema.GroupVersionKind{ {Group: "foo", Version: "v1", Kind: "Bar"}, @@ -1112,7 +1124,7 @@ func TestWebhookRules(t *testing.T) { ShouldErr: true, }, "drop denied resources": { - Resource: webhook, + Resource: webhook.DieReleaseUnstructured(), GivenStashedValues: map[reconcilers.StashKey]interface{}{ controllers.ObservedGVKsStashKey: []schema.GroupVersionKind{ {Group: "apps", Version: "v1", Kind: "Deployment"}, @@ -1126,7 +1138,7 @@ func TestWebhookRules(t *testing.T) { }, }, "treat SelfSubjectAccessReview errors as denied": { - Resource: webhook, + Resource: webhook.DieReleaseUnstructured(), GivenStashedValues: map[reconcilers.StashKey]interface{}{ controllers.ObservedGVKsStashKey: []schema.GroupVersionKind{ {Group: "apps", Version: "v1", Kind: "Deployment"}, @@ -1144,7 +1156,7 @@ func TestWebhookRules(t *testing.T) { }, } - rts.Run(t, scheme, func(t *testing.T, tc *rtesting.SubReconcilerTestCase, c reconcilers.Config) reconcilers.SubReconciler { + rts.Run(t, scheme, func(t *testing.T, tc *rtesting.SubReconcilerTestCase[client.Object], c reconcilers.Config) reconcilers.SubReconciler[client.Object] { restMapper := c.RESTMapper().(*meta.DefaultRESTMapper) restMapper.Add(schema.GroupVersionKind{Group: "apps", Version: "v1", Kind: "Deployment"}, meta.RESTScopeNamespace) restMapper.Add(schema.GroupVersionKind{Group: "apps", Version: "v1beta1", Kind: "Deployment"}, meta.RESTScopeNamespace) diff --git a/go.mod b/go.mod index 0d1a605..6972063 100644 --- a/go.mod +++ b/go.mod @@ -2,6 +2,8 @@ module github.com/servicebinding/runtime go 1.19 +replace github.com/vmware-labs/reconciler-runtime => github.com/scothis/reconciler-runtime v0.4.1-0.20230329162113-e603c75989e8 + require ( dies.dev v0.7.0 github.com/go-logr/logr v1.2.3 @@ -50,11 +52,11 @@ require ( go.uber.org/atomic v1.7.0 // indirect go.uber.org/multierr v1.6.0 // indirect go.uber.org/zap v1.24.0 // indirect - golang.org/x/net v0.7.0 // indirect + golang.org/x/net v0.8.0 // indirect golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b // indirect - golang.org/x/sys v0.5.0 // indirect - golang.org/x/term v0.5.0 // indirect - golang.org/x/text v0.7.0 // indirect + golang.org/x/sys v0.6.0 // indirect + golang.org/x/term v0.6.0 // indirect + golang.org/x/text v0.8.0 // indirect golang.org/x/time v0.3.0 // indirect gomodules.xyz/jsonpatch/v3 v3.0.1 // indirect gomodules.xyz/orderedmap v0.1.0 // indirect @@ -63,8 +65,8 @@ require ( gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - k8s.io/apiextensions-apiserver v0.26.1 // indirect - k8s.io/component-base v0.26.1 // indirect + k8s.io/apiextensions-apiserver v0.26.2 // indirect + k8s.io/component-base v0.26.2 // indirect k8s.io/klog/v2 v2.80.1 // indirect k8s.io/kube-openapi v0.0.0-20221012153701-172d655c2280 // indirect sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2 // indirect diff --git a/go.sum b/go.sum index 0bd0094..366f1d8 100644 --- a/go.sum +++ b/go.sum @@ -249,6 +249,8 @@ github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1 github.com/prometheus/procfs v0.8.0 h1:ODq8ZFEaYeCaZOJlZZdJA2AbQR98dSHSM1KW/You5mo= github.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/scothis/reconciler-runtime v0.4.1-0.20230329162113-e603c75989e8 h1:auhjOQI3/Wn3PgQdeR3KBHolt2HAfxzpPYzzRsNYrL0= +github.com/scothis/reconciler-runtime v0.4.1-0.20230329162113-e603c75989e8/go.mod h1:caGganqpgScnO0o1iXJ2BIi8bYN0CkzCtI7Vb9Zuyvg= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= @@ -264,8 +266,6 @@ github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5 github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk= -github.com/vmware-labs/reconciler-runtime v0.11.1 h1:eU2bDUq4XWFmjICaKgnNieT8NhCicMqc5ST53R2QYug= -github.com/vmware-labs/reconciler-runtime v0.11.1/go.mod h1:IrjEBBrCnBhvvQA4RT9l1J4vYbH5+QKF3O93XU/lj3c= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= @@ -352,8 +352,8 @@ golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwY golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.7.0 h1:rJrUqqhjsgNp7KqAIc25s9pZnjU7TUcSY7HcVZjdn1g= -golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ= +golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -412,12 +412,12 @@ golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU= -golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.5.0 h1:n2a8QNdAb0sZNpU9R1ALUXBbY+w51fCQDN+7EdxNBsY= -golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +golang.org/x/term v0.6.0 h1:clScbb1cHjoCkyRbWwBEUZ5H/tIFu5TAXIqaZD0Gcjw= +golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -425,8 +425,8 @@ golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.7.0 h1:4BRB4x83lYWy72KwLD/qYDuTu7q9PjSagHvijDw7cLo= -golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.8.0 h1:57P1ETyNKtuIjB4SRd15iJxuhj8Gc416Y78H3qgMh68= +golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -596,14 +596,14 @@ honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9 honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= k8s.io/api v0.26.3 h1:emf74GIQMTik01Aum9dPP0gAypL8JTLl/lHa4V9RFSU= k8s.io/api v0.26.3/go.mod h1:PXsqwPMXBSBcL1lJ9CYDKy7kIReUydukS5JiRlxC3qE= -k8s.io/apiextensions-apiserver v0.26.1 h1:cB8h1SRk6e/+i3NOrQgSFij1B2S0Y0wDoNl66bn8RMI= -k8s.io/apiextensions-apiserver v0.26.1/go.mod h1:AptjOSXDGuE0JICx/Em15PaoO7buLwTs0dGleIHixSM= +k8s.io/apiextensions-apiserver v0.26.2 h1:/yTG2B9jGY2Q70iGskMf41qTLhL9XeNN2KhI0uDgwko= +k8s.io/apiextensions-apiserver v0.26.2/go.mod h1:Y7UPgch8nph8mGCuVk0SK83LnS8Esf3n6fUBgew8SH8= k8s.io/apimachinery v0.26.3 h1:dQx6PNETJ7nODU3XPtrwkfuubs6w7sX0M8n61zHIV/k= k8s.io/apimachinery v0.26.3/go.mod h1:ats7nN1LExKHvJ9TmwootT00Yz05MuYqPXEXaVeOy5I= k8s.io/client-go v0.26.3 h1:k1UY+KXfkxV2ScEL3gilKcF7761xkYsSD6BC9szIu8s= k8s.io/client-go v0.26.3/go.mod h1:ZPNu9lm8/dbRIPAgteN30RSXea6vrCpFvq+MateTUuQ= -k8s.io/component-base v0.26.1 h1:4ahudpeQXHZL5kko+iDHqLj/FSGAEUnSVO0EBbgDd+4= -k8s.io/component-base v0.26.1/go.mod h1:VHrLR0b58oC035w6YQiBSbtsf0ThuSwXP+p5dD/kAWU= +k8s.io/component-base v0.26.2 h1:IfWgCGUDzrD6wLLgXEstJKYZKAFS2kO+rBRi0p3LqcI= +k8s.io/component-base v0.26.2/go.mod h1:DxbuIe9M3IZPRxPIzhch2m1eT7uFrSBJUBuVCQEBivs= k8s.io/klog/v2 v2.80.1 h1:atnLQ121W371wYYFawwYx1aEY2eUfs4l3J72wtgAwV4= k8s.io/klog/v2 v2.80.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= k8s.io/kube-openapi v0.0.0-20221012153701-172d655c2280 h1:+70TFaan3hfJzs+7VK2o+OGxg8HsuBr/5f6tVAjDu6E= diff --git a/rbac/cani_test.go b/rbac/cani_test.go index 691194f..00c3a82 100644 --- a/rbac/cani_test.go +++ b/rbac/cani_test.go @@ -37,7 +37,7 @@ func TestAccessChecker(t *testing.T) { scheme := runtime.NewScheme() utilruntime.Must(clientgoscheme.AddToScheme(scheme)) - rts := rtesting.SubReconcilerTests{ + rts := rtesting.SubReconcilerTests[*appsv1.Deployment]{ "allow, added to cache": { Resource: &appsv1.Deployment{}, WithReactors: []rtesting.ReactionFunc{ @@ -46,7 +46,7 @@ func TestAccessChecker(t *testing.T) { ExpectCreates: []client.Object{ selfSubjectAccessReviewFor("apps", "deployments", "get"), }, - CleanUp: func(t *testing.T, ctx context.Context, tc *rtesting.SubReconcilerTestCase) error { + CleanUp: func(t *testing.T, ctx context.Context, tc *rtesting.SubReconcilerTestCase[*appsv1.Deployment]) error { ac := tc.Metadata["accessChecker"].(*accessChecker) if len(ac.cache) != 1 { t.Errorf("unexpected cache") @@ -81,7 +81,7 @@ func TestAccessChecker(t *testing.T) { }, }, }, - CleanUp: func(t *testing.T, ctx context.Context, tc *rtesting.SubReconcilerTestCase) error { + CleanUp: func(t *testing.T, ctx context.Context, tc *rtesting.SubReconcilerTestCase[*appsv1.Deployment]) error { ac := tc.Metadata["accessChecker"].(*accessChecker) if len(ac.cache) != 1 { t.Errorf("unexpected cache") @@ -103,7 +103,7 @@ func TestAccessChecker(t *testing.T) { ExpectCreates: []client.Object{ selfSubjectAccessReviewFor("apps", "deployments", "get"), }, - CleanUp: func(t *testing.T, ctx context.Context, tc *rtesting.SubReconcilerTestCase) error { + CleanUp: func(t *testing.T, ctx context.Context, tc *rtesting.SubReconcilerTestCase[*appsv1.Deployment]) error { ac := tc.Metadata["accessChecker"].(*accessChecker) if len(ac.cache) != 1 { t.Errorf("unexpected cache") @@ -139,7 +139,7 @@ func TestAccessChecker(t *testing.T) { }, }, }, - CleanUp: func(t *testing.T, ctx context.Context, tc *rtesting.SubReconcilerTestCase) error { + CleanUp: func(t *testing.T, ctx context.Context, tc *rtesting.SubReconcilerTestCase[*appsv1.Deployment]) error { ac := tc.Metadata["accessChecker"].(*accessChecker) if len(ac.cache) != 1 { t.Errorf("unexpected cache") @@ -181,7 +181,7 @@ func TestAccessChecker(t *testing.T) { ExpectCreates: []client.Object{ selfSubjectAccessReviewFor("apps", "deployments", "get"), }, - CleanUp: func(t *testing.T, ctx context.Context, tc *rtesting.SubReconcilerTestCase) error { + CleanUp: func(t *testing.T, ctx context.Context, tc *rtesting.SubReconcilerTestCase[*appsv1.Deployment]) error { ac := tc.Metadata["accessChecker"].(*accessChecker) if len(ac.cache) != 1 { t.Errorf("unexpected cache") @@ -200,15 +200,15 @@ func TestAccessChecker(t *testing.T) { }, } - rts.Run(t, scheme, func(t *testing.T, tc *rtesting.SubReconcilerTestCase, c reconcilers.Config) reconcilers.SubReconciler { + rts.Run(t, scheme, func(t *testing.T, tc *rtesting.SubReconcilerTestCase[*appsv1.Deployment], c reconcilers.Config) reconcilers.SubReconciler[*appsv1.Deployment] { ac := NewAccessChecker(c, time.Hour).WithVerb("get").(*accessChecker) if cache, ok := tc.Metadata["cache"].(map[authorizationv1.ResourceAttributes]authorizationv1.SelfSubjectAccessReview); ok { ac.cache = cache } tc.Metadata["accessChecker"] = ac - return &reconcilers.SyncReconciler{ - Sync: func(ctx context.Context, _ client.Object) error { + return &reconcilers.SyncReconciler[*appsv1.Deployment]{ + Sync: func(ctx context.Context, _ *appsv1.Deployment) error { if !ac.CanI(ctx, "apps", "deployments") { return fmt.Errorf("access denied") } diff --git a/resolver/cluster_test.go b/resolver/cluster_test.go index 5458296..bdb79d6 100644 --- a/resolver/cluster_test.go +++ b/resolver/cluster_test.go @@ -34,6 +34,7 @@ import ( utilruntime "k8s.io/apimachinery/pkg/util/runtime" clientgoscheme "k8s.io/client-go/kubernetes/scheme" "sigs.k8s.io/controller-runtime/pkg/client" + fakeclient "sigs.k8s.io/controller-runtime/pkg/client/fake" servicebindingv1beta1 "github.com/servicebinding/runtime/apis/v1beta1" "github.com/servicebinding/runtime/resolver" @@ -125,7 +126,10 @@ func TestClusterResolver_LookupRESTMapping(t *testing.T) { t.Run(c.name, func(t *testing.T) { ctx := context.TODO() - client := rtesting.NewFakeClient(scheme, c.givenObjects...) + client := fakeclient.NewClientBuilder(). + WithScheme(scheme). + WithObjects(c.givenObjects...). + Build() restMapper := client.RESTMapper().(*meta.DefaultRESTMapper) restMapper.Add(deploymentRESTMapping.GroupVersionKind, deploymentRESTMapping.Scope) restMapper.Add(cronJobRESTMapping.GroupVersionKind, cronJobRESTMapping.Scope) @@ -301,7 +305,10 @@ func TestClusterResolver_LookupWorkloadMapping(t *testing.T) { t.Run(c.name, func(t *testing.T) { ctx := context.TODO() - client := rtesting.NewFakeClient(scheme, c.givenObjects...) + client := fakeclient.NewClientBuilder(). + WithScheme(scheme). + WithObjects(c.givenObjects...). + Build() resolver := resolver.New(client) actual, err := resolver.LookupWorkloadMapping(ctx, c.gvr) @@ -408,7 +415,10 @@ func TestClusterResolver_LookupBindingSecret(t *testing.T) { t.Run(c.name, func(t *testing.T) { ctx := context.TODO() - client := rtesting.NewFakeClient(scheme, c.givenObjects...) + client := fakeclient.NewClientBuilder(). + WithScheme(scheme). + WithObjects(c.givenObjects...). + Build() resolver := resolver.New(client) actual, err := resolver.LookupBindingSecret(ctx, c.serviceRef) @@ -708,7 +718,10 @@ func TestClusterResolver_LookupWorkloads(t *testing.T) { t.Run(c.name, func(t *testing.T) { ctx := context.TODO() - client := rtesting.NewFakeClient(scheme, c.givenObjects...) + client := fakeclient.NewClientBuilder(). + WithScheme(scheme). + WithObjects(c.givenObjects...). + Build() resolver := resolver.New(client) actual, err := resolver.LookupWorkloads(ctx, c.serviceRef, c.selector) From 17beb9a33e2a37c36840bb0166856afd62c7ce4b Mon Sep 17 00:00:00 2001 From: Scott Andrews Date: Wed, 29 Mar 2023 18:21:02 -0400 Subject: [PATCH 2/4] Track latest Signed-off-by: Scott Andrews --- controllers/webhook_controller.go | 3 -- controllers/webhook_controller_test.go | 38 ++++++++++++-------------- go.mod | 2 +- go.sum | 4 +-- 4 files changed, 20 insertions(+), 27 deletions(-) diff --git a/controllers/webhook_controller.go b/controllers/webhook_controller.go index 722b48d..6a5e977 100644 --- a/controllers/webhook_controller.go +++ b/controllers/webhook_controller.go @@ -60,7 +60,6 @@ func AdmissionProjectorReconciler(c reconcilers.Config, name string, accessCheck Name: "AdmissionProjector", Request: req, Reconciler: &reconcilers.CastResource[*admissionregistrationv1.MutatingWebhookConfiguration, client.Object]{ - Type: &unstructured.Unstructured{}, Reconciler: reconcilers.Sequence[client.Object]{ LoadServiceBindings(req), InterceptGVKs(), @@ -169,7 +168,6 @@ func TriggerReconciler(c reconcilers.Config, name string, accessChecker rbac.Acc Name: "Trigger", Request: req, Reconciler: &reconcilers.CastResource[*admissionregistrationv1.ValidatingWebhookConfiguration, client.Object]{ - Type: &unstructured.Unstructured{}, Reconciler: reconcilers.Sequence[client.Object]{ LoadServiceBindings(req), TriggerGVKs(), @@ -207,7 +205,6 @@ func TriggerReconciler(c reconcilers.Config, name string, accessChecker rbac.Acc func TriggerWebhook(c reconcilers.Config, serviceBindingController controller.Controller) *reconcilers.AdmissionWebhookAdapter[*unstructured.Unstructured] { return &reconcilers.AdmissionWebhookAdapter[*unstructured.Unstructured]{ Name: "AdmissionProjectorWebhook", - Type: &unstructured.Unstructured{}, Reconciler: &reconcilers.SyncReconciler[*unstructured.Unstructured]{ Sync: func(ctx context.Context, trigger *unstructured.Unstructured) error { log := logr.FromContextOrDiscard(ctx) diff --git a/controllers/webhook_controller_test.go b/controllers/webhook_controller_test.go index 9b8797c..1ddbb8e 100644 --- a/controllers/webhook_controller_test.go +++ b/controllers/webhook_controller_test.go @@ -772,9 +772,7 @@ func TestLoadServiceBindings(t *testing.T) { utilruntime.Must(clientgoscheme.AddToScheme(scheme)) utilruntime.Must(servicebindingv1beta1.AddToScheme(scheme)) - webhook := dieadmissionregistrationv1.ValidatingWebhookConfigurationBlank. - APIVersion("admissionregistration.k8s.io"). - Kind("ValidatingWebhookConfiguration") + webhook := dieadmissionregistrationv1.ValidatingWebhookConfigurationBlank serviceBinding := dieservicebindingv1beta1.ServiceBindingBlank. MetadataDie(func(d *diemetav1.ObjectMetaDie) { @@ -796,7 +794,7 @@ func TestLoadServiceBindings(t *testing.T) { rts := rtesting.SubReconcilerTests[client.Object]{ "list all servicebindings": { - Resource: webhook.DieReleaseUnstructured(), + Resource: webhook, GivenObjects: []client.Object{ serviceBinding, }, @@ -807,7 +805,7 @@ func TestLoadServiceBindings(t *testing.T) { }, }, "error listing all servicebindings": { - Resource: webhook.DieReleaseUnstructured(), + Resource: webhook, GivenObjects: []client.Object{ serviceBinding, }, @@ -829,9 +827,7 @@ func TestInterceptGVKs(t *testing.T) { utilruntime.Must(clientgoscheme.AddToScheme(scheme)) utilruntime.Must(servicebindingv1beta1.AddToScheme(scheme)) - webhook := dieadmissionregistrationv1.ValidatingWebhookConfigurationBlank. - APIVersion("admissionregistration.k8s.io"). - Kind("ValidatingWebhookConfiguration") + webhook := dieadmissionregistrationv1.ValidatingWebhookConfigurationBlank serviceBinding := dieservicebindingv1beta1.ServiceBindingBlank. MetadataDie(func(d *diemetav1.ObjectMetaDie) { @@ -853,7 +849,7 @@ func TestInterceptGVKs(t *testing.T) { rts := rtesting.SubReconcilerTests[client.Object]{ "collect workload gvks": { - Resource: webhook.DieReleaseUnstructured(), + Resource: webhook, GivenStashedValues: map[reconcilers.StashKey]interface{}{ controllers.ServiceBindingsStashKey: []servicebindingv1beta1.ServiceBinding{ serviceBinding.DieRelease(), @@ -866,7 +862,7 @@ func TestInterceptGVKs(t *testing.T) { }, }, "append workload gvks": { - Resource: webhook.DieReleaseUnstructured(), + Resource: webhook, GivenStashedValues: map[reconcilers.StashKey]interface{}{ controllers.ServiceBindingsStashKey: []servicebindingv1beta1.ServiceBinding{ serviceBinding.DieRelease(), @@ -918,7 +914,7 @@ func TestTriggerGVKs(t *testing.T) { rts := rtesting.SubReconcilerTests[client.Object]{ "collect service gvks": { - Resource: webhook.DieReleaseUnstructured(), + Resource: webhook, GivenStashedValues: map[reconcilers.StashKey]interface{}{ controllers.ServiceBindingsStashKey: []servicebindingv1beta1.ServiceBinding{ serviceBinding.DieRelease(), @@ -931,7 +927,7 @@ func TestTriggerGVKs(t *testing.T) { }, }, "append service gvks": { - Resource: webhook.DieReleaseUnstructured(), + Resource: webhook, GivenStashedValues: map[reconcilers.StashKey]interface{}{ controllers.ServiceBindingsStashKey: []servicebindingv1beta1.ServiceBinding{ serviceBinding.DieRelease(), @@ -948,7 +944,7 @@ func TestTriggerGVKs(t *testing.T) { }, }, "ignore direct binding": { - Resource: webhook.DieReleaseUnstructured(), + Resource: webhook, GivenStashedValues: map[reconcilers.StashKey]interface{}{ controllers.ServiceBindingsStashKey: []servicebindingv1beta1.ServiceBinding{ serviceBinding. @@ -987,7 +983,7 @@ func TestWebhookRules(t *testing.T) { rts := rtesting.SubReconcilerTests[client.Object]{ "empty": { - Resource: webhook.DieReleaseUnstructured(), + Resource: webhook, GivenStashedValues: map[reconcilers.StashKey]interface{}{ controllers.ObservedGVKsStashKey: []schema.GroupVersionKind{}, }, @@ -996,7 +992,7 @@ func TestWebhookRules(t *testing.T) { }, }, "convert": { - Resource: webhook.DieReleaseUnstructured(), + Resource: webhook, GivenStashedValues: map[reconcilers.StashKey]interface{}{ controllers.ObservedGVKsStashKey: []schema.GroupVersionKind{ {Group: "apps", Version: "v1", Kind: "Deployment"}, @@ -1022,7 +1018,7 @@ func TestWebhookRules(t *testing.T) { }, }, "dedup versions": { - Resource: webhook.DieReleaseUnstructured(), + Resource: webhook, GivenStashedValues: map[reconcilers.StashKey]interface{}{ controllers.ObservedGVKsStashKey: []schema.GroupVersionKind{ {Group: "apps", Version: "v1", Kind: "Deployment"}, @@ -1049,7 +1045,7 @@ func TestWebhookRules(t *testing.T) { }, }, "merge resources of same group": { - Resource: webhook.DieReleaseUnstructured(), + Resource: webhook, GivenStashedValues: map[reconcilers.StashKey]interface{}{ controllers.ObservedGVKsStashKey: []schema.GroupVersionKind{ {Group: "apps", Version: "v1", Kind: "StatefulSet"}, @@ -1078,7 +1074,7 @@ func TestWebhookRules(t *testing.T) { }, }, "preserve resources of different group": { - Resource: webhook.DieReleaseUnstructured(), + Resource: webhook, GivenStashedValues: map[reconcilers.StashKey]interface{}{ controllers.ObservedGVKsStashKey: []schema.GroupVersionKind{ {Group: "batch", Version: "v1", Kind: "Job"}, @@ -1115,7 +1111,7 @@ func TestWebhookRules(t *testing.T) { }, }, "error on unknown resource": { - Resource: webhook.DieReleaseUnstructured(), + Resource: webhook, GivenStashedValues: map[reconcilers.StashKey]interface{}{ controllers.ObservedGVKsStashKey: []schema.GroupVersionKind{ {Group: "foo", Version: "v1", Kind: "Bar"}, @@ -1124,7 +1120,7 @@ func TestWebhookRules(t *testing.T) { ShouldErr: true, }, "drop denied resources": { - Resource: webhook.DieReleaseUnstructured(), + Resource: webhook, GivenStashedValues: map[reconcilers.StashKey]interface{}{ controllers.ObservedGVKsStashKey: []schema.GroupVersionKind{ {Group: "apps", Version: "v1", Kind: "Deployment"}, @@ -1138,7 +1134,7 @@ func TestWebhookRules(t *testing.T) { }, }, "treat SelfSubjectAccessReview errors as denied": { - Resource: webhook.DieReleaseUnstructured(), + Resource: webhook, GivenStashedValues: map[reconcilers.StashKey]interface{}{ controllers.ObservedGVKsStashKey: []schema.GroupVersionKind{ {Group: "apps", Version: "v1", Kind: "Deployment"}, diff --git a/go.mod b/go.mod index 6972063..68a5b26 100644 --- a/go.mod +++ b/go.mod @@ -2,7 +2,7 @@ module github.com/servicebinding/runtime go 1.19 -replace github.com/vmware-labs/reconciler-runtime => github.com/scothis/reconciler-runtime v0.4.1-0.20230329162113-e603c75989e8 +replace github.com/vmware-labs/reconciler-runtime => github.com/scothis/reconciler-runtime v0.4.1-0.20230329221714-b49ecc253011 require ( dies.dev v0.7.0 diff --git a/go.sum b/go.sum index 366f1d8..f7c79e6 100644 --- a/go.sum +++ b/go.sum @@ -249,8 +249,8 @@ github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1 github.com/prometheus/procfs v0.8.0 h1:ODq8ZFEaYeCaZOJlZZdJA2AbQR98dSHSM1KW/You5mo= github.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/scothis/reconciler-runtime v0.4.1-0.20230329162113-e603c75989e8 h1:auhjOQI3/Wn3PgQdeR3KBHolt2HAfxzpPYzzRsNYrL0= -github.com/scothis/reconciler-runtime v0.4.1-0.20230329162113-e603c75989e8/go.mod h1:caGganqpgScnO0o1iXJ2BIi8bYN0CkzCtI7Vb9Zuyvg= +github.com/scothis/reconciler-runtime v0.4.1-0.20230329221714-b49ecc253011 h1:HY36cThf8uHXmg+mZB8SZUHnLFVY659S7mzB8lnPkUk= +github.com/scothis/reconciler-runtime v0.4.1-0.20230329221714-b49ecc253011/go.mod h1:caGganqpgScnO0o1iXJ2BIi8bYN0CkzCtI7Vb9Zuyvg= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= From 655a856fbc4752e16bf4f772cbb4e7ad0f937042 Mon Sep 17 00:00:00 2001 From: Scott Andrews Date: Thu, 30 Mar 2023 10:29:48 -0400 Subject: [PATCH 3/4] bump Signed-off-by: Scott Andrews --- go.mod | 4 ++-- go.sum | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/go.mod b/go.mod index 68a5b26..6e43fec 100644 --- a/go.mod +++ b/go.mod @@ -2,13 +2,13 @@ module github.com/servicebinding/runtime go 1.19 -replace github.com/vmware-labs/reconciler-runtime => github.com/scothis/reconciler-runtime v0.4.1-0.20230329221714-b49ecc253011 +replace github.com/vmware-labs/reconciler-runtime => github.com/scothis/reconciler-runtime v0.4.1-0.20230330141852-705e5d24c866 require ( dies.dev v0.7.0 github.com/go-logr/logr v1.2.3 github.com/google/go-cmp v0.5.9 - github.com/vmware-labs/reconciler-runtime v0.11.1 + github.com/vmware-labs/reconciler-runtime v0.0.0 gomodules.xyz/jsonpatch/v2 v2.2.0 k8s.io/api v0.26.3 k8s.io/apimachinery v0.26.3 diff --git a/go.sum b/go.sum index f7c79e6..954a11e 100644 --- a/go.sum +++ b/go.sum @@ -249,8 +249,8 @@ github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1 github.com/prometheus/procfs v0.8.0 h1:ODq8ZFEaYeCaZOJlZZdJA2AbQR98dSHSM1KW/You5mo= github.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/scothis/reconciler-runtime v0.4.1-0.20230329221714-b49ecc253011 h1:HY36cThf8uHXmg+mZB8SZUHnLFVY659S7mzB8lnPkUk= -github.com/scothis/reconciler-runtime v0.4.1-0.20230329221714-b49ecc253011/go.mod h1:caGganqpgScnO0o1iXJ2BIi8bYN0CkzCtI7Vb9Zuyvg= +github.com/scothis/reconciler-runtime v0.4.1-0.20230330141852-705e5d24c866 h1:KlyJewI1ElXGObgtvx4PcRjdKmN2Rkblr5QIniMAiY0= +github.com/scothis/reconciler-runtime v0.4.1-0.20230330141852-705e5d24c866/go.mod h1:caGganqpgScnO0o1iXJ2BIi8bYN0CkzCtI7Vb9Zuyvg= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= From b57987dcc85b81d6aa30d8b52af5c985ebf31915 Mon Sep 17 00:00:00 2001 From: Scott Andrews Date: Wed, 5 Apr 2023 13:02:54 -0400 Subject: [PATCH 4/4] track latest Signed-off-by: Scott Andrews --- controllers/servicebinding_controller_test.go | 93 ++++++++++++------- controllers/webhook_controller_test.go | 4 +- go.mod | 4 +- go.sum | 4 +- 4 files changed, 65 insertions(+), 40 deletions(-) diff --git a/controllers/servicebinding_controller_test.go b/controllers/servicebinding_controller_test.go index 21ad724..90724f7 100644 --- a/controllers/servicebinding_controller_test.go +++ b/controllers/servicebinding_controller_test.go @@ -344,13 +344,15 @@ func TestResolveBindingSecret(t *testing.T) { dieservicebindingv1beta1.ServiceBindingConditionServiceAvailable. True().Reason("ResolvedBindingSecret"), ) - }), + }). + DieReleasePtr(), }, "resolve direct secret": { Resource: serviceBinding. SpecDie(func(d *dieservicebindingv1beta1.ServiceBindingSpecDie) { d.Service(directSecretRef.DieRelease()) - }), + }). + DieReleasePtr(), ExpectResource: serviceBinding. SpecDie(func(d *dieservicebindingv1beta1.ServiceBindingSpecDie) { d.Service(directSecretRef.DieRelease()) @@ -363,7 +365,8 @@ func TestResolveBindingSecret(t *testing.T) { dieservicebindingv1beta1.ServiceBindingConditionServiceAvailable. True().Reason("ResolvedBindingSecret"), ) - }), + }). + DieReleasePtr(), ShouldErr: true, Verify: func(t *testing.T, result ctrl.Result, err error) { if !errors.Is(err, reconcilers.HaltSubReconcilers) { @@ -375,7 +378,8 @@ func TestResolveBindingSecret(t *testing.T) { Resource: serviceBinding. SpecDie(func(d *dieservicebindingv1beta1.ServiceBindingSpecDie) { d.Service(serviceRef.DieRelease()) - }), + }). + DieReleasePtr(), GivenObjects: []client.Object{ provisionedService, }, @@ -391,7 +395,8 @@ func TestResolveBindingSecret(t *testing.T) { dieservicebindingv1beta1.ServiceBindingConditionServiceAvailable. True().Reason("ResolvedBindingSecret"), ) - }), + }). + DieReleasePtr(), ExpectTracks: []rtesting.TrackRequest{ rtesting.NewTrackRequest(provisionedService, serviceBinding, scheme), }, @@ -406,7 +411,8 @@ func TestResolveBindingSecret(t *testing.T) { Resource: serviceBinding. SpecDie(func(d *dieservicebindingv1beta1.ServiceBindingSpecDie) { d.Service(serviceRef.DieRelease()) - }), + }). + DieReleasePtr(), GivenObjects: []client.Object{ notProvisionedService, }, @@ -423,7 +429,8 @@ func TestResolveBindingSecret(t *testing.T) { Reason("ServiceMissingBinding"). Message("the service was found, but did not contain a binding secret"), ) - }), + }). + DieReleasePtr(), ExpectTracks: []rtesting.TrackRequest{ rtesting.NewTrackRequest(provisionedService, serviceBinding, scheme), }, @@ -432,7 +439,8 @@ func TestResolveBindingSecret(t *testing.T) { Resource: serviceBinding. SpecDie(func(d *dieservicebindingv1beta1.ServiceBindingSpecDie) { d.Service(serviceRef.DieRelease()) - }), + }). + DieReleasePtr(), WithReactors: []rtesting.ReactionFunc{ rtesting.InduceFailure("get", "MyProvisionedService", rtesting.InduceFailureOpts{ Error: apierrs.NewNotFound(schema.GroupResource{}, "my-service"), @@ -451,7 +459,8 @@ func TestResolveBindingSecret(t *testing.T) { Reason("ServiceNotFound"). Message("the service was not found"), ) - }), + }). + DieReleasePtr(), ExpectTracks: []rtesting.TrackRequest{ rtesting.NewTrackRequest(provisionedService, serviceBinding, scheme), }, @@ -460,7 +469,8 @@ func TestResolveBindingSecret(t *testing.T) { Resource: serviceBinding. SpecDie(func(d *dieservicebindingv1beta1.ServiceBindingSpecDie) { d.Service(serviceRef.DieRelease()) - }), + }). + DieReleasePtr(), WithReactors: []rtesting.ReactionFunc{ rtesting.InduceFailure("get", "MyProvisionedService", rtesting.InduceFailureOpts{ Error: apierrs.NewForbidden(schema.GroupResource{}, "my-service", fmt.Errorf("test forbidden")), @@ -481,7 +491,8 @@ func TestResolveBindingSecret(t *testing.T) { Reason("ServiceForbidden"). Message("the controller does not have permission to get the service"), ) - }), + }). + DieReleasePtr(), ExpectTracks: []rtesting.TrackRequest{ rtesting.NewTrackRequest(provisionedService, serviceBinding, scheme), }, @@ -490,7 +501,8 @@ func TestResolveBindingSecret(t *testing.T) { Resource: serviceBinding. SpecDie(func(d *dieservicebindingv1beta1.ServiceBindingSpecDie) { d.Service(serviceRef.DieRelease()) - }), + }). + DieReleasePtr(), WithReactors: []rtesting.ReactionFunc{ rtesting.InduceFailure("get", "MyProvisionedService"), }, @@ -551,7 +563,8 @@ func TestResolveWorkload(t *testing.T) { d.Kind("Deployment") d.Name("my-workload-1") }) - }), + }). + DieReleasePtr(), GivenObjects: []client.Object{ workload1, workload2, @@ -574,7 +587,8 @@ func TestResolveWorkload(t *testing.T) { d.Kind("Deployment") d.Name("my-workload-1") }) - }), + }). + DieReleasePtr(), ExpectedResult: reconcile.Result{Requeue: true}, ExpectResource: serviceBinding. SpecDie(func(d *dieservicebindingv1beta1.ServiceBindingSpecDie) { @@ -591,7 +605,8 @@ func TestResolveWorkload(t *testing.T) { dieservicebindingv1beta1.ServiceBindingConditionWorkloadProjected. Reason("WorkloadNotFound").Message("the workload was not found"), ) - }), + }). + DieReleasePtr(), ExpectTracks: []rtesting.TrackRequest{ rtesting.NewTrackRequest(workload1, serviceBinding, scheme), }, @@ -604,7 +619,8 @@ func TestResolveWorkload(t *testing.T) { d.Kind("Deployment") d.Name("my-workload-1") }) - }), + }). + DieReleasePtr(), GivenObjects: []client.Object{ workload1, workload2, @@ -635,7 +651,8 @@ func TestResolveWorkload(t *testing.T) { Reason("WorkloadForbidden"). Message("the controller does not have permission to get the workload"), ) - }), + }). + DieReleasePtr(), ExpectTracks: []rtesting.TrackRequest{ rtesting.NewTrackRequest(workload1, serviceBinding, scheme), }, @@ -650,7 +667,8 @@ func TestResolveWorkload(t *testing.T) { d.AddMatchLabel("app", "my") }) }) - }), + }). + DieReleasePtr(), GivenObjects: []client.Object{ workload1, workload2, @@ -674,7 +692,8 @@ func TestResolveWorkload(t *testing.T) { d.AddMatchLabel("app", "my") }) }) - }), + }). + DieReleasePtr(), ExpectStashedValues: map[reconcilers.StashKey]interface{}{ controllers.WorkloadsStashKey: []runtime.Object{}, }, @@ -689,7 +708,8 @@ func TestResolveWorkload(t *testing.T) { d.AddMatchLabel("app", "my") }) }) - }), + }). + DieReleasePtr(), GivenObjects: []client.Object{ workload1, workload2, @@ -722,7 +742,8 @@ func TestResolveWorkload(t *testing.T) { Reason("WorkloadForbidden"). Message("the controller does not have permission to list the workloads"), ) - }), + }). + DieReleasePtr(), }, } @@ -849,7 +870,8 @@ func TestProjectBinding(t *testing.T) { d.Kind("Deployment") d.Name("my-workload-1") }) - }), + }). + DieReleasePtr(), GivenStashedValues: map[reconcilers.StashKey]interface{}{ controllers.WorkloadsStashKey: []runtime.Object{ workload.DieReleaseUnstructured(), @@ -875,7 +897,8 @@ func TestProjectBinding(t *testing.T) { d.Kind("Deployment") d.Name("my-workload-1") }) - }), + }). + DieReleasePtr(), GivenStashedValues: map[reconcilers.StashKey]interface{}{ controllers.WorkloadsStashKey: []runtime.Object{ projectedWorkload.DieReleaseUnstructured(), @@ -952,7 +975,8 @@ func TestPatchWorkloads(t *testing.T) { dieservicebindingv1beta1.ServiceBindingConditionServiceAvailable.True().Reason("ResolvedBindingSecret"), dieservicebindingv1beta1.ServiceBindingConditionWorkloadProjected.True().Reason("WorkloadProjected"), ) - }), + }). + DieReleasePtr(), GivenObjects: []client.Object{ workload, }, @@ -966,7 +990,7 @@ func TestPatchWorkloads(t *testing.T) { }, }, "update workload": { - Resource: serviceBinding, + Resource: serviceBinding.DieReleasePtr(), GivenObjects: []client.Object{ workload, }, @@ -990,7 +1014,8 @@ func TestPatchWorkloads(t *testing.T) { dieservicebindingv1beta1.ServiceBindingConditionServiceAvailable.True().Reason("ResolvedBindingSecret"), dieservicebindingv1beta1.ServiceBindingConditionWorkloadProjected.True().Reason("WorkloadProjected"), ) - }), + }). + DieReleasePtr(), ExpectEvents: []rtesting.Event{ rtesting.NewEvent(serviceBinding, scheme, corev1.EventTypeNormal, "Updated", "Updated Deployment %q", "my-workload"), }, @@ -1003,7 +1028,7 @@ func TestPatchWorkloads(t *testing.T) { }, }, "update workload ignoring not found errors": { - Resource: serviceBinding, + Resource: serviceBinding.DieReleasePtr(), GivenStashedValues: map[reconcilers.StashKey]interface{}{ controllers.WorkloadsStashKey: []runtime.Object{ workload.DieReleaseUnstructured(), @@ -1024,7 +1049,8 @@ func TestPatchWorkloads(t *testing.T) { dieservicebindingv1beta1.ServiceBindingConditionServiceAvailable.True().Reason("ResolvedBindingSecret"), dieservicebindingv1beta1.ServiceBindingConditionWorkloadProjected.True().Reason("WorkloadProjected"), ) - }), + }). + DieReleasePtr(), ExpectEvents: []rtesting.Event{ rtesting.NewEvent(serviceBinding, scheme, corev1.EventTypeWarning, "UpdateFailed", "Failed to update Deployment %q: deployments.apps %q not found", "my-workload", "my-workload"), }, @@ -1037,7 +1063,7 @@ func TestPatchWorkloads(t *testing.T) { }, }, "update workload forbidden": { - Resource: serviceBinding, + Resource: serviceBinding.DieReleasePtr(), GivenObjects: []client.Object{ workload, }, @@ -1074,7 +1100,8 @@ func TestPatchWorkloads(t *testing.T) { Reason("WorkloadForbidden"). Message("the controller does not have permission to update the workloads"), ) - }), + }). + DieReleasePtr(), ExpectEvents: []rtesting.Event{ rtesting.NewEvent(serviceBinding, scheme, corev1.EventTypeWarning, "UpdateFailed", "Failed to update Deployment %q: forbidden: test forbidden", "my-workload"), }, @@ -1087,7 +1114,7 @@ func TestPatchWorkloads(t *testing.T) { }, }, "require same number of workloads and projected workloads": { - Resource: serviceBinding, + Resource: serviceBinding.DieReleasePtr(), GivenObjects: []client.Object{ workload, }, @@ -1108,7 +1135,7 @@ func TestPatchWorkloads(t *testing.T) { ShouldPanic: true, }, "panic if workload and projected workload are not the same uid": { - Resource: serviceBinding, + Resource: serviceBinding.DieReleasePtr(), GivenStashedValues: map[reconcilers.StashKey]interface{}{ controllers.WorkloadsStashKey: []runtime.Object{ workload.DieReleaseUnstructured(), @@ -1124,7 +1151,7 @@ func TestPatchWorkloads(t *testing.T) { ShouldPanic: true, }, "panic if workload and projected workload are not the same resource version": { - Resource: serviceBinding, + Resource: serviceBinding.DieReleasePtr(), GivenStashedValues: map[reconcilers.StashKey]interface{}{ controllers.WorkloadsStashKey: []runtime.Object{ workload.DieReleaseUnstructured(), diff --git a/controllers/webhook_controller_test.go b/controllers/webhook_controller_test.go index 1ddbb8e..7aa6bab 100644 --- a/controllers/webhook_controller_test.go +++ b/controllers/webhook_controller_test.go @@ -794,7 +794,7 @@ func TestLoadServiceBindings(t *testing.T) { rts := rtesting.SubReconcilerTests[client.Object]{ "list all servicebindings": { - Resource: webhook, + Resource: webhook.DieReleasePtr(), GivenObjects: []client.Object{ serviceBinding, }, @@ -805,7 +805,7 @@ func TestLoadServiceBindings(t *testing.T) { }, }, "error listing all servicebindings": { - Resource: webhook, + Resource: webhook.DieReleasePtr(), GivenObjects: []client.Object{ serviceBinding, }, diff --git a/go.mod b/go.mod index 6e43fec..c49fae4 100644 --- a/go.mod +++ b/go.mod @@ -2,13 +2,11 @@ module github.com/servicebinding/runtime go 1.19 -replace github.com/vmware-labs/reconciler-runtime => github.com/scothis/reconciler-runtime v0.4.1-0.20230330141852-705e5d24c866 - require ( dies.dev v0.7.0 github.com/go-logr/logr v1.2.3 github.com/google/go-cmp v0.5.9 - github.com/vmware-labs/reconciler-runtime v0.0.0 + github.com/vmware-labs/reconciler-runtime v0.11.2-0.20230405170044-b977dd1ea953 gomodules.xyz/jsonpatch/v2 v2.2.0 k8s.io/api v0.26.3 k8s.io/apimachinery v0.26.3 diff --git a/go.sum b/go.sum index 954a11e..2219d59 100644 --- a/go.sum +++ b/go.sum @@ -249,8 +249,6 @@ github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1 github.com/prometheus/procfs v0.8.0 h1:ODq8ZFEaYeCaZOJlZZdJA2AbQR98dSHSM1KW/You5mo= github.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/scothis/reconciler-runtime v0.4.1-0.20230330141852-705e5d24c866 h1:KlyJewI1ElXGObgtvx4PcRjdKmN2Rkblr5QIniMAiY0= -github.com/scothis/reconciler-runtime v0.4.1-0.20230330141852-705e5d24c866/go.mod h1:caGganqpgScnO0o1iXJ2BIi8bYN0CkzCtI7Vb9Zuyvg= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= @@ -266,6 +264,8 @@ github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5 github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk= +github.com/vmware-labs/reconciler-runtime v0.11.2-0.20230405170044-b977dd1ea953 h1:RC70m3K1ACQ4SwLMUPSFe1vsOgnaggHVTzXcAmPOpKc= +github.com/vmware-labs/reconciler-runtime v0.11.2-0.20230405170044-b977dd1ea953/go.mod h1:AyoMx3BDdXHC28WIyzmVkzdcCqe3FxsiFA+A3KOWR5E= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=