Skip to content

Commit 0f927b4

Browse files
committed
Add AC finalizer management
Signed-off-by: Veronika Fisarova <vfisarov@redhat.com>
1 parent 7865580 commit 0f927b4

8 files changed

Lines changed: 250 additions & 15 deletions

File tree

api/bases/octavia.openstack.org_octaviaapis.yaml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -456,6 +456,13 @@ spec:
456456
status:
457457
description: OctaviaAPIStatus defines the observed state of OctaviaAPI
458458
properties:
459+
applicationCredentialSecret:
460+
description: |-
461+
ApplicationCredentialSecret - the AC secret OctaviaAPI is currently
462+
consuming and protecting with the openstack.org/octaviaapi-ac-consumer
463+
finalizer. Tracked so the controller can remove its finalizer from the
464+
old secret when the openstack-operator rotates the reference.
465+
type: string
459466
conditions:
460467
description: Conditions
461468
items:

api/v1beta1/octaviaapi_types.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,12 @@ type OctaviaAPIStatus struct {
217217
// NetworkAttachment status of the deployment pods
218218
NetworkAttachments map[string][]string `json:"networkAttachments,omitempty"`
219219

220+
// ApplicationCredentialSecret - the AC secret OctaviaAPI is currently
221+
// consuming and protecting with the openstack.org/octaviaapi-ac-consumer
222+
// finalizer. Tracked so the controller can remove its finalizer from the
223+
// old secret when the openstack-operator rotates the reference.
224+
ApplicationCredentialSecret string `json:"applicationCredentialSecret,omitempty"`
225+
220226
// ObservedGeneration - the most recent generation observed for this
221227
// service. If the observed generation is less than the spec generation,
222228
// then the controller has not processed the latest changes injected by

config/crd/bases/octavia.openstack.org_octaviaapis.yaml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -456,6 +456,13 @@ spec:
456456
status:
457457
description: OctaviaAPIStatus defines the observed state of OctaviaAPI
458458
properties:
459+
applicationCredentialSecret:
460+
description: |-
461+
ApplicationCredentialSecret - the AC secret OctaviaAPI is currently
462+
consuming and protecting with the openstack.org/octaviaapi-ac-consumer
463+
finalizer. Tracked so the controller can remove its finalizer from the
464+
old secret when the openstack-operator rotates the reference.
465+
type: string
459466
conditions:
460467
description: Conditions
461468
items:

go.mod

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,12 @@ require (
99
github.com/onsi/ginkgo/v2 v2.28.2
1010
github.com/onsi/gomega v1.41.0
1111
github.com/openstack-k8s-operators/infra-operator/apis v0.6.1-0.20260513130700-78e1a15a8289
12-
github.com/openstack-k8s-operators/keystone-operator/api v0.6.1-0.20260513130126-175a0958de92
12+
github.com/openstack-k8s-operators/keystone-operator/api v0.6.1-0.20260520090027-4d7b7a01c0bf
1313
github.com/openstack-k8s-operators/lib-common/modules/common v0.6.1-0.20260518125357-72bdd580c587
14-
github.com/openstack-k8s-operators/lib-common/modules/openstack v0.6.1-0.20260515134210-2e2a0d06648c
15-
github.com/openstack-k8s-operators/mariadb-operator/api v0.6.1-0.20260513143847-4b70b899997a
14+
github.com/openstack-k8s-operators/lib-common/modules/openstack v0.6.1-0.20260506154724-30a976ba8ef0
15+
github.com/openstack-k8s-operators/mariadb-operator/api v0.6.1-0.20260421135251-4fb605db7d18
1616
github.com/openstack-k8s-operators/octavia-operator/api v0.0.0-00010101000000-000000000000
17-
github.com/openstack-k8s-operators/ovn-operator/api v0.6.1-0.20260509203137-d009c70c8d50
17+
github.com/openstack-k8s-operators/ovn-operator/api v0.6.1-0.20260422180129-f058fa795f8e
1818
go.uber.org/zap v1.28.0 // indirect
1919
k8s.io/api v0.31.14
2020
k8s.io/apimachinery v0.31.14
@@ -24,7 +24,7 @@ require (
2424

2525
require (
2626
github.com/google/uuid v1.6.0
27-
github.com/openstack-k8s-operators/lib-common/modules/test v0.6.1-0.20260515134210-2e2a0d06648c
27+
github.com/openstack-k8s-operators/lib-common/modules/test v0.6.1-0.20260518125357-72bdd580c587
2828
golang.org/x/crypto v0.48.0
2929
gopkg.in/ini.v1 v1.67.1
3030
k8s.io/utils v0.0.0-20250820121507-0af2bda4dd1d

go.sum

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -120,20 +120,20 @@ github.com/openshift/api v0.0.0-20250711200046-c86d80652a9e h1:E1OdwSpqWuDPCedyU
120120
github.com/openshift/api v0.0.0-20250711200046-c86d80652a9e/go.mod h1:Shkl4HanLwDiiBzakv+con/aMGnVE2MAGvoKp5oyYUo=
121121
github.com/openstack-k8s-operators/infra-operator/apis v0.6.1-0.20260513130700-78e1a15a8289 h1:c7jcPJt1jINUqWcYhmpeUDzeesOd0SfrFOpxEHHoJ7c=
122122
github.com/openstack-k8s-operators/infra-operator/apis v0.6.1-0.20260513130700-78e1a15a8289/go.mod h1:1FRevwpKwNgNjDcd8Rz+mxlRleFsi7gNS0BC09x+oYE=
123-
github.com/openstack-k8s-operators/keystone-operator/api v0.6.1-0.20260513130126-175a0958de92 h1:9brYhCAbx+Cwfq8cEtn/g4xF0w6FlyM7CSuDqertxNQ=
124-
github.com/openstack-k8s-operators/keystone-operator/api v0.6.1-0.20260513130126-175a0958de92/go.mod h1:/nxao9LzRStCZPOpyY61Sbfzcogy5BrEP5nExUwFYZ0=
123+
github.com/openstack-k8s-operators/keystone-operator/api v0.6.1-0.20260520090027-4d7b7a01c0bf h1:FoKK0zNo48i4ZMFxScupCK/YAmy6Ps4IILz3CK4BCTI=
124+
github.com/openstack-k8s-operators/keystone-operator/api v0.6.1-0.20260520090027-4d7b7a01c0bf/go.mod h1:VNX1Mda2u5+yGxycIyVrgABucitMDR9ct3Lj6ROS92I=
125125
github.com/openstack-k8s-operators/lib-common/modules/common v0.6.1-0.20260518125357-72bdd580c587 h1:p03uEXoSreyu7LpFmb9YyYM8tEx2D2+7qqhLXNWHTq0=
126126
github.com/openstack-k8s-operators/lib-common/modules/common v0.6.1-0.20260518125357-72bdd580c587/go.mod h1:JC04T5G4E/he5ukonV1oCqa0QzFkLv761VbLruVghJM=
127-
github.com/openstack-k8s-operators/lib-common/modules/openstack v0.6.1-0.20260515134210-2e2a0d06648c h1:8g+abN6RBDOVf8y8qA9IGqDgpAPYduc+T3DuHvQMh2w=
128-
github.com/openstack-k8s-operators/lib-common/modules/openstack v0.6.1-0.20260515134210-2e2a0d06648c/go.mod h1:7yqbVpg0k0vW+kZks+TMU/cd1ovoejyHfVPWcyGYLHI=
127+
github.com/openstack-k8s-operators/lib-common/modules/openstack v0.6.1-0.20260506154724-30a976ba8ef0 h1:kMie+G0aHlGwDHjimjj8AUxTl2R7LGfai/8pev2T+TY=
128+
github.com/openstack-k8s-operators/lib-common/modules/openstack v0.6.1-0.20260506154724-30a976ba8ef0/go.mod h1:7yqbVpg0k0vW+kZks+TMU/cd1ovoejyHfVPWcyGYLHI=
129129
github.com/openstack-k8s-operators/lib-common/modules/storage v0.6.1-0.20260506154724-30a976ba8ef0 h1:wuzSibIT9F/5RbMmxvBVFj6fy2vtKo58nibzmk5L4PM=
130130
github.com/openstack-k8s-operators/lib-common/modules/storage v0.6.1-0.20260506154724-30a976ba8ef0/go.mod h1:tft3oDiN+v6wX3ILPXGUM/gCLJz6QtrPN63hxpJ3E24=
131-
github.com/openstack-k8s-operators/lib-common/modules/test v0.6.1-0.20260515134210-2e2a0d06648c h1:R68ZhKmcepRdiIC7m7pHXSD3Ycayt6RdF2dP6cg3ga4=
132-
github.com/openstack-k8s-operators/lib-common/modules/test v0.6.1-0.20260515134210-2e2a0d06648c/go.mod h1:ZYG9CQe7cOePOKQbenEZFA28kPdkUOe9QKbDRwGhEV0=
133-
github.com/openstack-k8s-operators/mariadb-operator/api v0.6.1-0.20260513143847-4b70b899997a h1:5P4XUoB5s2NcPZiYWV2s7xBDLNJg4kMzJNxRreR65Aw=
134-
github.com/openstack-k8s-operators/mariadb-operator/api v0.6.1-0.20260513143847-4b70b899997a/go.mod h1:WHqmWfERjBKzbWUN9FU6n8p4FXcF9BKSFNklApqYgHw=
135-
github.com/openstack-k8s-operators/ovn-operator/api v0.6.1-0.20260509203137-d009c70c8d50 h1:Ib5hwyrq8eGPB7Qa24yL84ZcjEq54FnNZN3e5bic3FM=
136-
github.com/openstack-k8s-operators/ovn-operator/api v0.6.1-0.20260509203137-d009c70c8d50/go.mod h1:uKInqPkZlYweSmnTE9J0fI36CRLJkG8TLou6QZCSkNY=
131+
github.com/openstack-k8s-operators/lib-common/modules/test v0.6.1-0.20260518125357-72bdd580c587 h1:jpouKcgs2Kc5z2JHIpvsXMxEonfXLgzX3KswuBoeKQ0=
132+
github.com/openstack-k8s-operators/lib-common/modules/test v0.6.1-0.20260518125357-72bdd580c587/go.mod h1:nLS2oK4pBo756JNN1cPgr44S0X9V11QScgVla89Ojok=
133+
github.com/openstack-k8s-operators/mariadb-operator/api v0.6.1-0.20260421135251-4fb605db7d18 h1:fMMY6pp7+PEkcsdDoodTfJ6ct2RyGI8VB+toVJxxB5w=
134+
github.com/openstack-k8s-operators/mariadb-operator/api v0.6.1-0.20260421135251-4fb605db7d18/go.mod h1:g/xgMnzNHxdTkqnEgAKwVOv75uPN4nuApbkGqSvASvs=
135+
github.com/openstack-k8s-operators/ovn-operator/api v0.6.1-0.20260422180129-f058fa795f8e h1:Aks3Y8z8ZcvYim+qpYRr0OxtPCg9QqlHuloVowWrqZs=
136+
github.com/openstack-k8s-operators/ovn-operator/api v0.6.1-0.20260422180129-f058fa795f8e/go.mod h1:ODYNTFMUlzvjlqXAh9AGXrzpBNQBAOkWiNQ6UldsqFw=
137137
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
138138
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
139139
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=

internal/controller/octaviaapi_controller.go

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -458,6 +458,19 @@ func (r *OctaviaAPIReconciler) reconcileDelete(ctx context.Context, instance *oc
458458
}
459459
}
460460

461+
// Remove consumer finalizer from AC secrets OctaviaAPI was consuming.
462+
// Check both status and spec to handle the edge case where the reconciler
463+
// crashed after adding the finalizer but before updating the status.
464+
for _, secretName := range []string{
465+
instance.Status.ApplicationCredentialSecret,
466+
instance.Spec.Auth.ApplicationCredentialSecret,
467+
} {
468+
if err := keystonev1.RemoveACSecretConsumerFinalizer(ctx, helper, instance.Namespace,
469+
secretName, octavia.ACConsumerFinalizer); err != nil {
470+
return ctrl.Result{}, err
471+
}
472+
}
473+
461474
// We did all the cleanup on the objects we created so we can remove the
462475
// finalizer from ourselves to allow the deletion
463476
controllerutil.RemoveFinalizer(instance, helper.GetFinalizer())
@@ -769,6 +782,23 @@ func (r *OctaviaAPIReconciler) reconcileNormal(ctx context.Context, instance *oc
769782
return ctrl.Result{}, nil
770783
}
771784

785+
// Manage consumer finalizer, the AC data was already read and rendered to the service config secret
786+
if instance.Spec.Auth.ApplicationCredentialSecret != "" || instance.Status.ApplicationCredentialSecret != "" {
787+
if err := keystonev1.ManageACSecretFinalizer(ctx, helper, instance.Namespace,
788+
instance.Spec.Auth.ApplicationCredentialSecret,
789+
instance.Status.ApplicationCredentialSecret,
790+
octavia.ACConsumerFinalizer); err != nil {
791+
instance.Status.Conditions.Set(condition.FalseCondition(
792+
condition.ServiceConfigReadyCondition,
793+
condition.ErrorReason,
794+
condition.SeverityWarning,
795+
condition.ServiceConfigReadyErrorMessage,
796+
err.Error()))
797+
return ctrl.Result{}, err
798+
}
799+
}
800+
instance.Status.ApplicationCredentialSecret = instance.Spec.Auth.ApplicationCredentialSecret
801+
772802
instance.Status.Conditions.MarkTrue(condition.ServiceConfigReadyCondition, condition.ServiceConfigReadyMessage)
773803
// Create ConfigMaps and Secrets - end
774804

internal/octavia/const.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,4 +52,7 @@ const (
5252

5353
// HmConfigMap ...
5454
HmConfigMap = "octavia-hmport-map"
55+
56+
// ACConsumerFinalizer is added to AC secrets that octavia is actively consuming
57+
ACConsumerFinalizer = "openstack.org/octaviaapi-ac-consumer"
5558
)

test/functional/octaviaapi_controller_test.go

Lines changed: 182 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import (
2626
"k8s.io/apimachinery/pkg/types"
2727

2828
corev1 "k8s.io/api/core/v1"
29+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2930

3031
keystonev1 "github.com/openstack-k8s-operators/keystone-operator/api/v1beta1"
3132
"github.com/openstack-k8s-operators/lib-common/modules/common/condition"
@@ -503,4 +504,185 @@ var _ = Describe("OctaviaAPI controller", func() {
503504
}, timeout, interval).Should(Succeed())
504505
})
505506
})
507+
508+
When("ApplicationCredential consumer finalizer is managed", func() {
509+
var (
510+
acSecretName string
511+
servicePasswordSecret *corev1.Secret
512+
)
513+
514+
BeforeEach(func() {
515+
keystoneAPIName := keystone.CreateKeystoneAPI(namespace)
516+
DeferCleanup(keystone.DeleteKeystoneAPI, keystoneAPIName)
517+
keystoneInternalEndpoint := fmt.Sprintf("http://keystone-for-%s-internal", octaviaAPIName.Name)
518+
keystonePublicEndpoint := fmt.Sprintf("http://keystone-for-%s-public", octaviaAPIName.Name)
519+
SimulateKeystoneReady(keystoneAPIName, keystonePublicEndpoint, keystoneInternalEndpoint)
520+
521+
servicePasswordSecret = CreateOctaviaSecret(namespace)
522+
DeferCleanup(k8sClient.Delete, ctx, servicePasswordSecret)
523+
DeferCleanup(k8sClient.Delete, ctx, CreateTransportURLSecret(transportURLSecretName))
524+
525+
acSecretName = "ac-octavia-a1b2c-secret" //nolint:gosec // G101
526+
secret := &corev1.Secret{
527+
ObjectMeta: metav1.ObjectMeta{
528+
Namespace: namespace,
529+
Name: acSecretName,
530+
},
531+
Data: map[string][]byte{
532+
keystonev1.ACIDSecretKey: []byte("a1b2ctest-ac-id"),
533+
keystonev1.ACSecretSecretKey: []byte("test-ac-secret"),
534+
},
535+
}
536+
DeferCleanup(k8sClient.Delete, ctx, secret)
537+
Expect(k8sClient.Create(ctx, secret)).To(Succeed())
538+
539+
spec["auth"] = map[string]any{
540+
"applicationCredentialSecret": acSecretName,
541+
}
542+
DeferCleanup(th.DeleteInstance, CreateOctaviaAPI(octaviaAPIName, spec))
543+
544+
mariaDBDatabaseName := mariadb.CreateMariaDBDatabase(namespace, octavia.DatabaseCRName, mariadbv1.MariaDBDatabaseSpec{})
545+
mariaDBDatabase := mariadb.GetMariaDBDatabase(mariaDBDatabaseName)
546+
DeferCleanup(k8sClient.Delete, ctx, mariaDBDatabase)
547+
548+
octaviaAPI := GetOctaviaAPI(octaviaAPIName)
549+
apiMariaDBAccount, apiMariaDBSecret := mariadb.CreateMariaDBAccountAndSecret(
550+
types.NamespacedName{
551+
Namespace: namespace,
552+
Name: octaviaAPI.Spec.DatabaseAccount,
553+
}, mariadbv1.MariaDBAccountSpec{})
554+
DeferCleanup(k8sClient.Delete, ctx, apiMariaDBAccount)
555+
DeferCleanup(k8sClient.Delete, ctx, apiMariaDBSecret)
556+
557+
mariaDBDatabaseName = mariadb.CreateMariaDBDatabase(namespace, octavia.PersistenceDatabaseCRName, mariadbv1.MariaDBDatabaseSpec{})
558+
mariaDBDatabase = mariadb.GetMariaDBDatabase(mariaDBDatabaseName)
559+
DeferCleanup(k8sClient.Delete, ctx, mariaDBDatabase)
560+
561+
apiMariaDBAccount, apiMariaDBSecret = mariadb.CreateMariaDBAccountAndSecret(
562+
types.NamespacedName{
563+
Namespace: namespace,
564+
Name: octaviaAPI.Spec.PersistenceDatabaseAccount,
565+
}, mariadbv1.MariaDBAccountSpec{})
566+
DeferCleanup(k8sClient.Delete, ctx, apiMariaDBAccount)
567+
DeferCleanup(k8sClient.Delete, ctx, apiMariaDBSecret)
568+
569+
ovndbCluster := ovn.CreateOVNDBCluster(nil, namespace,
570+
ovnv1.OVNDBClusterSpec{
571+
OVNDBClusterSpecCore: ovnv1.OVNDBClusterSpecCore{
572+
DBType: ovnv1.NBDBType,
573+
}})
574+
ovndb := ovn.GetOVNDBCluster(ovndbCluster)
575+
DeferCleanup(k8sClient.Delete, ctx, ovndb)
576+
Eventually(func(g Gomega) {
577+
ovndb.Status.InternalDBAddress = OVNNBDBEndpoint
578+
g.Expect(k8sClient.Status().Update(ctx, ovndb)).To(Succeed())
579+
}).Should(Succeed())
580+
ovn.SimulateOVNDBClusterReady(ovndbCluster)
581+
582+
ovndbCluster = ovn.CreateOVNDBCluster(nil, namespace,
583+
ovnv1.OVNDBClusterSpec{
584+
OVNDBClusterSpecCore: ovnv1.OVNDBClusterSpecCore{
585+
DBType: ovnv1.SBDBType,
586+
}})
587+
ovndb = ovn.GetOVNDBCluster(ovndbCluster)
588+
DeferCleanup(k8sClient.Delete, ctx, ovndb)
589+
Eventually(func(g Gomega) {
590+
ovndb.Status.InternalDBAddress = OVNSBDBEndpoint
591+
g.Expect(k8sClient.Status().Update(ctx, ovndb)).To(Succeed())
592+
}).Should(Succeed())
593+
ovn.SimulateOVNDBClusterReady(ovndbCluster)
594+
})
595+
596+
It("should add the consumer finalizer to the AC secret", func() {
597+
Eventually(func(g Gomega) {
598+
secret := th.GetSecret(types.NamespacedName{
599+
Namespace: namespace,
600+
Name: acSecretName,
601+
})
602+
g.Expect(secret.Finalizers).To(
603+
ContainElement(octavia.ACConsumerFinalizer))
604+
}, timeout, interval).Should(Succeed())
605+
})
606+
607+
It("should track the consumed AC secret in status", func() {
608+
Eventually(func(g Gomega) {
609+
o := GetOctaviaAPI(octaviaAPIName)
610+
g.Expect(o.Status.ApplicationCredentialSecret).To(Equal(acSecretName))
611+
}, timeout, interval).Should(Succeed())
612+
})
613+
614+
It("should move the finalizer from the old to the new secret on rotation", func() {
615+
Eventually(func(g Gomega) {
616+
secret := th.GetSecret(types.NamespacedName{
617+
Namespace: namespace,
618+
Name: acSecretName,
619+
})
620+
g.Expect(secret.Finalizers).To(
621+
ContainElement(octavia.ACConsumerFinalizer))
622+
}, timeout, interval).Should(Succeed())
623+
624+
newACSecretName := "ac-octavia-x9y8z-secret" //nolint:gosec // G101
625+
newSecret := &corev1.Secret{
626+
ObjectMeta: metav1.ObjectMeta{
627+
Namespace: namespace,
628+
Name: newACSecretName,
629+
},
630+
Data: map[string][]byte{
631+
keystonev1.ACIDSecretKey: []byte("x9y8zrotated-ac-id"),
632+
keystonev1.ACSecretSecretKey: []byte("rotated-ac-secret"),
633+
},
634+
}
635+
DeferCleanup(k8sClient.Delete, ctx, newSecret)
636+
Expect(k8sClient.Create(ctx, newSecret)).To(Succeed())
637+
638+
Eventually(func(g Gomega) {
639+
o := GetOctaviaAPI(octaviaAPIName)
640+
o.Spec.Auth.ApplicationCredentialSecret = newACSecretName
641+
g.Expect(k8sClient.Update(ctx, o)).Should(Succeed())
642+
}, timeout, interval).Should(Succeed())
643+
644+
Eventually(func(g Gomega) {
645+
secret := th.GetSecret(types.NamespacedName{
646+
Namespace: namespace,
647+
Name: newACSecretName,
648+
})
649+
g.Expect(secret.Finalizers).To(
650+
ContainElement(octavia.ACConsumerFinalizer))
651+
}, timeout, interval).Should(Succeed())
652+
653+
Eventually(func(g Gomega) {
654+
secret := th.GetSecret(types.NamespacedName{
655+
Namespace: namespace,
656+
Name: acSecretName,
657+
})
658+
g.Expect(secret.Finalizers).NotTo(
659+
ContainElement(octavia.ACConsumerFinalizer))
660+
}, timeout, interval).Should(Succeed())
661+
662+
Eventually(func(g Gomega) {
663+
o := GetOctaviaAPI(octaviaAPIName)
664+
g.Expect(o.Status.ApplicationCredentialSecret).To(Equal(newACSecretName))
665+
}, timeout, interval).Should(Succeed())
666+
})
667+
668+
It("should remove the consumer finalizer from AC secret on CR deletion", func() {
669+
Eventually(func(g Gomega) {
670+
secret := th.GetSecret(types.NamespacedName{
671+
Namespace: namespace,
672+
Name: acSecretName,
673+
})
674+
g.Expect(secret.Finalizers).To(
675+
ContainElement(octavia.ACConsumerFinalizer))
676+
}, timeout, interval).Should(Succeed())
677+
678+
th.DeleteInstance(GetOctaviaAPI(octaviaAPIName))
679+
680+
secret := th.GetSecret(types.NamespacedName{
681+
Namespace: namespace,
682+
Name: acSecretName,
683+
})
684+
Expect(secret.Finalizers).NotTo(
685+
ContainElement(octavia.ACConsumerFinalizer))
686+
})
687+
})
506688
})

0 commit comments

Comments
 (0)