@@ -18,17 +18,14 @@ package bindings
1818
1919import (
2020 "context"
21- "fmt"
2221
2322 korifiv1alpha1 "code.cloudfoundry.org/korifi/controllers/api/v1alpha1"
2423 "code.cloudfoundry.org/korifi/controllers/controllers/shared"
24+ "code.cloudfoundry.org/korifi/tools"
2525 "code.cloudfoundry.org/korifi/tools/k8s"
2626
2727 "github.com/go-logr/logr"
2828 servicebindingv1beta1 "github.com/servicebinding/runtime/apis/v1beta1"
29- corev1 "k8s.io/api/core/v1"
30- "k8s.io/apimachinery/pkg/api/meta"
31- metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
3229 "k8s.io/apimachinery/pkg/runtime"
3330 "k8s.io/apimachinery/pkg/types"
3431 ctrl "sigs.k8s.io/controller-runtime"
@@ -45,31 +42,31 @@ const (
4542 ServiceBindingSecretTypePrefix = "servicebinding.io/"
4643)
4744
48- type CredentialsReconciler interface {
49- ReconcileResource (ctx context.Context , cfServiceBinding * korifiv1alpha1.CFServiceBinding ) (ctrl.Result , error )
45+ type DelegateReconciler interface {
46+ ReconcileResource (ctx context.Context , cfServiceBinding * korifiv1alpha1.CFServiceBinding , cfServiceInstance * korifiv1alpha1. CFServiceInstance ) (ctrl.Result , error )
5047}
5148
5249type Reconciler struct {
53- k8sClient client.Client
54- scheme * runtime.Scheme
55- log logr.Logger
56- upsiCredentialsReconciler CredentialsReconciler
57- managedCredentialsReconciler CredentialsReconciler
50+ k8sClient client.Client
51+ scheme * runtime.Scheme
52+ log logr.Logger
53+ upsiReconciler DelegateReconciler
54+ managedReconciler DelegateReconciler
5855}
5956
6057func NewReconciler (
6158 k8sClient client.Client ,
6259 scheme * runtime.Scheme ,
6360 log logr.Logger ,
64- upsiCredentialsReconciler CredentialsReconciler ,
65- managedCredentialsReconciler CredentialsReconciler ,
61+ upsiCredentialsReconciler DelegateReconciler ,
62+ managedCredentialsReconciler DelegateReconciler ,
6663) * k8s.PatchingReconciler [korifiv1alpha1.CFServiceBinding , * korifiv1alpha1.CFServiceBinding ] {
6764 cfBindingReconciler := & Reconciler {
68- k8sClient : k8sClient ,
69- scheme : scheme ,
70- log : log ,
71- upsiCredentialsReconciler : upsiCredentialsReconciler ,
72- managedCredentialsReconciler : managedCredentialsReconciler ,
65+ k8sClient : k8sClient ,
66+ scheme : scheme ,
67+ log : log ,
68+ upsiReconciler : upsiCredentialsReconciler ,
69+ managedReconciler : managedCredentialsReconciler ,
7370 }
7471 return k8s .NewPatchingReconciler (log , k8sClient , cfBindingReconciler )
7572}
@@ -126,10 +123,7 @@ func (r *Reconciler) ReconcileResource(ctx context.Context, cfServiceBinding *ko
126123 return ctrl.Result {}, err
127124 }
128125
129- if cfServiceBinding .Annotations == nil {
130- cfServiceBinding .Annotations = map [string ]string {}
131- }
132- cfServiceBinding .Annotations [korifiv1alpha1 .ServiceInstanceTypeAnnotationKey ] = string (cfServiceInstance .Spec .Type )
126+ cfServiceBinding .Annotations = tools .SetMapValue (cfServiceBinding .Annotations , korifiv1alpha1 .ServiceInstanceTypeAnnotationKey , string (cfServiceInstance .Spec .Type ))
133127
134128 err = controllerutil .SetOwnerReference (cfServiceInstance , cfServiceBinding , r .scheme )
135129 if err != nil {
@@ -145,29 +139,15 @@ func (r *Reconciler) ReconcileResource(ctx context.Context, cfServiceBinding *ko
145139 return res , err
146140 }
147141
148- sbServiceBinding , err := r .reconcileSBServiceBinding (ctx , cfServiceBinding )
149- if err != nil {
150- log .Info ("error creating/updating servicebinding.io servicebinding" , "reason" , err )
151- return ctrl.Result {}, err
152- }
153-
154- if ! isSbServiceBindingReady (sbServiceBinding ) {
155- return ctrl.Result {}, k8s .NewNotReadyError ().WithReason ("ServiceBindingNotReady" )
156- }
157-
158142 return ctrl.Result {}, nil
159143}
160144
161145func (r * Reconciler ) reconcileByType (ctx context.Context , cfServiceInstance * korifiv1alpha1.CFServiceInstance , cfServiceBinding * korifiv1alpha1.CFServiceBinding ) (ctrl.Result , error ) {
162146 if cfServiceInstance .Spec .Type == korifiv1alpha1 .UserProvidedType {
163- return r .upsiCredentialsReconciler .ReconcileResource (ctx , cfServiceBinding )
147+ return r .upsiReconciler .ReconcileResource (ctx , cfServiceBinding , cfServiceInstance )
164148 }
165149
166- if cfServiceBinding .Labels == nil {
167- cfServiceBinding .Labels = map [string ]string {}
168- }
169- cfServiceBinding .Labels [korifiv1alpha1 .PlanGUIDLabelKey ] = cfServiceInstance .Spec .PlanGUID
170- return r .managedCredentialsReconciler .ReconcileResource (ctx , cfServiceBinding )
150+ return r .managedReconciler .ReconcileResource (ctx , cfServiceBinding , cfServiceInstance )
171151}
172152
173153func needsRequeue (res ctrl.Result , err error ) bool {
@@ -177,93 +157,3 @@ func needsRequeue(res ctrl.Result, err error) bool {
177157
178158 return ! res .IsZero ()
179159}
180-
181- func isSbServiceBindingReady (sbServiceBinding * servicebindingv1beta1.ServiceBinding ) bool {
182- readyCondition := meta .FindStatusCondition (sbServiceBinding .Status .Conditions , "Ready" )
183- if readyCondition == nil {
184- return false
185- }
186-
187- if readyCondition .Status != metav1 .ConditionTrue {
188- return false
189- }
190-
191- return sbServiceBinding .Generation == sbServiceBinding .Status .ObservedGeneration
192- }
193-
194- func (r * Reconciler ) reconcileSBServiceBinding (ctx context.Context , cfServiceBinding * korifiv1alpha1.CFServiceBinding ) (* servicebindingv1beta1.ServiceBinding , error ) {
195- bindingSecret := & corev1.Secret {
196- ObjectMeta : metav1.ObjectMeta {
197- Name : cfServiceBinding .Status .Binding .Name ,
198- Namespace : cfServiceBinding .Namespace ,
199- },
200- }
201-
202- err := r .k8sClient .Get (ctx , client .ObjectKeyFromObject (bindingSecret ), bindingSecret )
203- if err != nil {
204- return nil , fmt .Errorf ("failed to get service binding credentials secret %q: %w" , cfServiceBinding .Status .Binding .Name , err )
205- }
206-
207- sbServiceBinding := r .toSBServiceBinding (cfServiceBinding )
208-
209- _ , err = controllerutil .CreateOrPatch (ctx , r .k8sClient , sbServiceBinding , func () error {
210- sbServiceBinding .Spec .Name = getSBServiceBindingName (cfServiceBinding )
211-
212- if cfServiceBinding .Annotations [korifiv1alpha1 .ServiceInstanceTypeAnnotationKey ] == korifiv1alpha1 .UserProvidedType {
213- secretType , hasType := bindingSecret .Data ["type" ]
214- if hasType && len (secretType ) > 0 {
215- sbServiceBinding .Spec .Type = string (secretType )
216- }
217-
218- secretProvider , hasProvider := bindingSecret .Data ["provider" ]
219- if hasProvider {
220- sbServiceBinding .Spec .Provider = string (secretProvider )
221- }
222- }
223- return controllerutil .SetControllerReference (cfServiceBinding , sbServiceBinding , r .scheme )
224- })
225- if err != nil {
226- return nil , err
227- }
228-
229- return sbServiceBinding , nil
230- }
231-
232- func (r * Reconciler ) toSBServiceBinding (cfServiceBinding * korifiv1alpha1.CFServiceBinding ) * servicebindingv1beta1.ServiceBinding {
233- return & servicebindingv1beta1.ServiceBinding {
234- ObjectMeta : metav1.ObjectMeta {
235- Name : fmt .Sprintf ("cf-binding-%s" , cfServiceBinding .Name ),
236- Namespace : cfServiceBinding .Namespace ,
237- Labels : map [string ]string {
238- ServiceBindingGUIDLabel : cfServiceBinding .Name ,
239- korifiv1alpha1 .CFAppGUIDLabelKey : cfServiceBinding .Spec .AppRef .Name ,
240- ServiceCredentialBindingTypeLabel : "app" ,
241- },
242- },
243- Spec : servicebindingv1beta1.ServiceBindingSpec {
244- Type : cfServiceBinding .Annotations [korifiv1alpha1 .ServiceInstanceTypeAnnotationKey ],
245- Workload : servicebindingv1beta1.ServiceBindingWorkloadReference {
246- APIVersion : "apps/v1" ,
247- Kind : "StatefulSet" ,
248- Selector : & metav1.LabelSelector {
249- MatchLabels : map [string ]string {
250- korifiv1alpha1 .CFAppGUIDLabelKey : cfServiceBinding .Spec .AppRef .Name ,
251- },
252- },
253- },
254- Service : servicebindingv1beta1.ServiceBindingServiceReference {
255- APIVersion : "korifi.cloudfoundry.org/v1alpha1" ,
256- Kind : "CFServiceBinding" ,
257- Name : cfServiceBinding .Name ,
258- },
259- },
260- }
261- }
262-
263- func getSBServiceBindingName (cfServiceBinding * korifiv1alpha1.CFServiceBinding ) string {
264- if cfServiceBinding .Spec .DisplayName != nil {
265- return * cfServiceBinding .Spec .DisplayName
266- }
267-
268- return cfServiceBinding .Status .Binding .Name
269- }
0 commit comments