Skip to content

Commit 596e207

Browse files
committed
Removing galera and rabbitmq from CR after their oscp removal
Adds tests to verify galera and rabiitmq cleanup by ownership Adds tests for cert verification and cleanup Resolves: #OSPRH-8059 Resolves: #OSPRH-8061
1 parent c4c78a5 commit 596e207

File tree

5 files changed

+416
-14
lines changed

5 files changed

+416
-14
lines changed

pkg/openstack/common.go

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -795,3 +795,23 @@ func hasCertInOverrideSpec(overrideSpec route.OverrideSpec) bool {
795795
overrideSpec.Spec.TLS.Certificate != "" &&
796796
overrideSpec.Spec.TLS.Key != ""
797797
}
798+
799+
func DeleteCertificate(
800+
ctx context.Context,
801+
helper *helper.Helper,
802+
namespace string,
803+
certName string) error {
804+
805+
cert := certmanager.NewCertificate(
806+
&certmgrv1.Certificate{
807+
ObjectMeta: metav1.ObjectMeta{
808+
Name: certName,
809+
Namespace: namespace,
810+
},
811+
},
812+
5*time.Second,
813+
)
814+
815+
helper.GetLogger().Info(fmt.Sprintf("Deleting cert %s", certName))
816+
return cert.Delete(ctx, helper)
817+
}

pkg/openstack/galera.go

Lines changed: 69 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package openstack
22

33
import (
44
"context"
5+
"errors"
56
"fmt"
67
"strings"
78

@@ -10,8 +11,10 @@ import (
1011
"github.com/openstack-k8s-operators/lib-common/modules/common/clusterdns"
1112
"github.com/openstack-k8s-operators/lib-common/modules/common/condition"
1213
"github.com/openstack-k8s-operators/lib-common/modules/common/helper"
14+
"github.com/openstack-k8s-operators/lib-common/modules/common/object"
1315
mariadbv1 "github.com/openstack-k8s-operators/mariadb-operator/api/v1beta1"
1416

17+
"sigs.k8s.io/controller-runtime/pkg/client"
1518
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
1619

1720
corev1beta1 "github.com/openstack-k8s-operators/openstack-operator/apis/core/v1beta1"
@@ -28,14 +31,61 @@ const (
2831
galeraReady galeraStatus = iota
2932
)
3033

34+
func deleteUndefinedGaleras(
35+
ctx context.Context,
36+
instance *corev1beta1.OpenStackControlPlane,
37+
helper *helper.Helper,
38+
) (ctrl.Result, error) {
39+
40+
log := GetLogger(ctx)
41+
// Fetch the list of Galera objects
42+
galeraList := &mariadbv1.GaleraList{}
43+
listOpts := []client.ListOption{
44+
client.InNamespace(instance.GetNamespace()),
45+
}
46+
err := helper.GetClient().List(ctx, galeraList, listOpts...)
47+
if err != nil {
48+
return ctrl.Result{}, fmt.Errorf("could not get galeras %w", err)
49+
}
50+
51+
var delErrs []error
52+
for _, galeraObj := range galeraList.Items {
53+
// if it is not defined in the OpenStackControlPlane then delete it from k8s.
54+
if _, exists := (*instance.Spec.Galera.Templates)[galeraObj.Name]; !exists {
55+
if object.CheckOwnerRefExist(instance.GetUID(), galeraObj.OwnerReferences) {
56+
log.Info("Deleting Galera", "", galeraObj.Name)
57+
58+
certName := fmt.Sprintf("galera-%s-svc", galeraObj.Name)
59+
err = DeleteCertificate(ctx, helper, instance.Namespace, certName)
60+
if err != nil {
61+
delErrs = append(delErrs, fmt.Errorf("galera cert deletion for '%s' failed, because: %w", certName, err))
62+
continue
63+
}
64+
65+
if _, err := EnsureDeleted(ctx, helper, &galeraObj); err != nil {
66+
delErrs = append(delErrs, fmt.Errorf("galera deletion for '%s' failed, because: %w", galeraObj.Name, err))
67+
}
68+
69+
}
70+
}
71+
}
72+
73+
if len(delErrs) > 0 {
74+
delErrs := errors.Join(delErrs...)
75+
return ctrl.Result{}, delErrs
76+
}
77+
78+
return ctrl.Result{}, nil
79+
}
80+
3181
// ReconcileGaleras -
3282
func ReconcileGaleras(
3383
ctx context.Context,
3484
instance *corev1beta1.OpenStackControlPlane,
3585
version *corev1beta1.OpenStackVersion,
3686
helper *helper.Helper,
3787
) (ctrl.Result, error) {
38-
Log := GetLogger(ctx)
88+
log := GetLogger(ctx)
3989
if !instance.Spec.Galera.Enabled {
4090
return ctrl.Result{}, nil
4191
}
@@ -127,20 +177,31 @@ func ReconcileGaleras(
127177
return ctrl.Result{}, fmt.Errorf(errors)
128178

129179
} else if len(inprogress) > 0 {
130-
Log.Info("Galera in progress")
180+
log.Info("Galera in progress")
131181
instance.Status.Conditions.Set(condition.FalseCondition(
132182
corev1beta1.OpenStackControlPlaneMariaDBReadyCondition,
133183
condition.RequestedReason,
134184
condition.SeverityInfo,
135185
corev1beta1.OpenStackControlPlaneMariaDBReadyRunningMessage))
136186
} else {
137-
Log.Info("Galera ready condition is true")
187+
log.Info("Galera ready condition is true")
138188
instance.Status.Conditions.MarkTrue(
139189
corev1beta1.OpenStackControlPlaneMariaDBReadyCondition,
140190
corev1beta1.OpenStackControlPlaneMariaDBReadyMessage,
141191
)
142192
}
143193

194+
_, errs := deleteUndefinedGaleras(ctx, instance, helper)
195+
if errs != nil {
196+
instance.Status.Conditions.Set(condition.FalseCondition(
197+
corev1beta1.OpenStackControlPlaneMariaDBReadyCondition,
198+
condition.ErrorReason,
199+
condition.SeverityWarning,
200+
corev1beta1.OpenStackControlPlaneMariaDBReadyErrorMessage,
201+
errs))
202+
return ctrl.Result{}, errs
203+
}
204+
144205
return ctrl.Result{}, nil
145206
}
146207

@@ -159,7 +220,7 @@ func reconcileGalera(
159220
Namespace: instance.Namespace,
160221
},
161222
}
162-
Log := GetLogger(ctx)
223+
log := GetLogger(ctx)
163224

164225
if !instance.Spec.Galera.Enabled {
165226
if _, err := EnsureDeleted(ctx, helper, galera); err != nil {
@@ -182,7 +243,7 @@ func reconcileGalera(
182243
spec.TopologyRef = instance.Spec.TopologyRef
183244
}
184245

185-
Log.Info("Reconciling Galera", "Galera.Namespace", instance.Namespace, "Galera.Name", name)
246+
log.Info("Reconciling Galera", "Galera.Namespace", instance.Namespace, "Galera.Name", name)
186247
op, err := controllerutil.CreateOrPatch(ctx, helper.GetClient(), galera, func() error {
187248
spec.DeepCopyInto(&galera.Spec.GaleraSpecCore)
188249
galera.Spec.ContainerImage = *version.Status.ContainerImages.MariadbImage
@@ -198,7 +259,7 @@ func reconcileGalera(
198259
return galeraFailed, err
199260
}
200261
if op != controllerutil.OperationResultNone {
201-
Log.Info(fmt.Sprintf("Galera %s - %s", galera.Name, op))
262+
log.Info(fmt.Sprintf("Galera %s - %s", galera.Name, op))
202263
}
203264

204265
if galera.Status.ObservedGeneration == galera.Generation && galera.IsReady() {
@@ -211,10 +272,10 @@ func reconcileGalera(
211272

212273
// GaleraImageMatch - return true if the Galera images match on the ControlPlane and Version, or if Galera is not enabled
213274
func GaleraImageMatch(ctx context.Context, controlPlane *corev1beta1.OpenStackControlPlane, version *corev1beta1.OpenStackVersion) bool {
214-
Log := GetLogger(ctx)
275+
log := GetLogger(ctx)
215276
if controlPlane.Spec.Galera.Enabled {
216277
if !stringPointersEqual(controlPlane.Status.ContainerImages.MariadbImage, version.Status.ContainerImages.MariadbImage) {
217-
Log.Info("Galera images do not match", "controlPlane.Status.ContainerImages.MariadbImage", controlPlane.Status.ContainerImages.MariadbImage, "version.Status.ContainerImages.MariadbImage", version.Status.ContainerImages.MariadbImage)
278+
log.Info("Galera images do not match", "controlPlane.Status.ContainerImages.MariadbImage", controlPlane.Status.ContainerImages.MariadbImage, "version.Status.ContainerImages.MariadbImage", version.Status.ContainerImages.MariadbImage)
218279
return false
219280
}
220281
}

pkg/openstack/rabbitmq.go

Lines changed: 66 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package openstack
22

33
import (
44
"context"
5+
"errors"
56
"fmt"
67
"strings"
78

@@ -11,11 +12,13 @@ import (
1112
"github.com/openstack-k8s-operators/lib-common/modules/common/clusterdns"
1213
condition "github.com/openstack-k8s-operators/lib-common/modules/common/condition"
1314
"github.com/openstack-k8s-operators/lib-common/modules/common/helper"
15+
"github.com/openstack-k8s-operators/lib-common/modules/common/object"
1416

1517
// Cannot use the following import due to linting error:
1618
// Error: pkg/openstack/rabbitmq.go:10:2: use of internal package github.com/rabbitmq/cluster-operator/internal/status not allowed
1719
//rabbitstatus "github.com/rabbitmq/cluster-operator/internal/status"
1820

21+
"sigs.k8s.io/controller-runtime/pkg/client"
1922
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
2023

2124
corev1beta1 "github.com/openstack-k8s-operators/openstack-operator/apis/core/v1beta1"
@@ -38,6 +41,52 @@ const (
3841
mqReady mqStatus = iota
3942
)
4043

44+
func deleteUndefinedRabbitMQs(
45+
ctx context.Context,
46+
instance *corev1beta1.OpenStackControlPlane,
47+
helper *helper.Helper,
48+
) (ctrl.Result, error) {
49+
50+
log := GetLogger(ctx)
51+
// Fetch the list of RabbitMQ objects
52+
rabbitList := &rabbitmqv1.RabbitMqList{}
53+
listOpts := []client.ListOption{
54+
client.InNamespace(instance.GetNamespace()),
55+
}
56+
err := helper.GetClient().List(ctx, rabbitList, listOpts...)
57+
if err != nil {
58+
return ctrl.Result{}, fmt.Errorf("could not list rabbitmqs %w", err)
59+
}
60+
61+
var delErrs []error
62+
for _, rabbitObj := range rabbitList.Items {
63+
// if it is not defined in the OpenStackControlPlane then delete it from k8s.
64+
if _, exists := (*instance.Spec.Rabbitmq.Templates)[rabbitObj.Name]; !exists {
65+
if object.CheckOwnerRefExist(instance.GetUID(), rabbitObj.OwnerReferences) {
66+
log.Info("Deleting Rabbitmq", "", rabbitObj.Name)
67+
68+
certName := fmt.Sprintf("%s-svc", rabbitObj.Name)
69+
err = DeleteCertificate(ctx, helper, instance.Namespace, certName)
70+
if err != nil {
71+
delErrs = append(delErrs, fmt.Errorf("rabbit cert deletion for '%s' failed, because: %w", certName, err))
72+
continue
73+
}
74+
75+
if _, err := EnsureDeleted(ctx, helper, &rabbitObj); err != nil {
76+
delErrs = append(delErrs, fmt.Errorf("rabbitmq deletion for '%s' failed, because: %w", rabbitObj.Name, err))
77+
}
78+
}
79+
}
80+
}
81+
82+
if len(delErrs) > 0 {
83+
delErrs := errors.Join(delErrs...)
84+
return ctrl.Result{}, delErrs
85+
}
86+
87+
return ctrl.Result{}, nil
88+
}
89+
4190
// ReconcileRabbitMQs -
4291
func ReconcileRabbitMQs(
4392
ctx context.Context,
@@ -94,6 +143,17 @@ func ReconcileRabbitMQs(
94143
)
95144
}
96145

146+
_, errs := deleteUndefinedRabbitMQs(ctx, instance, helper)
147+
if errs != nil {
148+
instance.Status.Conditions.Set(condition.FalseCondition(
149+
corev1beta1.OpenStackControlPlaneRabbitMQReadyCondition,
150+
condition.ErrorReason,
151+
condition.SeverityWarning,
152+
corev1beta1.OpenStackControlPlaneRabbitMQReadyErrorMessage,
153+
errs))
154+
return ctrl.Result{}, errs
155+
}
156+
97157
return ctrlResult, nil
98158
}
99159

@@ -111,9 +171,9 @@ func reconcileRabbitMQ(
111171
Namespace: instance.Namespace,
112172
},
113173
}
114-
Log := GetLogger(ctx)
174+
log := GetLogger(ctx)
115175

116-
Log.Info("Reconciling RabbitMQ", "RabbitMQ.Namespace", instance.Namespace, "RabbitMQ.Name", name)
176+
log.Info("Reconciling RabbitMQ", "RabbitMQ.Namespace", instance.Namespace, "RabbitMQ.Name", name)
117177
if !instance.Spec.Rabbitmq.Enabled {
118178
if _, err := EnsureDeleted(ctx, helper, rabbitmq); err != nil {
119179
return mqFailed, ctrl.Result{}, err
@@ -199,7 +259,7 @@ func reconcileRabbitMQ(
199259
op, err := controllerutil.CreateOrPatch(ctx, helper.GetClient(), rabbitmq, func() error {
200260
spec.DeepCopyInto(&rabbitmq.Spec.RabbitMqSpecCore)
201261
if rabbitmq.Spec.Persistence.StorageClassName == nil {
202-
Log.Info(fmt.Sprintf("Setting StorageClassName: " + instance.Spec.StorageClass))
262+
log.Info(fmt.Sprintf("Setting StorageClassName: " + instance.Spec.StorageClass))
203263
rabbitmq.Spec.Persistence.StorageClassName = &instance.Spec.StorageClass
204264
}
205265
if tlsCert != "" {
@@ -221,7 +281,7 @@ func reconcileRabbitMQ(
221281
return mqFailed, ctrl.Result{}, err
222282
}
223283
if op != controllerutil.OperationResultNone {
224-
Log.Info(fmt.Sprintf("RabbitMQ %s - %s", rabbitmq.Name, op))
284+
log.Info(fmt.Sprintf("RabbitMQ %s - %s", rabbitmq.Name, op))
225285
}
226286

227287
if rabbitmq.Status.ObservedGeneration == rabbitmq.Generation && rabbitmq.IsReady() {
@@ -288,10 +348,10 @@ func removeConfigMapControllerReference(
288348

289349
// RabbitmqImageMatch - return true if the rabbitmq images match on the ControlPlane and Version, or if Rabbitmq is not enabled
290350
func RabbitmqImageMatch(ctx context.Context, controlPlane *corev1beta1.OpenStackControlPlane, version *corev1beta1.OpenStackVersion) bool {
291-
Log := GetLogger(ctx)
351+
log := GetLogger(ctx)
292352
if controlPlane.Spec.Rabbitmq.Enabled {
293353
if !stringPointersEqual(controlPlane.Status.ContainerImages.RabbitmqImage, version.Status.ContainerImages.RabbitmqImage) {
294-
Log.Info("RabbitMQ image mismatch", "controlPlane.Status.ContainerImages.RabbitmqImage", controlPlane.Status.ContainerImages.RabbitmqImage, "version.Status.ContainerImages.RabbitmqImage", version.Status.ContainerImages.RabbitmqImage)
354+
log.Info("RabbitMQ image mismatch", "controlPlane.Status.ContainerImages.RabbitmqImage", controlPlane.Status.ContainerImages.RabbitmqImage, "version.Status.ContainerImages.RabbitmqImage", version.Status.ContainerImages.RabbitmqImage)
295355
return false
296356
}
297357
}

tests/functional/ctlplane/base_test.go

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import (
2020
"context"
2121
"encoding/base64"
2222

23+
"github.com/google/uuid"
2324
. "github.com/onsi/gomega" //revive:disable:dot-imports
2425

2526
k8s_corev1 "k8s.io/api/core/v1"
@@ -420,6 +421,56 @@ func GetTLSeCustomIssuerSpec() map[string]interface{} {
420421
}
421422
}
422423

424+
func GetDefaultGaleraSpec() map[string]interface{} {
425+
return map[string]interface{}{
426+
"replicas": 1,
427+
"logToDisk": false,
428+
"secret": "osp-secret",
429+
"storageClass": "local-storage",
430+
"storageRequest": "100M",
431+
"containerImage": "",
432+
}
433+
}
434+
435+
func CreateGaleraConfig(namespace string, spec map[string]interface{}) client.Object {
436+
name := uuid.New().String()
437+
438+
raw := map[string]interface{}{
439+
"apiVersion": "mariadb.openstack.org/v1beta1",
440+
"kind": "Galera",
441+
"metadata": map[string]interface{}{
442+
"name": name,
443+
"namespace": namespace,
444+
},
445+
"spec": spec,
446+
}
447+
448+
return th.CreateUnstructured(raw)
449+
}
450+
451+
func GetDefaultRabbitMQSpec() map[string]interface{} {
452+
return map[string]interface{}{
453+
"replicas": 1,
454+
"containerImage": "",
455+
}
456+
}
457+
458+
func CreateRabbitMQConfig(namespace string, spec map[string]interface{}) client.Object {
459+
name := uuid.New().String()
460+
461+
raw := map[string]interface{}{
462+
"apiVersion": "rabbitmq.openstack.org/v1beta1",
463+
"kind": "RabbitMq",
464+
"metadata": map[string]interface{}{
465+
"name": name,
466+
"namespace": namespace,
467+
},
468+
"spec": spec,
469+
}
470+
471+
return th.CreateUnstructured(raw)
472+
}
473+
423474
func GetDefaultOpenStackControlPlaneSpec() map[string]interface{} {
424475
memcachedTemplate := map[string]interface{}{
425476
"memcached": map[string]interface{}{

0 commit comments

Comments
 (0)