Skip to content

Commit 4724abe

Browse files
authored
Move default image configuration to operator pod environment variables (#867)
* Move default user updater image to CLI flag This follows the same path as #858, and allows for easier helm integration * Set the default image prior ot statefulset reconciliation * Move CLI flags to env vars instead
1 parent d3743d6 commit 4724abe

File tree

7 files changed

+62
-35
lines changed

7 files changed

+62
-35
lines changed

api/v1beta1/rabbitmqcluster_types.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,6 @@ type VaultSpec struct {
117117
// Sidecar container that updates the default user's password in RabbitMQ when it changes in Vault.
118118
// Additionally, it updates /var/lib/rabbitmq/.rabbitmqadmin.conf (used by rabbitmqadmin CLI).
119119
// Set to empty string to disable the sidecar container.
120-
// +kubebuilder:default:="rabbitmqoperator/default-user-credential-updater:1.0.0"
121120
DefaultUserUpdaterImage *string `json:"defaultUserUpdaterImage,omitempty"`
122121
TLS VaultTLSSpec `json:"tls,omitempty"`
123122
}
@@ -427,6 +426,10 @@ func (cluster *RabbitmqCluster) VaultEnabled() bool {
427426
return cluster.Spec.SecretBackend.Vault != nil
428427
}
429428

429+
func (cluster *RabbitmqCluster) UsesDefaultUserUpdaterImage() bool {
430+
return cluster.VaultEnabled() && cluster.Spec.SecretBackend.Vault.DefaultUserUpdaterImage == nil
431+
}
432+
430433
func (cluster *RabbitmqCluster) VaultDefaultUserSecretEnabled() bool {
431434
return cluster.VaultEnabled() && cluster.Spec.SecretBackend.Vault.DefaultUserSecretEnabled()
432435
}

api/v1beta1/rabbitmqcluster_types_test.go

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ package v1beta1
1111
import (
1212
. "github.com/onsi/ginkgo"
1313
. "github.com/onsi/gomega"
14-
. "github.com/onsi/gomega/gstruct"
1514
"github.com/rabbitmq/cluster-operator/internal/status"
1615
appsv1 "k8s.io/api/apps/v1"
1716
corev1 "k8s.io/api/core/v1"
@@ -389,10 +388,6 @@ var _ = Describe("RabbitmqCluster", func() {
389388
Expect(fetchedRabbit.Spec.SecretBackend.Vault.DefaultUserSecretEnabled()).To(BeTrue())
390389
Expect(fetchedRabbit.VaultTLSEnabled()).To(BeFalse())
391390
Expect(fetchedRabbit.Spec.SecretBackend.Vault.TLSEnabled()).To(BeFalse())
392-
393-
By("setting the default-user-credential-updater image by default")
394-
Expect(fetchedRabbit.Spec.SecretBackend.Vault.DefaultUserUpdaterImage).To(
395-
PointTo(HavePrefix("rabbitmqoperator/default-user-credential-updater:")))
396391
})
397392
})
398393
When("only TLS is configured", func() {

config/crd/bases/rabbitmq.com_rabbitmqclusters.yaml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3809,7 +3809,6 @@ spec:
38093809
description: Path in Vault to access a KV (Key-Value) secret with the fields username and password for the default user. For example "secret/data/rabbitmq/config".
38103810
type: string
38113811
defaultUserUpdaterImage:
3812-
default: rabbitmqoperator/default-user-credential-updater:1.0.0
38133812
description: Sidecar container that updates the default user's password in RabbitMQ when it changes in Vault. Additionally, it updates /var/lib/rabbitmq/.rabbitmqadmin.conf (used by rabbitmqadmin CLI). Set to empty string to disable the sidecar container.
38143813
type: string
38153814
role:

controllers/rabbitmqcluster_controller.go

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -57,13 +57,14 @@ const (
5757
// RabbitmqClusterReconciler reconciles a RabbitmqCluster object
5858
type RabbitmqClusterReconciler struct {
5959
client.Client
60-
Scheme *runtime.Scheme
61-
Namespace string
62-
Recorder record.EventRecorder
63-
ClusterConfig *rest.Config
64-
Clientset *kubernetes.Clientset
65-
PodExecutor PodExecutor
66-
DefaultRabbitmqImage string
60+
Scheme *runtime.Scheme
61+
Namespace string
62+
Recorder record.EventRecorder
63+
ClusterConfig *rest.Config
64+
Clientset *kubernetes.Clientset
65+
PodExecutor PodExecutor
66+
DefaultRabbitmqImage string
67+
DefaultUserUpdaterImage string
6768
}
6869

6970
// the rbac rule requires an empty row at the end to render
@@ -127,6 +128,19 @@ func (r *RabbitmqClusterReconciler) Reconcile(ctx context.Context, req ctrl.Requ
127128
}
128129
}
129130

131+
if rabbitmqCluster.UsesDefaultUserUpdaterImage() {
132+
rabbitmqCluster.Spec.SecretBackend.Vault.DefaultUserUpdaterImage = &r.DefaultUserUpdaterImage
133+
if err = r.Update(ctx, rabbitmqCluster); err != nil {
134+
if k8serrors.IsConflict(err) {
135+
logger.Info("failed to update image because of conflict; requeueing...",
136+
"namespace", rabbitmqCluster.Namespace,
137+
"name", rabbitmqCluster.Name)
138+
return ctrl.Result{RequeueAfter: 2 * time.Second}, nil
139+
}
140+
return ctrl.Result{}, err
141+
}
142+
}
143+
130144
// Ensure the resource have a deletion marker
131145
if err := r.addFinalizerIfNeeded(ctx, rabbitmqCluster); err != nil {
132146
return ctrl.Result{}, err

controllers/rabbitmqcluster_controller_test.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -221,11 +221,16 @@ var _ = Describe("RabbitmqClusterController", func() {
221221
Expect(client.Delete(ctx, cluster)).To(Succeed())
222222
})
223223

224-
It("does not expose DefaultUser or its Binding as status", func() {
224+
It("applies the Vault configuration", func() {
225+
By("not exposing DefaultUser or its Binding as status")
225226
Expect(cluster).NotTo(BeNil())
226227
Expect(cluster.Status).NotTo(BeNil())
227228
Expect(cluster.Status.DefaultUser).To(BeNil())
228229
Expect(cluster.Status.Binding).To(BeNil())
230+
By("setting the default user updater image to the controller default")
231+
fetchedCluster := &rabbitmqv1beta1.RabbitmqCluster{}
232+
Expect(client.Get(ctx, types.NamespacedName{Name: "rabbitmq-vault", Namespace: defaultNamespace}, fetchedCluster)).To(Succeed())
233+
Expect(fetchedCluster.Spec.SecretBackend.Vault.DefaultUserUpdaterImage).To(PointTo(Equal(defaultUserUpdaterImage)))
229234
})
230235
})
231236

controllers/suite_test.go

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,9 @@ import (
3434
)
3535

3636
const (
37-
controllerName = "rabbitmqcluster-controller"
38-
defaultRabbitmqImage = "default-rabbit-image:stable"
37+
controllerName = "rabbitmqcluster-controller"
38+
defaultRabbitmqImage = "default-rabbit-image:stable"
39+
defaultUserUpdaterImage = "default-UU-image:unstable"
3940
)
4041

4142
var (
@@ -85,13 +86,14 @@ var _ = BeforeSuite(func() {
8586

8687
fakeExecutor = &fakePodExecutor{}
8788
err = (&controllers.RabbitmqClusterReconciler{
88-
Client: mgr.GetClient(),
89-
Scheme: mgr.GetScheme(),
90-
Recorder: mgr.GetEventRecorderFor(controllerName),
91-
Namespace: "rabbitmq-system",
92-
Clientset: clientSet,
93-
PodExecutor: fakeExecutor,
94-
DefaultRabbitmqImage: defaultRabbitmqImage,
89+
Client: mgr.GetClient(),
90+
Scheme: mgr.GetScheme(),
91+
Recorder: mgr.GetEventRecorderFor(controllerName),
92+
Namespace: "rabbitmq-system",
93+
Clientset: clientSet,
94+
PodExecutor: fakeExecutor,
95+
DefaultRabbitmqImage: defaultRabbitmqImage,
96+
DefaultUserUpdaterImage: defaultUserUpdaterImage,
9597
}).SetupWithManager(mgr)
9698
Expect(err).ToNot(HaveOccurred())
9799

main.go

Lines changed: 20 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -44,12 +44,12 @@ func init() {
4444

4545
func main() {
4646
var (
47-
metricsAddr string
48-
defaultRabbitmqImage string
47+
metricsAddr string
48+
defaultRabbitmqImage = "rabbitmq:3.8.21-management"
49+
defaultUserUpdaterImage = "rabbitmqoperator/default-user-credential-updater:1.0.0"
4950
)
5051

5152
flag.StringVar(&metricsAddr, "metrics-bind-address", ":9782", "The address the metric endpoint binds to.")
52-
flag.StringVar(&defaultRabbitmqImage, "default-rabbitmq-image", "rabbitmq:3.8.21-management", "The default image to use in RabbitmqClusters when not specified in the rabbitmqcluster.spec.image")
5353

5454
opts := zap.Options{}
5555
opts.BindFlags(flag.CommandLine)
@@ -67,6 +67,14 @@ func main() {
6767
// If the environment variable is not set Getenv returns an empty string which ctrl.Options.Namespace takes to mean all namespaces should be watched
6868
operatorScopeNamespace := os.Getenv("OPERATOR_SCOPE_NAMESPACE")
6969

70+
if configuredDefaultRabbitmqImage, ok := os.LookupEnv("DEFAULT_RABBITMQ_IMAGE"); ok {
71+
defaultRabbitmqImage = configuredDefaultRabbitmqImage
72+
}
73+
74+
if configuredDefaultUserUpdaterImage, ok := os.LookupEnv("DEFAULT_USER_UPDATER_IMAGE"); ok {
75+
defaultUserUpdaterImage = configuredDefaultUserUpdaterImage
76+
}
77+
7078
options := ctrl.Options{
7179
Scheme: scheme,
7280
MetricsBindAddress: metricsAddr,
@@ -110,14 +118,15 @@ func main() {
110118
}
111119

112120
err = (&controllers.RabbitmqClusterReconciler{
113-
Client: mgr.GetClient(),
114-
Scheme: mgr.GetScheme(),
115-
Recorder: mgr.GetEventRecorderFor(controllerName),
116-
Namespace: operatorNamespace,
117-
ClusterConfig: clusterConfig,
118-
Clientset: kubernetes.NewForConfigOrDie(clusterConfig),
119-
PodExecutor: controllers.NewPodExecutor(),
120-
DefaultRabbitmqImage: defaultRabbitmqImage,
121+
Client: mgr.GetClient(),
122+
Scheme: mgr.GetScheme(),
123+
Recorder: mgr.GetEventRecorderFor(controllerName),
124+
Namespace: operatorNamespace,
125+
ClusterConfig: clusterConfig,
126+
Clientset: kubernetes.NewForConfigOrDie(clusterConfig),
127+
PodExecutor: controllers.NewPodExecutor(),
128+
DefaultRabbitmqImage: defaultRabbitmqImage,
129+
DefaultUserUpdaterImage: defaultUserUpdaterImage,
121130
}).SetupWithManager(mgr)
122131
if err != nil {
123132
log.Error(err, "unable to create controller", controllerName)

0 commit comments

Comments
 (0)