From 619810c7390cd56500becdce946d493634cc58ca Mon Sep 17 00:00:00 2001 From: Dhriti Shikhar Date: Wed, 26 Feb 2020 18:01:15 +0530 Subject: [PATCH 1/8] Adds test for Generic Binding --- .../servicebindingrequest/reconciler_test.go | 72 +++++++++++++++++++ 1 file changed, 72 insertions(+) diff --git a/pkg/controller/servicebindingrequest/reconciler_test.go b/pkg/controller/servicebindingrequest/reconciler_test.go index e6c81163c0..5ded9ee587 100644 --- a/pkg/controller/servicebindingrequest/reconciler_test.go +++ b/pkg/controller/servicebindingrequest/reconciler_test.go @@ -7,6 +7,7 @@ import ( "github.com/stretchr/testify/require" appsv1 "k8s.io/api/apps/v1" + corev1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/types" "sigs.k8s.io/controller-runtime/pkg/reconcile" @@ -184,3 +185,74 @@ func TestReconcilerReconcileUsingVolumes(t *testing.T) { require.Equal(t, reconcilerName, volumes[0].VolumeSource.Secret.SecretName) }) } + +func TestReconcilerGenericBinding(t *testing.T) { + ctx := context.TODO() + backingServiceResourceRef := "test-using-volumes" + matchLabels := map[string]string{ + "connects-to": "database", + "environment": "reconciler", + } + f := mocks.NewFake(t, reconcilerNs) + f.AddMockedUnstructuredServiceBindingRequest(reconcilerName, backingServiceResourceRef, "", deploymentsGVR, matchLabels) + f.AddMockedUnstructuredCSVWithVolumeMount("cluster-service-version-list") + f.AddMockedUnstructuredDatabaseCRD() + f.AddMockedUnstructuredDatabaseCR(backingServiceResourceRef) + f.AddMockedSecret("db-credentials") + + fakeClient := f.FakeClient() + reconciler := &Reconciler{client: fakeClient, dynClient: f.FakeDynClient(), scheme: f.S} + + // Reconcile without deployment + res, err := reconciler.Reconcile(reconcileRequest()) + require.NoError(t, err) + require.True(t, res.Requeue) + + namespacedName := types.NamespacedName{Namespace: reconcilerNs, Name: reconcilerName} + sbrOutput, err := reconciler.getServiceBindingRequest(namespacedName) + require.NoError(t, err) + + require.Equal(t, "Fail", sbrOutput.Status.BindingStatus) + require.Equal(t, 0, len(sbrOutput.Status.ApplicationObjects)) + + // Reconcile with deployment + f.AddMockedUnstructuredDeployment(reconcilerName, matchLabels) + + fakeClient = f.FakeClient() + reconciler = &Reconciler{client: fakeClient, dynClient: f.FakeDynClient(), scheme: f.S} + res, err = reconciler.Reconcile(reconcileRequest()) + require.NoError(t, err) + require.False(t, res.Requeue) + + sbrOutput2, err := reconciler.getServiceBindingRequest(namespacedName) + require.NoError(t, err) + + d := appsv1.Deployment{} + require.NoError(t, fakeClient.Get(ctx, namespacedName, &d)) + + require.Equal(t, "Success", sbrOutput2.Status.BindingStatus) + require.Equal(t, 1, len(sbrOutput2.Status.ApplicationObjects)) + + // Update Credentials + s := corev1.Secret{} + secretNamespaced := types.NamespacedName{Namespace: reconcilerNs, Name: "db-credentials"} + require.NoError(t, fakeClient.Get(ctx, secretNamespaced, &s)) + s.Data["password"] = []byte("abc123") + require.NoError(t, fakeClient.Update(ctx, &s)) + + reconciler = &Reconciler{client: fakeClient, dynClient: f.FakeDynClient(), scheme: f.S} + res, err = reconciler.Reconcile(reconcileRequest()) + require.NoError(t, err) + require.False(t, res.Requeue) + + sbrOutput3, err := reconciler.getServiceBindingRequest(namespacedName) + require.NoError(t, err) + + d = appsv1.Deployment{} + require.NoError(t, fakeClient.Get(ctx, namespacedName, &d)) + + require.Equal(t, "Success", sbrOutput3.Status.BindingStatus) + require.Equal(t, reconcilerName, sbrOutput3.Status.Secret) + require.Equal(t, s.Data["password"], []byte("abc123")) + require.Equal(t, 1, len(sbrOutput3.Status.ApplicationObjects)) +} From 45abadc2f5366fca72d916e1488c9714d8b3efd4 Mon Sep 17 00:00:00 2001 From: Dhriti Shikhar Date: Wed, 26 Feb 2020 18:28:36 +0530 Subject: [PATCH 2/8] update Binding Status --- pkg/controller/servicebindingrequest/reconciler_test.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pkg/controller/servicebindingrequest/reconciler_test.go b/pkg/controller/servicebindingrequest/reconciler_test.go index 3ecf00d126..fd9146ec8d 100644 --- a/pkg/controller/servicebindingrequest/reconciler_test.go +++ b/pkg/controller/servicebindingrequest/reconciler_test.go @@ -212,7 +212,7 @@ func TestReconcilerGenericBinding(t *testing.T) { sbrOutput, err := reconciler.getServiceBindingRequest(namespacedName) require.NoError(t, err) - require.Equal(t, "Fail", sbrOutput.Status.BindingStatus) + require.Equal(t, "BindingFail", sbrOutput.Status.BindingStatus) require.Equal(t, 0, len(sbrOutput.Status.ApplicationObjects)) // Reconcile with deployment @@ -230,7 +230,7 @@ func TestReconcilerGenericBinding(t *testing.T) { d := appsv1.Deployment{} require.NoError(t, fakeClient.Get(ctx, namespacedName, &d)) - require.Equal(t, "Success", sbrOutput2.Status.BindingStatus) + require.Equal(t, "BindingSuccess", sbrOutput2.Status.BindingStatus) require.Equal(t, 1, len(sbrOutput2.Status.ApplicationObjects)) // Update Credentials @@ -251,7 +251,7 @@ func TestReconcilerGenericBinding(t *testing.T) { d = appsv1.Deployment{} require.NoError(t, fakeClient.Get(ctx, namespacedName, &d)) - require.Equal(t, "Success", sbrOutput3.Status.BindingStatus) + require.Equal(t, "BindingSuccess", sbrOutput3.Status.BindingStatus) require.Equal(t, reconcilerName, sbrOutput3.Status.Secret) require.Equal(t, s.Data["password"], []byte("abc123")) require.Equal(t, 1, len(sbrOutput3.Status.ApplicationObjects)) From 0d204837ec0b55f94b87cf9443a52659b81fea43 Mon Sep 17 00:00:00 2001 From: Dhriti Shikhar Date: Wed, 26 Feb 2020 21:45:56 +0530 Subject: [PATCH 3/8] remove application selector from required --- deploy/crds/apps.openshift.io_servicebindingrequests_crd.yaml | 2 -- 1 file changed, 2 deletions(-) diff --git a/deploy/crds/apps.openshift.io_servicebindingrequests_crd.yaml b/deploy/crds/apps.openshift.io_servicebindingrequests_crd.yaml index ebfab03b0c..cd9990572d 100644 --- a/deploy/crds/apps.openshift.io_servicebindingrequests_crd.yaml +++ b/deploy/crds/apps.openshift.io_servicebindingrequests_crd.yaml @@ -246,8 +246,6 @@ spec: mountPathPrefix: description: MountPathPrefix is the prefix for volume mount type: string - required: - - applicationSelector type: object status: description: ServiceBindingRequestStatus defines the observed state of ServiceBindingRequest From 415b1a829e6c069f7ed9ffb76443f7beb9127b52 Mon Sep 17 00:00:00 2001 From: Dhriti Shikhar Date: Thu, 27 Feb 2020 17:24:59 +0530 Subject: [PATCH 4/8] makes application selector optional --- .../v1alpha1/servicebindingrequest_types.go | 1 + .../apps/v1alpha1/zz_generated.openapi.go | 25 +++++++++---------- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/pkg/apis/apps/v1alpha1/servicebindingrequest_types.go b/pkg/apis/apps/v1alpha1/servicebindingrequest_types.go index e885753649..58cb718c91 100644 --- a/pkg/apis/apps/v1alpha1/servicebindingrequest_types.go +++ b/pkg/apis/apps/v1alpha1/servicebindingrequest_types.go @@ -36,6 +36,7 @@ type ServiceBindingRequestSpec struct { // ApplicationSelector is used to identify the application connecting to the // backing service operator. + // +optional ApplicationSelector ApplicationSelector `json:"applicationSelector"` // DetectBindingResources is flag used to bind all non-bindable variables from diff --git a/pkg/apis/apps/v1alpha1/zz_generated.openapi.go b/pkg/apis/apps/v1alpha1/zz_generated.openapi.go index fef38066a9..23e8575f30 100644 --- a/pkg/apis/apps/v1alpha1/zz_generated.openapi.go +++ b/pkg/apis/apps/v1alpha1/zz_generated.openapi.go @@ -11,11 +11,11 @@ import ( func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenAPIDefinition { return map[string]common.OpenAPIDefinition{ - "./pkg/apis/apps/v1alpha1.ApplicationSelector": schema_pkg_apis_apps_v1alpha1_ApplicationSelector(ref), - "./pkg/apis/apps/v1alpha1.BackingServiceSelector": schema_pkg_apis_apps_v1alpha1_BackingServiceSelector(ref), - "./pkg/apis/apps/v1alpha1.ServiceBindingRequest": schema_pkg_apis_apps_v1alpha1_ServiceBindingRequest(ref), - "./pkg/apis/apps/v1alpha1.ServiceBindingRequestSpec": schema_pkg_apis_apps_v1alpha1_ServiceBindingRequestSpec(ref), - "./pkg/apis/apps/v1alpha1.ServiceBindingRequestStatus": schema_pkg_apis_apps_v1alpha1_ServiceBindingRequestStatus(ref), + "github.com/redhat-developer/service-binding-operator/pkg/apis/apps/v1alpha1.ApplicationSelector": schema_pkg_apis_apps_v1alpha1_ApplicationSelector(ref), + "github.com/redhat-developer/service-binding-operator/pkg/apis/apps/v1alpha1.BackingServiceSelector": schema_pkg_apis_apps_v1alpha1_BackingServiceSelector(ref), + "github.com/redhat-developer/service-binding-operator/pkg/apis/apps/v1alpha1.ServiceBindingRequest": schema_pkg_apis_apps_v1alpha1_ServiceBindingRequest(ref), + "github.com/redhat-developer/service-binding-operator/pkg/apis/apps/v1alpha1.ServiceBindingRequestSpec": schema_pkg_apis_apps_v1alpha1_ServiceBindingRequestSpec(ref), + "github.com/redhat-developer/service-binding-operator/pkg/apis/apps/v1alpha1.ServiceBindingRequestStatus": schema_pkg_apis_apps_v1alpha1_ServiceBindingRequestStatus(ref), } } @@ -130,19 +130,19 @@ func schema_pkg_apis_apps_v1alpha1_ServiceBindingRequest(ref common.ReferenceCal }, "spec": { SchemaProps: spec.SchemaProps{ - Ref: ref("./pkg/apis/apps/v1alpha1.ServiceBindingRequestSpec"), + Ref: ref("github.com/redhat-developer/service-binding-operator/pkg/apis/apps/v1alpha1.ServiceBindingRequestSpec"), }, }, "status": { SchemaProps: spec.SchemaProps{ - Ref: ref("./pkg/apis/apps/v1alpha1.ServiceBindingRequestStatus"), + Ref: ref("github.com/redhat-developer/service-binding-operator/pkg/apis/apps/v1alpha1.ServiceBindingRequestStatus"), }, }, }, }, }, Dependencies: []string{ - "./pkg/apis/apps/v1alpha1.ServiceBindingRequestSpec", "./pkg/apis/apps/v1alpha1.ServiceBindingRequestStatus", "k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"}, + "github.com/redhat-developer/service-binding-operator/pkg/apis/apps/v1alpha1.ServiceBindingRequestSpec", "github.com/redhat-developer/service-binding-operator/pkg/apis/apps/v1alpha1.ServiceBindingRequestStatus", "k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"}, } } @@ -183,7 +183,7 @@ func schema_pkg_apis_apps_v1alpha1_ServiceBindingRequestSpec(ref common.Referenc "backingServiceSelector": { SchemaProps: spec.SchemaProps{ Description: "BackingServiceSelector is used to identify the backing service operator.", - Ref: ref("./pkg/apis/apps/v1alpha1.BackingServiceSelector"), + Ref: ref("github.com/redhat-developer/service-binding-operator/pkg/apis/apps/v1alpha1.BackingServiceSelector"), }, }, "backingServiceSelectors": { @@ -193,7 +193,7 @@ func schema_pkg_apis_apps_v1alpha1_ServiceBindingRequestSpec(ref common.Referenc Items: &spec.SchemaOrArray{ Schema: &spec.Schema{ SchemaProps: spec.SchemaProps{ - Ref: ref("./pkg/apis/apps/v1alpha1.BackingServiceSelector"), + Ref: ref("github.com/redhat-developer/service-binding-operator/pkg/apis/apps/v1alpha1.BackingServiceSelector"), }, }, }, @@ -202,7 +202,7 @@ func schema_pkg_apis_apps_v1alpha1_ServiceBindingRequestSpec(ref common.Referenc "applicationSelector": { SchemaProps: spec.SchemaProps{ Description: "ApplicationSelector is used to identify the application connecting to the backing service operator.", - Ref: ref("./pkg/apis/apps/v1alpha1.ApplicationSelector"), + Ref: ref("github.com/redhat-developer/service-binding-operator/pkg/apis/apps/v1alpha1.ApplicationSelector"), }, }, "detectBindingResources": { @@ -213,11 +213,10 @@ func schema_pkg_apis_apps_v1alpha1_ServiceBindingRequestSpec(ref common.Referenc }, }, }, - Required: []string{"applicationSelector"}, }, }, Dependencies: []string{ - "./pkg/apis/apps/v1alpha1.ApplicationSelector", "./pkg/apis/apps/v1alpha1.BackingServiceSelector", "k8s.io/api/core/v1.EnvVar"}, + "github.com/redhat-developer/service-binding-operator/pkg/apis/apps/v1alpha1.ApplicationSelector", "github.com/redhat-developer/service-binding-operator/pkg/apis/apps/v1alpha1.BackingServiceSelector", "k8s.io/api/core/v1.EnvVar"}, } } From 572adc74db48e12ccf905b6b14dfb8633e93bb48 Mon Sep 17 00:00:00 2001 From: Dhriti Shikhar Date: Tue, 10 Mar 2020 18:20:10 +0530 Subject: [PATCH 5/8] Checks status on reconcilation --- .../servicebindingrequest/reconciler_test.go | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/pkg/controller/servicebindingrequest/reconciler_test.go b/pkg/controller/servicebindingrequest/reconciler_test.go index fd9146ec8d..5c343c2c2c 100644 --- a/pkg/controller/servicebindingrequest/reconciler_test.go +++ b/pkg/controller/servicebindingrequest/reconciler_test.go @@ -8,6 +8,7 @@ import ( "github.com/stretchr/testify/require" appsv1 "k8s.io/api/apps/v1" corev1 "k8s.io/api/core/v1" + v1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/types" "sigs.k8s.io/controller-runtime/pkg/reconcile" @@ -213,6 +214,7 @@ func TestReconcilerGenericBinding(t *testing.T) { require.NoError(t, err) require.Equal(t, "BindingFail", sbrOutput.Status.BindingStatus) + require.Equal(t, v1.ConditionStatus("False"), sbrOutput.Status.Conditions[0].Status) require.Equal(t, 0, len(sbrOutput.Status.ApplicationObjects)) // Reconcile with deployment @@ -224,13 +226,15 @@ func TestReconcilerGenericBinding(t *testing.T) { require.NoError(t, err) require.False(t, res.Requeue) - sbrOutput2, err := reconciler.getServiceBindingRequest(namespacedName) - require.NoError(t, err) - d := appsv1.Deployment{} require.NoError(t, fakeClient.Get(ctx, namespacedName, &d)) + sbrOutput2, err := reconciler.getServiceBindingRequest(namespacedName) + require.NoError(t, err) + require.Equal(t, "BindingSuccess", sbrOutput2.Status.BindingStatus) + require.Equal(t, reconcilerName, sbrOutput2.Status.Secret) + require.Equal(t, v1.ConditionStatus("True"), sbrOutput2.Status.Conditions[0].Status) require.Equal(t, 1, len(sbrOutput2.Status.ApplicationObjects)) // Update Credentials @@ -252,6 +256,7 @@ func TestReconcilerGenericBinding(t *testing.T) { require.NoError(t, fakeClient.Get(ctx, namespacedName, &d)) require.Equal(t, "BindingSuccess", sbrOutput3.Status.BindingStatus) + require.Equal(t, v1.ConditionStatus("True"), sbrOutput3.Status.Conditions[0].Status) require.Equal(t, reconcilerName, sbrOutput3.Status.Secret) require.Equal(t, s.Data["password"], []byte("abc123")) require.Equal(t, 1, len(sbrOutput3.Status.ApplicationObjects)) From f2c599aa2c606a7a9d6969243e82fd65ef9c21b2 Mon Sep 17 00:00:00 2001 From: Dhriti Shikhar Date: Wed, 11 Mar 2020 17:08:19 +0530 Subject: [PATCH 6/8] uses corev1.ConditionTrue and corev1.ConditionFalsee --- pkg/controller/servicebindingrequest/reconciler_test.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pkg/controller/servicebindingrequest/reconciler_test.go b/pkg/controller/servicebindingrequest/reconciler_test.go index 8d0ddf20ed..965ed86251 100644 --- a/pkg/controller/servicebindingrequest/reconciler_test.go +++ b/pkg/controller/servicebindingrequest/reconciler_test.go @@ -233,7 +233,7 @@ func TestReconcilerGenericBinding(t *testing.T) { require.NoError(t, err) require.Equal(t, "BindingFail", sbrOutput.Status.BindingStatus) - require.Equal(t, corev1.ConditionStatus("False"), sbrOutput.Status.Conditions[0].Status) + require.Equal(t, corev1.ConditionFalse, sbrOutput.Status.Conditions[0].Status) require.Equal(t, 0, len(sbrOutput.Status.ApplicationObjects)) // Reconcile with deployment @@ -253,7 +253,7 @@ func TestReconcilerGenericBinding(t *testing.T) { require.Equal(t, "BindingSuccess", sbrOutput2.Status.BindingStatus) require.Equal(t, reconcilerName, sbrOutput2.Status.Secret) - require.Equal(t, corev1.ConditionStatus("True"), sbrOutput2.Status.Conditions[0].Status) + require.Equal(t, corev1.ConditionTrue, sbrOutput2.Status.Conditions[0].Status) require.Equal(t, 1, len(sbrOutput2.Status.ApplicationObjects)) // Update Credentials @@ -275,7 +275,7 @@ func TestReconcilerGenericBinding(t *testing.T) { require.NoError(t, fakeClient.Get(ctx, namespacedName, &d)) require.Equal(t, "BindingSuccess", sbrOutput3.Status.BindingStatus) - require.Equal(t, corev1.ConditionStatus("True"), sbrOutput3.Status.Conditions[0].Status) + require.Equal(t, corev1.ConditionTrue, sbrOutput3.Status.Conditions[0].Status) require.Equal(t, reconcilerName, sbrOutput3.Status.Secret) require.Equal(t, s.Data["password"], []byte("abc123")) require.Equal(t, 1, len(sbrOutput3.Status.ApplicationObjects)) From 1eceb8e0ea255c5aae5912c16cf3eebfd764b81c Mon Sep 17 00:00:00 2001 From: Dhriti Shikhar Date: Thu, 12 Mar 2020 13:13:09 +0530 Subject: [PATCH 7/8] remove CSV with volume mount --- pkg/controller/servicebindingrequest/reconciler_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/controller/servicebindingrequest/reconciler_test.go b/pkg/controller/servicebindingrequest/reconciler_test.go index 965ed86251..0c11a79660 100644 --- a/pkg/controller/servicebindingrequest/reconciler_test.go +++ b/pkg/controller/servicebindingrequest/reconciler_test.go @@ -215,7 +215,7 @@ func TestReconcilerGenericBinding(t *testing.T) { } f := mocks.NewFake(t, reconcilerNs) f.AddMockedUnstructuredServiceBindingRequest(reconcilerName, backingServiceResourceRef, "", deploymentsGVR, matchLabels) - f.AddMockedUnstructuredCSVWithVolumeMount("cluster-service-version-list") + f.AddMockedUnstructuredCSV("cluster-service-version-list") f.AddMockedUnstructuredDatabaseCRD() f.AddMockedUnstructuredDatabaseCR(backingServiceResourceRef) f.AddMockedSecret("db-credentials") From 78118e8eaf27a94616fc16ce2252a979be4670f1 Mon Sep 17 00:00:00 2001 From: Dhriti Shikhar Date: Thu, 12 Mar 2020 14:29:54 +0530 Subject: [PATCH 8/8] change backingServiceResourceRef name --- pkg/controller/servicebindingrequest/reconciler_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/controller/servicebindingrequest/reconciler_test.go b/pkg/controller/servicebindingrequest/reconciler_test.go index 0c11a79660..9a7825b6fd 100644 --- a/pkg/controller/servicebindingrequest/reconciler_test.go +++ b/pkg/controller/servicebindingrequest/reconciler_test.go @@ -208,7 +208,7 @@ func TestReconcilerReconcileUsingVolumes(t *testing.T) { func TestReconcilerGenericBinding(t *testing.T) { ctx := context.TODO() - backingServiceResourceRef := "test-using-volumes" + backingServiceResourceRef := "backingService1" matchLabels := map[string]string{ "connects-to": "database", "environment": "reconciler",