Skip to content

Commit dfb1823

Browse files
Merge pull request #280 from lmiccini/quorum2
Use quorum queues if enabled
2 parents 483c9ae + b917e41 commit dfb1823

File tree

10 files changed

+165
-14
lines changed

10 files changed

+165
-14
lines changed

api/go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ go 1.21
55
require (
66
github.com/onsi/ginkgo/v2 v2.20.1
77
github.com/onsi/gomega v1.34.1
8-
github.com/openstack-k8s-operators/infra-operator/apis v0.6.1-0.20250821143610-c8ef7b9a21ec
8+
github.com/openstack-k8s-operators/infra-operator/apis v0.6.1-0.20250909143828-e33d35ffd64f
99
github.com/openstack-k8s-operators/lib-common/modules/common v0.6.1-0.20250730071847-837b07f8d72f
1010
k8s.io/api v0.29.15
1111
k8s.io/apimachinery v0.29.15

api/go.sum

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,8 +72,8 @@ github.com/onsi/ginkgo/v2 v2.20.1 h1:YlVIbqct+ZmnEph770q9Q7NVAz4wwIiVNahee6JyUzo
7272
github.com/onsi/ginkgo/v2 v2.20.1/go.mod h1:lG9ey2Z29hR41WMVthyJBGUBcBhGOtoPF2VFMvBXFCI=
7373
github.com/onsi/gomega v1.34.1 h1:EUMJIKUjM8sKjYbtxQI9A4z2o+rruxnzNvpknOXie6k=
7474
github.com/onsi/gomega v1.34.1/go.mod h1:kU1QgUvBDLXBJq618Xvm2LUX6rSAfRaFRTcdOeDLwwY=
75-
github.com/openstack-k8s-operators/infra-operator/apis v0.6.1-0.20250821143610-c8ef7b9a21ec h1:Jvz2BuTWCvjeCbDzpPzlPMrUQpEe04Rzi8LPNxeW0Ts=
76-
github.com/openstack-k8s-operators/infra-operator/apis v0.6.1-0.20250821143610-c8ef7b9a21ec/go.mod h1:Dv8qpmBIQy3Jv/EyQnOyc0w61X8vyfxpjcIQONP5CwY=
75+
github.com/openstack-k8s-operators/infra-operator/apis v0.6.1-0.20250909143828-e33d35ffd64f h1:chuu4iBT5sXHYw8aPeP/pWC+S3yGo6hdy39foP7c5vs=
76+
github.com/openstack-k8s-operators/infra-operator/apis v0.6.1-0.20250909143828-e33d35ffd64f/go.mod h1:Dv8qpmBIQy3Jv/EyQnOyc0w61X8vyfxpjcIQONP5CwY=
7777
github.com/openstack-k8s-operators/lib-common/modules/common v0.6.1-0.20250730071847-837b07f8d72f h1:DW8aNjEtDFrWiZ6vWuOXwdRB4eBD0n+bA9foQkOEx6U=
7878
github.com/openstack-k8s-operators/lib-common/modules/common v0.6.1-0.20250730071847-837b07f8d72f/go.mod h1:P+7F1wiwZUxOy4myYXFyc/uBtGATDFpk3yAllXe1Vzk=
7979
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=

controllers/barbican_controller.go

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -550,14 +550,15 @@ func (r *BarbicanReconciler) reconcileDelete(ctx context.Context, instance *barb
550550

551551
// fields to index to reconcile when change
552552
const (
553-
passwordSecretField = ".spec.secret"
554-
caBundleSecretNameField = ".spec.tls.caBundleSecretName"
555-
tlsAPIInternalField = ".spec.tls.api.internal.secretName"
556-
tlsAPIPublicField = ".spec.tls.api.public.secretName"
557-
pkcs11LoginSecretField = ".spec.pkcs11.loginSecret"
558-
pkcs11ClientDataSecretField = ".spec.pkcs11.clientDataSecret"
559-
topologyField = ".spec.topologyRef.Name"
560-
customServiceConfigSecretsField = ".spec.customServiceConfigSecrets"
553+
passwordSecretField = ".spec.secret"
554+
caBundleSecretNameField = ".spec.tls.caBundleSecretName"
555+
tlsAPIInternalField = ".spec.tls.api.internal.secretName"
556+
tlsAPIPublicField = ".spec.tls.api.public.secretName"
557+
pkcs11LoginSecretField = ".spec.pkcs11.loginSecret"
558+
pkcs11ClientDataSecretField = ".spec.pkcs11.clientDataSecret"
559+
topologyField = ".spec.topologyRef.Name"
560+
customServiceConfigSecretsField = ".spec.customServiceConfigSecrets"
561+
parentBarbicanConfigDataSecretField = ".status.parentBarbicanConfigDataSecret"
561562
)
562563

563564
var (
@@ -568,6 +569,7 @@ var (
568569
pkcs11ClientDataSecretField,
569570
topologyField,
570571
customServiceConfigSecretsField,
572+
parentBarbicanConfigDataSecretField,
571573
}
572574
apiWatchFields = []string{
573575
passwordSecretField,
@@ -578,12 +580,14 @@ var (
578580
pkcs11ClientDataSecretField,
579581
topologyField,
580582
customServiceConfigSecretsField,
583+
parentBarbicanConfigDataSecretField,
581584
}
582585
listenerWatchFields = []string{
583586
passwordSecretField,
584587
caBundleSecretNameField,
585588
topologyField,
586589
customServiceConfigSecretsField,
590+
parentBarbicanConfigDataSecretField,
587591
}
588592
)
589593

@@ -709,6 +713,9 @@ func (r *BarbicanReconciler) generateServiceConfig(
709713
// This gets overridden in the PKCS11 section below if needed.
710714
templateParameters["PKCS11ClientDataPath"] = barbicanv1beta1.DefaultPKCS11ClientDataPath
711715

716+
// Set transportURL quorum queues
717+
templateParameters["QuorumQueues"] = string(transportURLSecret.Data["quorumqueues"]) == "true"
718+
712719
// Set secret store parameters
713720
secretStoreTemplateMap, err := GenerateSecretStoreTemplateMap(
714721
instance.Spec.EnabledSecretStores,

controllers/barbicanapi_controller.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -994,6 +994,19 @@ func (r *BarbicanAPIReconciler) SetupWithManager(mgr ctrl.Manager) error {
994994
return err
995995
}
996996

997+
// index parentBarbicanConfigDataSecretField
998+
if err := mgr.GetFieldIndexer().IndexField(context.Background(), &barbicanv1beta1.BarbicanAPI{}, parentBarbicanConfigDataSecretField, func(rawObj client.Object) []string {
999+
// Extract the parent barbican config-data secret name
1000+
cr := rawObj.(*barbicanv1beta1.BarbicanAPI)
1001+
owner := barbican.GetOwningBarbicanName(cr)
1002+
if owner == "" {
1003+
return nil
1004+
}
1005+
return []string{owner + "-config-data"}
1006+
}); err != nil {
1007+
return err
1008+
}
1009+
9971010
return ctrl.NewControllerManagedBy(mgr).
9981011
For(&barbicanv1beta1.BarbicanAPI{}).
9991012
Owns(&corev1.Service{}).

controllers/barbicankeystonelistener_controller.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -704,6 +704,19 @@ func (r *BarbicanKeystoneListenerReconciler) SetupWithManager(mgr ctrl.Manager)
704704
return err
705705
}
706706

707+
// index parentBarbicanConfigDataSecretField
708+
if err := mgr.GetFieldIndexer().IndexField(context.Background(), &barbicanv1beta1.BarbicanKeystoneListener{}, parentBarbicanConfigDataSecretField, func(rawObj client.Object) []string {
709+
// Extract the parent barbican config-data secret name
710+
cr := rawObj.(*barbicanv1beta1.BarbicanKeystoneListener)
711+
owner := barbican.GetOwningBarbicanName(cr)
712+
if owner == "" {
713+
return nil
714+
}
715+
return []string{owner + "-config-data"}
716+
}); err != nil {
717+
return err
718+
}
719+
707720
return ctrl.NewControllerManagedBy(mgr).
708721
For(&barbicanv1beta1.BarbicanKeystoneListener{}).
709722
// Owns(&corev1.Service{}).

controllers/barbicanworker_controller.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -726,6 +726,19 @@ func (r *BarbicanWorkerReconciler) SetupWithManager(mgr ctrl.Manager) error {
726726
return err
727727
}
728728

729+
// index parentBarbicanConfigDataSecretField
730+
if err := mgr.GetFieldIndexer().IndexField(context.Background(), &barbicanv1beta1.BarbicanWorker{}, parentBarbicanConfigDataSecretField, func(rawObj client.Object) []string {
731+
// Extract the parent barbican config-data secret name
732+
cr := rawObj.(*barbicanv1beta1.BarbicanWorker)
733+
owner := barbican.GetOwningBarbicanName(cr)
734+
if owner == "" {
735+
return nil
736+
}
737+
return []string{owner + "-config-data"}
738+
}); err != nil {
739+
return err
740+
}
741+
729742
return ctrl.NewControllerManagedBy(mgr).
730743
For(&barbicanv1beta1.BarbicanWorker{}).
731744
// Owns(&corev1.Service{}).

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ require (
99
github.com/onsi/ginkgo/v2 v2.20.1
1010
github.com/onsi/gomega v1.34.1
1111
github.com/openstack-k8s-operators/barbican-operator/api v0.0.0-00010101000000-000000000000
12-
github.com/openstack-k8s-operators/infra-operator/apis v0.6.1-0.20250821143610-c8ef7b9a21ec
12+
github.com/openstack-k8s-operators/infra-operator/apis v0.6.1-0.20250909143828-e33d35ffd64f
1313
github.com/openstack-k8s-operators/keystone-operator/api v0.6.1-0.20250818180001-057253e3d233
1414
github.com/openstack-k8s-operators/lib-common/modules/common v0.6.1-0.20250730071847-837b07f8d72f
1515
github.com/openstack-k8s-operators/lib-common/modules/storage v0.6.1-0.20250730071847-837b07f8d72f

go.sum

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,8 +78,8 @@ github.com/onsi/gomega v1.34.1 h1:EUMJIKUjM8sKjYbtxQI9A4z2o+rruxnzNvpknOXie6k=
7878
github.com/onsi/gomega v1.34.1/go.mod h1:kU1QgUvBDLXBJq618Xvm2LUX6rSAfRaFRTcdOeDLwwY=
7979
github.com/openshift/api v0.0.0-20240830023148-b7d0481c9094 h1:J1wuGhVxpsHykZBa6Beb1gQ96Ptej9AE/BvwCBiRj1E=
8080
github.com/openshift/api v0.0.0-20240830023148-b7d0481c9094/go.mod h1:CxgbWAlvu2iQB0UmKTtRu1YfepRg1/vJ64n2DlIEVz4=
81-
github.com/openstack-k8s-operators/infra-operator/apis v0.6.1-0.20250821143610-c8ef7b9a21ec h1:Jvz2BuTWCvjeCbDzpPzlPMrUQpEe04Rzi8LPNxeW0Ts=
82-
github.com/openstack-k8s-operators/infra-operator/apis v0.6.1-0.20250821143610-c8ef7b9a21ec/go.mod h1:Dv8qpmBIQy3Jv/EyQnOyc0w61X8vyfxpjcIQONP5CwY=
81+
github.com/openstack-k8s-operators/infra-operator/apis v0.6.1-0.20250909143828-e33d35ffd64f h1:chuu4iBT5sXHYw8aPeP/pWC+S3yGo6hdy39foP7c5vs=
82+
github.com/openstack-k8s-operators/infra-operator/apis v0.6.1-0.20250909143828-e33d35ffd64f/go.mod h1:Dv8qpmBIQy3Jv/EyQnOyc0w61X8vyfxpjcIQONP5CwY=
8383
github.com/openstack-k8s-operators/keystone-operator/api v0.6.1-0.20250818180001-057253e3d233 h1:1Kuny36wIpijE4RsFu8e+b0uUK8Gh0PgvlEVOOhG+uo=
8484
github.com/openstack-k8s-operators/keystone-operator/api v0.6.1-0.20250818180001-057253e3d233/go.mod h1:qevkmDP/Yr7FTM0ZVe2fABjSjrfkkdZkYeMho71OVG0=
8585
github.com/openstack-k8s-operators/lib-common/modules/common v0.6.1-0.20250730071847-837b07f8d72f h1:DW8aNjEtDFrWiZ6vWuOXwdRB4eBD0n+bA9foQkOEx6U=

templates/barbican/config/00-default.conf

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,12 @@ interface = internal
2525

2626
[oslo_messaging_notifications]
2727
driver=messagingv2
28+
{{ if (index . "QuorumQueues") -}}
29+
[oslo_messaging_rabbit]
30+
rabbit_quorum_queue=true
31+
rabbit_transient_quorum_queue=true
32+
amqp_durable_queues=true
33+
{{- end }}
2834

2935
{{- if (index . "EnableSecureRBAC") }}
3036
[oslo_policy]

tests/functional/barbican_controller_test.go

Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -859,6 +859,105 @@ var _ = Describe("Barbican controller", func() {
859859
})
860860
})
861861

862+
When("A Barbican with quorum queues is created", func() {
863+
BeforeEach(func() {
864+
DeferCleanup(k8sClient.Delete, ctx, infra.CreateTransportURLSecret(barbicanTest.Instance.Namespace, "rabbitmq-secret", true))
865+
DeferCleanup(th.DeleteInstance, CreateBarbican(barbicanTest.Instance, GetDefaultBarbicanSpec()))
866+
DeferCleanup(k8sClient.Delete, ctx, CreateBarbicanSecret(barbicanTest.Instance.Namespace, SecretName))
867+
868+
DeferCleanup(
869+
mariadb.DeleteDBService,
870+
mariadb.CreateDBService(
871+
barbicanTest.Instance.Namespace,
872+
GetBarbican(barbicanTest.Instance).Spec.DatabaseInstance,
873+
corev1.ServiceSpec{
874+
Ports: []corev1.ServicePort{{Port: 3306}},
875+
},
876+
),
877+
)
878+
infra.SimulateTransportURLReady(barbicanTest.BarbicanTransportURL)
879+
DeferCleanup(keystone.DeleteKeystoneAPI, keystone.CreateKeystoneAPI(barbicanTest.Instance.Namespace))
880+
mariadb.SimulateMariaDBAccountCompleted(barbicanTest.BarbicanDatabaseAccount)
881+
mariadb.SimulateMariaDBDatabaseCompleted(barbicanTest.BarbicanDatabaseName)
882+
th.SimulateJobSuccess(barbicanTest.BarbicanDBSync)
883+
})
884+
885+
It("should configure quorum queues when enabled", func() {
886+
cf := th.GetSecret(barbicanTest.BarbicanConfigSecret)
887+
Expect(cf).ShouldNot(BeNil())
888+
conf := string(cf.Data["00-default.conf"])
889+
Expect(conf).To(ContainSubstring("rabbit_quorum_queue=true"))
890+
Expect(conf).To(ContainSubstring("rabbit_transient_quorum_queue=true"))
891+
Expect(conf).To(ContainSubstring("amqp_durable_queues=true"))
892+
Expect(conf).To(ContainSubstring("[oslo_messaging_rabbit]"))
893+
})
894+
})
895+
896+
When("A Barbican starts with quorum queues disabled and then enables them", func() {
897+
BeforeEach(func() {
898+
DeferCleanup(k8sClient.Delete, ctx, CreateBarbicanMessageBusSecret(barbicanTest.Instance.Namespace, "rabbitmq-secret"))
899+
DeferCleanup(th.DeleteInstance, CreateBarbican(barbicanTest.Instance, GetDefaultBarbicanSpec()))
900+
DeferCleanup(k8sClient.Delete, ctx, CreateBarbicanSecret(barbicanTest.Instance.Namespace, SecretName))
901+
902+
DeferCleanup(
903+
mariadb.DeleteDBService,
904+
mariadb.CreateDBService(
905+
barbicanTest.Instance.Namespace,
906+
GetBarbican(barbicanTest.Instance).Spec.DatabaseInstance,
907+
corev1.ServiceSpec{
908+
Ports: []corev1.ServicePort{{Port: 3306}},
909+
},
910+
),
911+
)
912+
infra.SimulateTransportURLReady(barbicanTest.BarbicanTransportURL)
913+
DeferCleanup(keystone.DeleteKeystoneAPI, keystone.CreateKeystoneAPI(barbicanTest.Instance.Namespace))
914+
mariadb.SimulateMariaDBAccountCompleted(barbicanTest.BarbicanDatabaseAccount)
915+
mariadb.SimulateMariaDBDatabaseCompleted(barbicanTest.BarbicanDatabaseName)
916+
th.SimulateJobSuccess(barbicanTest.BarbicanDBSync)
917+
})
918+
919+
It("should initially configure without quorum queues", func() {
920+
cf := th.GetSecret(barbicanTest.BarbicanConfigSecret)
921+
Expect(cf).ShouldNot(BeNil())
922+
conf := string(cf.Data["00-default.conf"])
923+
Expect(conf).ToNot(ContainSubstring("rabbit_quorum_queue=true"))
924+
Expect(conf).ToNot(ContainSubstring("rabbit_transient_quorum_queue=true"))
925+
Expect(conf).ToNot(ContainSubstring("amqp_durable_queues=true"))
926+
Expect(conf).ToNot(ContainSubstring("[oslo_messaging_rabbit]"))
927+
})
928+
929+
It("should configure quorum queues when enabled dynamically", func() {
930+
// Initially verify quorum queues are disabled
931+
cf := th.GetSecret(barbicanTest.BarbicanConfigSecret)
932+
Expect(cf).ShouldNot(BeNil())
933+
conf := string(cf.Data["00-default.conf"])
934+
Expect(conf).ToNot(ContainSubstring("rabbit_quorum_queue=true"))
935+
936+
// Update the message bus secret to enable quorum queues
937+
messageBusSecretName := types.NamespacedName{
938+
Namespace: barbicanTest.Instance.Namespace,
939+
Name: "rabbitmq-secret",
940+
}
941+
messageBusSecret := th.GetSecret(messageBusSecretName)
942+
Expect(messageBusSecret).ShouldNot(BeNil())
943+
944+
// Add the quorumqueues field to enable them
945+
messageBusSecret.Data["quorumqueues"] = []byte("true")
946+
Expect(k8sClient.Update(ctx, &messageBusSecret)).Should(Succeed())
947+
948+
// Wait for the configuration to be updated
949+
Eventually(func(g Gomega) {
950+
cf := th.GetSecret(barbicanTest.BarbicanConfigSecret)
951+
g.Expect(cf).ShouldNot(BeNil())
952+
conf := string(cf.Data["00-default.conf"])
953+
g.Expect(conf).To(ContainSubstring("rabbit_quorum_queue=true"))
954+
g.Expect(conf).To(ContainSubstring("rabbit_transient_quorum_queue=true"))
955+
g.Expect(conf).To(ContainSubstring("amqp_durable_queues=true"))
956+
g.Expect(conf).To(ContainSubstring("[oslo_messaging_rabbit]"))
957+
}, timeout, interval).Should(Succeed())
958+
})
959+
})
960+
862961
When("A Barbican with pkcs11 plugin is created", func() {
863962
BeforeEach(func() {
864963
DeferCleanup(k8sClient.Delete, ctx, CreatePKCS11LoginSecret(barbicanTest.Instance.Namespace, PKCS11LoginSecret))

0 commit comments

Comments
 (0)