Skip to content

Commit 0044437

Browse files
Remove legacy secret
Co-authored-by: Danail Branekov <[email protected]>
1 parent 8c30d12 commit 0044437

File tree

4 files changed

+0
-235
lines changed

4 files changed

+0
-235
lines changed

controllers/controllers/services/bindings/controller_test.go

Lines changed: 0 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -462,54 +462,6 @@ var _ = Describe("CFServiceBinding", func() {
462462
})
463463
})
464464

465-
When("the binding references a 'legacy' instance credentials secret", func() {
466-
JustBeforeEach(func() {
467-
Expect(k8s.Patch(ctx, adminClient, instance, func() {
468-
instance.Spec.SecretName = instance.Name
469-
instance.Status.Credentials.Name = instance.Name
470-
})).To(Succeed())
471-
472-
Eventually(func(g Gomega) {
473-
g.Expect(k8s.Patch(ctx, adminClient, binding, func() {
474-
binding.Status.Binding.Name = instance.Name
475-
})).To(Succeed())
476-
477-
// Ensure that the binding controller has observed the patch operation above
478-
g.Expect(adminClient.Get(ctx, client.ObjectKeyFromObject(binding), binding)).To(Succeed())
479-
g.Expect(binding.Generation).To(Equal(binding.Status.ObservedGeneration))
480-
g.Expect(binding.Status.Binding.Name).To(Equal(instance.Name))
481-
}).Should(Succeed())
482-
})
483-
484-
It("sets the binding Ready status condition to false", func() {
485-
Eventually(func(g Gomega) {
486-
g.Expect(adminClient.Get(ctx, client.ObjectKeyFromObject(binding), binding)).To(Succeed())
487-
g.Expect(binding.Status.Conditions).To(ContainElement(SatisfyAll(
488-
HasType(Equal(korifiv1alpha1.StatusConditionReady)),
489-
HasStatus(Equal(metav1.ConditionFalse)),
490-
)))
491-
}).Should(Succeed())
492-
})
493-
494-
When("the referenced legacy binding secret exists", func() {
495-
BeforeEach(func() {
496-
Expect(adminClient.Create(ctx, &corev1.Secret{
497-
ObjectMeta: metav1.ObjectMeta{
498-
Name: instance.Name,
499-
Namespace: testNamespace,
500-
},
501-
})).To(Succeed())
502-
})
503-
504-
It("does not update the binding status", func() {
505-
Consistently(func(g Gomega) {
506-
g.Expect(adminClient.Get(ctx, client.ObjectKeyFromObject(binding), binding)).To(Succeed())
507-
g.Expect(binding.Status.Binding.Name).To(Equal(instance.Name))
508-
}).Should(Succeed())
509-
})
510-
})
511-
})
512-
513465
When("the binding is deleted", func() {
514466
JustBeforeEach(func() {
515467
Expect(adminClient.Delete(ctx, binding)).To(Succeed())

controllers/controllers/services/bindings/upsi/controller.go

Lines changed: 0 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -77,39 +77,9 @@ func (r *UPSIBindingReconciler) ReconcileResource(ctx context.Context, cfService
7777
return ctrl.Result{}, nil
7878
}
7979

80-
func isLegacyServiceBinding(cfServiceBinding *korifiv1alpha1.CFServiceBinding, cfServiceInstance *korifiv1alpha1.CFServiceInstance) bool {
81-
if cfServiceBinding.Status.Binding.Name == "" {
82-
return false
83-
}
84-
85-
// When reconciling existing legacy service bindings we make
86-
// use of the fact that the service binding used to reference
87-
// the secret of the sevice instance that shares the sevice
88-
// instance name. See ADR 16 for more datails.
89-
return cfServiceInstance.Name == cfServiceBinding.Status.Binding.Name && cfServiceInstance.Spec.SecretName == cfServiceBinding.Status.Binding.Name
90-
}
91-
9280
func (r *UPSIBindingReconciler) reconcileCredentials(ctx context.Context, cfServiceInstance *korifiv1alpha1.CFServiceInstance, cfServiceBinding *korifiv1alpha1.CFServiceBinding) error {
9381
cfServiceBinding.Status.Credentials.Name = cfServiceInstance.Status.Credentials.Name
9482

95-
if isLegacyServiceBinding(cfServiceBinding, cfServiceInstance) {
96-
bindingSecret := &corev1.Secret{
97-
ObjectMeta: metav1.ObjectMeta{
98-
Name: cfServiceBinding.Status.Binding.Name,
99-
Namespace: cfServiceBinding.Namespace,
100-
},
101-
}
102-
103-
// For legacy sevice bindings we want to keep the binding secret
104-
// unchanged in order to avoid unexpected app restarts. See ADR 16 for more details.
105-
err := r.k8sClient.Get(ctx, client.ObjectKeyFromObject(bindingSecret), bindingSecret)
106-
if err != nil {
107-
return err
108-
}
109-
110-
return nil
111-
}
112-
11383
credentialsSecret := &corev1.Secret{
11484
ObjectMeta: metav1.ObjectMeta{
11585
Namespace: cfServiceInstance.Namespace,

controllers/controllers/services/instances/upsi/controller.go

Lines changed: 0 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,9 @@ package upsi
1919
import (
2020
"context"
2121
"encoding/json"
22-
"strings"
2322
"time"
2423

2524
korifiv1alpha1 "code.cloudfoundry.org/korifi/controllers/api/v1alpha1"
26-
"code.cloudfoundry.org/korifi/controllers/controllers/services/credentials"
2725
"code.cloudfoundry.org/korifi/controllers/controllers/shared"
2826
"code.cloudfoundry.org/korifi/tools"
2927
"code.cloudfoundry.org/korifi/tools/k8s"
@@ -38,7 +36,6 @@ import (
3836
ctrl "sigs.k8s.io/controller-runtime"
3937
"sigs.k8s.io/controller-runtime/pkg/builder"
4038
"sigs.k8s.io/controller-runtime/pkg/client"
41-
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
4239
"sigs.k8s.io/controller-runtime/pkg/handler"
4340
"sigs.k8s.io/controller-runtime/pkg/predicate"
4441
"sigs.k8s.io/controller-runtime/pkg/reconcile"
@@ -127,11 +124,6 @@ func (r *Reconciler) ReconcileResource(ctx context.Context, cfServiceInstance *k
127124
return ctrl.Result{}, notReadyErr
128125
}
129126

130-
credentialsSecret, err = r.reconcileCredentials(ctx, credentialsSecret, cfServiceInstance)
131-
if err != nil {
132-
return ctrl.Result{}, k8s.NewNotReadyError().WithCause(err).WithReason("FailedReconcilingCredentialsSecret")
133-
}
134-
135127
if err = r.validateCredentials(credentialsSecret); err != nil {
136128
return ctrl.Result{}, k8s.NewNotReadyError().WithCause(err).WithReason("SecretInvalid")
137129
}
@@ -143,46 +135,6 @@ func (r *Reconciler) ReconcileResource(ctx context.Context, cfServiceInstance *k
143135
return ctrl.Result{}, nil
144136
}
145137

146-
func (r *Reconciler) reconcileCredentials(ctx context.Context, credentialsSecret *corev1.Secret, cfServiceInstance *korifiv1alpha1.CFServiceInstance) (*corev1.Secret, error) {
147-
if !strings.HasPrefix(string(credentialsSecret.Type), credentials.ServiceBindingSecretTypePrefix) {
148-
return credentialsSecret, nil
149-
}
150-
151-
log := logr.FromContextOrDiscard(ctx)
152-
153-
log.Info("migrating legacy secret", "legacy-secret-name", credentialsSecret.Name)
154-
migratedSecret := &corev1.Secret{
155-
ObjectMeta: metav1.ObjectMeta{
156-
Name: cfServiceInstance.Name + "-migrated",
157-
Namespace: cfServiceInstance.Namespace,
158-
},
159-
}
160-
_, err := controllerutil.CreateOrPatch(ctx, r.k8sClient, migratedSecret, func() error {
161-
migratedSecret.Type = corev1.SecretTypeOpaque
162-
data := map[string]any{}
163-
for k, v := range credentialsSecret.Data {
164-
data[k] = string(v)
165-
}
166-
167-
dataBytes, err := json.Marshal(data)
168-
if err != nil {
169-
log.Error(err, "failed to marshal legacy credentials secret data")
170-
return err
171-
}
172-
173-
migratedSecret.Data = map[string][]byte{
174-
tools.CredentialsSecretKey: dataBytes,
175-
}
176-
return controllerutil.SetOwnerReference(cfServiceInstance, migratedSecret, r.scheme)
177-
})
178-
if err != nil {
179-
log.Error(err, "failed to create migrated credentials secret")
180-
return nil, err
181-
}
182-
183-
return migratedSecret, nil
184-
}
185-
186138
func (r *Reconciler) validateCredentials(credentialsSecret *corev1.Secret) error {
187139
return errors.Wrapf(
188140
json.Unmarshal(credentialsSecret.Data[tools.CredentialsSecretKey], &map[string]any{}),

controllers/controllers/services/instances/upsi/controller_test.go

Lines changed: 0 additions & 109 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,7 @@
11
package upsi_test
22

33
import (
4-
"encoding/json"
5-
64
"github.com/google/uuid"
7-
. "github.com/onsi/gomega/gstruct"
85
"sigs.k8s.io/controller-runtime/pkg/client"
96

107
korifiv1alpha1 "code.cloudfoundry.org/korifi/controllers/api/v1alpha1"
@@ -174,112 +171,6 @@ var _ = Describe("CFServiceInstance", func() {
174171
})
175172
})
176173
})
177-
178-
When("the instance credentials secret is in the 'legacy' format", func() {
179-
var credentialsSecret *corev1.Secret
180-
181-
getMigratedSecret := func() *corev1.Secret {
182-
migratedSecret := &corev1.Secret{
183-
ObjectMeta: metav1.ObjectMeta{
184-
Name: instance.Name + "-migrated",
185-
Namespace: testNamespace,
186-
},
187-
}
188-
Eventually(func(g Gomega) {
189-
g.Expect(adminClient.Get(ctx, client.ObjectKeyFromObject(migratedSecret), migratedSecret)).To(Succeed())
190-
}).Should(Succeed())
191-
192-
return migratedSecret
193-
}
194-
195-
JustBeforeEach(func() {
196-
credentialsSecret = &corev1.Secret{
197-
ObjectMeta: metav1.ObjectMeta{
198-
Name: uuid.NewString(),
199-
Namespace: testNamespace,
200-
},
201-
Type: corev1.SecretType("servicebinding.io/legacy"),
202-
StringData: map[string]string{
203-
"foo": "bar",
204-
},
205-
}
206-
Expect(adminClient.Create(ctx, credentialsSecret)).To(Succeed())
207-
208-
Expect(k8s.PatchResource(ctx, adminClient, instance, func() {
209-
instance.Spec.SecretName = credentialsSecret.Name
210-
})).To(Succeed())
211-
})
212-
213-
It("creates a derived secret in the new format", func() {
214-
Eventually(func(g Gomega) {
215-
migratedSecret := getMigratedSecret()
216-
g.Expect(migratedSecret.Type).To(Equal(corev1.SecretTypeOpaque))
217-
g.Expect(migratedSecret.Data).To(MatchAllKeys(Keys{
218-
tools.CredentialsSecretKey: Not(BeEmpty()),
219-
}))
220-
221-
credentials := map[string]any{}
222-
g.Expect(json.Unmarshal(migratedSecret.Data[tools.CredentialsSecretKey], &credentials)).To(Succeed())
223-
g.Expect(credentials).To(MatchAllKeys(Keys{
224-
"foo": Equal("bar"),
225-
}))
226-
}).Should(Succeed())
227-
})
228-
229-
It("sets an owner reference from the service instance to the migrated secret", func() {
230-
Eventually(func(g Gomega) {
231-
migratedSecret := getMigratedSecret()
232-
g.Expect(migratedSecret.OwnerReferences).To(ConsistOf(MatchFields(IgnoreExtras, Fields{
233-
"Kind": Equal("CFServiceInstance"),
234-
"Name": Equal(instance.Name),
235-
})))
236-
}).Should(Succeed())
237-
})
238-
239-
It("sets the instance credentials secret name and observed version to the migrated secret name and version", func() {
240-
Eventually(func(g Gomega) {
241-
g.Expect(adminClient.Get(ctx, client.ObjectKeyFromObject(instance), instance)).To(Succeed())
242-
g.Expect(instance.Status.Credentials.Name).To(Equal(instance.Name + "-migrated"))
243-
g.Expect(instance.Status.CredentialsObservedVersion).To(Equal(getMigratedSecret().ResourceVersion))
244-
}).Should(Succeed())
245-
})
246-
247-
It("does not change the original credentials secret", func() {
248-
Eventually(func(g Gomega) {
249-
g.Expect(adminClient.Get(ctx, client.ObjectKeyFromObject(instance), instance)).To(Succeed())
250-
g.Expect(instance.Status.Credentials.Name).NotTo(BeEmpty())
251-
252-
g.Expect(instance.Spec.SecretName).To(Equal(credentialsSecret.Name))
253-
254-
previousCredentialsVersion := credentialsSecret.ResourceVersion
255-
g.Expect(adminClient.Get(ctx, client.ObjectKeyFromObject(credentialsSecret), credentialsSecret)).To(Succeed())
256-
g.Expect(credentialsSecret.ResourceVersion).To(Equal(previousCredentialsVersion))
257-
}).Should(Succeed())
258-
})
259-
260-
When("legacy secret cannot be migrated", func() {
261-
BeforeEach(func() {
262-
Expect(adminClient.Create(ctx, &corev1.Secret{
263-
ObjectMeta: metav1.ObjectMeta{
264-
Name: instance.Name + "-migrated",
265-
Namespace: instance.Namespace,
266-
},
267-
Type: corev1.SecretType("will-clash-with-migrated-secret-type"),
268-
})).To(Succeed())
269-
})
270-
271-
It("sets the CredentialSecretAvailable condition to false", func() {
272-
Eventually(func(g Gomega) {
273-
g.Expect(adminClient.Get(ctx, client.ObjectKeyFromObject(instance), instance)).To(Succeed())
274-
g.Expect(instance.Status.Conditions).To(ContainElement(SatisfyAll(
275-
HasType(Equal(korifiv1alpha1.StatusConditionReady)),
276-
HasStatus(Equal(metav1.ConditionFalse)),
277-
HasReason(Equal("FailedReconcilingCredentialsSecret")),
278-
)))
279-
}).Should(Succeed())
280-
})
281-
})
282-
})
283174
})
284175

285176
When("the service instance is managed", func() {

0 commit comments

Comments
 (0)