Skip to content

Commit 330f8ad

Browse files
Merge pull request #1351 from auniyal61/OSPRH-8061
Removing galera and rabbitmq from CR after their oscp removal
2 parents 48e6451 + 596e207 commit 330f8ad

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)