|
6 | 6 | "time"
|
7 | 7 |
|
8 | 8 | "github.com/redhat-developer/service-binding-operator/pkg/apis/operators/v1alpha1"
|
| 9 | + "github.com/redhat-developer/service-binding-operator/pkg/converter" |
9 | 10 | "github.com/redhat-developer/service-binding-operator/pkg/testutils"
|
10 | 11 | "github.com/stretchr/testify/require"
|
11 | 12 | appsv1 "k8s.io/api/apps/v1"
|
@@ -648,3 +649,98 @@ func TestBindTwoSbrsWithSingleApplication(t *testing.T) {
|
648 | 649 | require.Equal(t, sbrName2, dep.Spec.Template.Spec.Containers[0].EnvFrom[1].SecretRef.LocalObjectReference.Name)
|
649 | 650 | })
|
650 | 651 | }
|
| 652 | + |
| 653 | +// TestApplicationByName tests discovery of application by name |
| 654 | +func TestUnBind(t *testing.T) { |
| 655 | + //create a successful SBR first |
| 656 | + backingServiceResourceRef := "test-using-secret" |
| 657 | + matchLabels := map[string]string{ |
| 658 | + "connects-to": "database", |
| 659 | + "environment": "reconciler", |
| 660 | + } |
| 661 | + f := mocks.NewFake(t, reconcilerNs) |
| 662 | + f.AddMockedUnstructuredServiceBinding(reconcilerName, backingServiceResourceRef, reconcilerName, deploymentsGVR, matchLabels) |
| 663 | + f.AddMockedUnstructuredCSV("cluster-service-version-list") |
| 664 | + f.AddMockedUnstructuredDatabaseCRD() |
| 665 | + f.AddMockedUnstructuredDatabaseCR(backingServiceResourceRef) |
| 666 | + f.AddMockedUnstructuredDeployment(reconcilerName, matchLabels) |
| 667 | + f.AddMockedUnstructuredSecret("db-credentials") |
| 668 | + |
| 669 | + fakeDynClient := f.FakeDynClient() |
| 670 | + mapper := testutils.BuildTestRESTMapper() |
| 671 | + r := &reconciler{dynClient: fakeDynClient, restMapper: mapper, scheme: f.S} |
| 672 | + r.resourceWatcher = newFakeResourceWatcher(mapper) |
| 673 | + |
| 674 | + res, err := r.Reconcile(reconcileRequest()) |
| 675 | + require.NoError(t, err) |
| 676 | + require.False(t, res.Requeue) |
| 677 | + |
| 678 | + namespacedName := types.NamespacedName{Namespace: reconcilerNs, Name: reconcilerName} |
| 679 | + |
| 680 | + u, err := fakeDynClient.Resource(deploymentsGVR).Get(reconcilerName, metav1.GetOptions{}) |
| 681 | + require.NoError(t, err) |
| 682 | + |
| 683 | + d := appsv1.Deployment{} |
| 684 | + err = runtime.DefaultUnstructuredConverter.FromUnstructured(u.Object, &d) |
| 685 | + require.NoError(t, err) |
| 686 | + |
| 687 | + containers := d.Spec.Template.Spec.Containers |
| 688 | + require.Equal(t, 1, len(containers)) |
| 689 | + require.Equal(t, 1, len(containers[0].EnvFrom)) |
| 690 | + require.NotNil(t, containers[0].EnvFrom[0].SecretRef) |
| 691 | + require.Equal(t, reconcilerName, containers[0].EnvFrom[0].SecretRef.Name) |
| 692 | + |
| 693 | + namespacedName = types.NamespacedName{Namespace: reconcilerNs, Name: reconcilerName} |
| 694 | + sbrOutput, err := r.getServiceBinding(namespacedName) |
| 695 | + require.NoError(t, err) |
| 696 | + |
| 697 | + requireConditionPresentAndTrue(t, CollectionReady, sbrOutput.Status.Conditions) |
| 698 | + requireConditionPresentAndTrue(t, InjectionReady, sbrOutput.Status.Conditions) |
| 699 | + requireConditionPresentAndTrue(t, BindingReady, sbrOutput.Status.Conditions) |
| 700 | + |
| 701 | + require.Equal(t, reconcilerName, sbrOutput.Status.Secret) |
| 702 | + |
| 703 | + require.Equal(t, 1, len(sbrOutput.Status.Applications)) |
| 704 | + expectedStatus := v1alpha1.BoundApplication{ |
| 705 | + GroupVersionKind: v1.GroupVersionKind{ |
| 706 | + Group: deploymentsGVR.Group, |
| 707 | + Version: deploymentsGVR.Version, |
| 708 | + Kind: "Deployment", |
| 709 | + }, |
| 710 | + LocalObjectReference: corev1.LocalObjectReference{ |
| 711 | + Name: namespacedName.Name, |
| 712 | + }, |
| 713 | + } |
| 714 | + require.True(t, reflect.DeepEqual(expectedStatus, sbrOutput.Status.Applications[0])) |
| 715 | + |
| 716 | + //do the unbind |
| 717 | + nsClient := fakeDynClient. |
| 718 | + Resource(groupVersion). |
| 719 | + Namespace(reconcilerNs) |
| 720 | + u, err = nsClient.Get(reconcilerName, metav1.GetOptions{}) |
| 721 | + require.NoError(t, err) |
| 722 | + |
| 723 | + sbr := &v1alpha1.ServiceBinding{} |
| 724 | + err = runtime.DefaultUnstructuredConverter.FromUnstructured(u.Object, sbr) |
| 725 | + require.NoError(t, err) |
| 726 | + deletionTime := metav1.Now() |
| 727 | + sbr.SetDeletionTimestamp(&deletionTime) |
| 728 | + u, err = converter.ToUnstructured(sbr) |
| 729 | + require.NoError(t, err) |
| 730 | + _, err = nsClient.Update(u, v1.UpdateOptions{}) |
| 731 | + require.NoError(t, err) |
| 732 | + res, err = r.Reconcile(reconcileRequest()) |
| 733 | + require.NoError(t, err) |
| 734 | + require.False(t, res.Requeue) |
| 735 | + |
| 736 | + u, err = fakeDynClient.Resource(deploymentsGVR).Get(reconcilerName, metav1.GetOptions{}) |
| 737 | + require.NoError(t, err) |
| 738 | + |
| 739 | + d = appsv1.Deployment{} |
| 740 | + err = runtime.DefaultUnstructuredConverter.FromUnstructured(u.Object, &d) |
| 741 | + require.NoError(t, err) |
| 742 | + |
| 743 | + containers = d.Spec.Template.Spec.Containers |
| 744 | + require.Equal(t, 1, len(containers)) |
| 745 | + require.Equal(t, 0, len(containers[0].EnvFrom)) |
| 746 | +} |
0 commit comments