Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ destroy: ## Cleanup all controller artefacts
run: generate manifests fmt vet install deploy-namespace-rbac just-run ## Run operator binary locally against the configured Kubernetes cluster in ~/.kube/config

just-run: ## Just runs 'go run main.go' without regenerating any manifests or deploying RBACs
KUBE_CONFIG=${HOME}/.kube/config OPERATOR_NAMESPACE=rabbitmq-system go run ./main.go -metrics-bind-address 127.0.0.1:9782 --zap-devel
KUBE_CONFIG=${HOME}/.kube/config OPERATOR_NAMESPACE=rabbitmq-system go run ./main.go -metrics-bind-address 127.0.0.1:9782 --zap-devel $(OPERATOR_ARGS)

delve: generate install deploy-namespace-rbac just-delve ## Deploys CRD, Namespace, RBACs and starts Delve debugger

Expand Down
1 change: 0 additions & 1 deletion api/v1beta1/rabbitmqcluster_types.go
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,6 @@ type RabbitmqClusterSpec struct {
Replicas *int32 `json:"replicas,omitempty"`
// Image is the name of the RabbitMQ docker image to use for RabbitMQ nodes in the RabbitmqCluster.
// Must be provided together with ImagePullSecrets in order to use an image in a private registry.
// +kubebuilder:default:="rabbitmq:3.8.21-management"
Image string `json:"image,omitempty"`
// List of Secret resource containing access credentials to the registry for the RabbitMQ image. Required if the docker registry is private.
ImagePullSecrets []corev1.LocalObjectReference `json:"imagePullSecrets,omitempty"`
Expand Down
1 change: 0 additions & 1 deletion api/v1beta1/rabbitmqcluster_types_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -480,7 +480,6 @@ func generateRabbitmqClusterObject(clusterName string) *RabbitmqCluster {
},
Spec: RabbitmqClusterSpec{
Replicas: pointer.Int32Ptr(1),
Image: "rabbitmq:3.8.21-management",
TerminationGracePeriodSeconds: pointer.Int64Ptr(604800),
Service: RabbitmqClusterServiceSpec{
Type: "ClusterIP",
Expand Down
1 change: 0 additions & 1 deletion config/crd/bases/rabbitmq.com_rabbitmqclusters.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -514,7 +514,6 @@ spec:
type: object
type: object
image:
default: rabbitmq:3.8.21-management
description: Image is the name of the RabbitMQ docker image to use for RabbitMQ nodes in the RabbitmqCluster. Must be provided together with ImagePullSecrets in order to use an image in a private registry.
type: string
imagePullSecrets:
Expand Down
26 changes: 20 additions & 6 deletions controllers/rabbitmqcluster_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -57,12 +57,13 @@ const (
// RabbitmqClusterReconciler reconciles a RabbitmqCluster object
type RabbitmqClusterReconciler struct {
client.Client
Scheme *runtime.Scheme
Namespace string
Recorder record.EventRecorder
ClusterConfig *rest.Config
Clientset *kubernetes.Clientset
PodExecutor PodExecutor
Scheme *runtime.Scheme
Namespace string
Recorder record.EventRecorder
ClusterConfig *rest.Config
Clientset *kubernetes.Clientset
PodExecutor PodExecutor
DefaultRabbitmqImage string
}

// the rbac rule requires an empty row at the end to render
Expand Down Expand Up @@ -113,6 +114,19 @@ func (r *RabbitmqClusterReconciler) Reconcile(ctx context.Context, req ctrl.Requ
return ctrl.Result{}, nil
}

if rabbitmqCluster.Spec.Image == "" {
rabbitmqCluster.Spec.Image = r.DefaultRabbitmqImage
if err = r.Update(ctx, rabbitmqCluster); err != nil {
if k8serrors.IsConflict(err) {
logger.Info("failed to update image because of conflict; requeueing...",
"namespace", rabbitmqCluster.Namespace,
"name", rabbitmqCluster.Name)
return ctrl.Result{RequeueAfter: 2 * time.Second}, nil
}
return ctrl.Result{}, err
}
}

// Ensure the resource have a deletion marker
if err := r.addFinalizerIfNeeded(ctx, rabbitmqCluster); err != nil {
return ctrl.Result{}, err
Expand Down
9 changes: 7 additions & 2 deletions controllers/rabbitmqcluster_controller_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -62,13 +62,18 @@ var _ = Describe("RabbitmqClusterController", func() {
AfterEach(func() {
Expect(client.Delete(ctx, cluster)).To(Succeed())
Eventually(func() bool {
rmq := &rabbitmqv1beta1.RabbitmqCluster{}
err := client.Get(ctx, types.NamespacedName{Name: cluster.Name, Namespace: cluster.Namespace}, rmq)
err := client.Get(ctx, types.NamespacedName{Name: cluster.Name, Namespace: cluster.Namespace}, cluster)
return apierrors.IsNotFound(err)
}, 5).Should(BeTrue())
})

It("works", func() {
By("populating the image spec with the default image", func() {
fetchedCluster := &rabbitmqv1beta1.RabbitmqCluster{}
Expect(client.Get(ctx, types.NamespacedName{Name: "rabbitmq-one", Namespace: defaultNamespace}, fetchedCluster)).To(Succeed())
Expect(fetchedCluster.Spec.Image).To(Equal(defaultRabbitmqImage))
})

By("creating a statefulset with default configurations", func() {
sts := statefulSet(ctx, cluster)

Expand Down
18 changes: 11 additions & 7 deletions controllers/suite_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,10 @@ import (
// +kubebuilder:scaffold:imports
)

const controllerName = "rabbitmqcluster-controller"
const (
controllerName = "rabbitmqcluster-controller"
defaultRabbitmqImage = "default-rabbit-image:stable"
)

var (
testEnv *envtest.Environment
Expand Down Expand Up @@ -82,12 +85,13 @@ var _ = BeforeSuite(func() {

fakeExecutor = &fakePodExecutor{}
err = (&controllers.RabbitmqClusterReconciler{
Client: mgr.GetClient(),
Scheme: mgr.GetScheme(),
Recorder: mgr.GetEventRecorderFor(controllerName),
Namespace: "rabbitmq-system",
Clientset: clientSet,
PodExecutor: fakeExecutor,
Client: mgr.GetClient(),
Scheme: mgr.GetScheme(),
Recorder: mgr.GetEventRecorderFor(controllerName),
Namespace: "rabbitmq-system",
Clientset: clientSet,
PodExecutor: fakeExecutor,
DefaultRabbitmqImage: defaultRabbitmqImage,
}).SetupWithManager(mgr)
Expect(err).ToNot(HaveOccurred())

Expand Down
22 changes: 14 additions & 8 deletions main.go
Original file line number Diff line number Diff line change
Expand Up @@ -43,8 +43,13 @@ func init() {
}

func main() {
var metricsAddr string
var (
metricsAddr string
defaultRabbitmqImage string
)

flag.StringVar(&metricsAddr, "metrics-bind-address", ":9782", "The address the metric endpoint binds to.")
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")

opts := zap.Options{}
opts.BindFlags(flag.CommandLine)
Expand Down Expand Up @@ -105,13 +110,14 @@ func main() {
}

err = (&controllers.RabbitmqClusterReconciler{
Client: mgr.GetClient(),
Scheme: mgr.GetScheme(),
Recorder: mgr.GetEventRecorderFor(controllerName),
Namespace: operatorNamespace,
ClusterConfig: clusterConfig,
Clientset: kubernetes.NewForConfigOrDie(clusterConfig),
PodExecutor: controllers.NewPodExecutor(),
Client: mgr.GetClient(),
Scheme: mgr.GetScheme(),
Recorder: mgr.GetEventRecorderFor(controllerName),
Namespace: operatorNamespace,
ClusterConfig: clusterConfig,
Clientset: kubernetes.NewForConfigOrDie(clusterConfig),
PodExecutor: controllers.NewPodExecutor(),
DefaultRabbitmqImage: defaultRabbitmqImage,
}).SetupWithManager(mgr)
if err != nil {
log.Error(err, "unable to create controller", controllerName)
Expand Down