Skip to content

Commit cd26b91

Browse files
committed
Use CRD defaulting
- use CRD schema to set defaults for CRD fields specs. - defaults are directly set on CRDs so it preserves the default with new versions of CRD - defaults can be set for integer, string, slice, and objects, which covers all types - unit tests on api now creates rabbitmqcluster directly to test defaulting behavior
1 parent 008183c commit cd26b91

File tree

4 files changed

+160
-166
lines changed

4 files changed

+160
-166
lines changed

api/v1beta1/rabbitmqcluster_types.go

+12-77
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
package v1beta1
1010

1111
import (
12-
"reflect"
1312
"strings"
1413

1514
appsv1 "k8s.io/api/apps/v1"
@@ -21,16 +20,6 @@ import (
2120
"k8s.io/apimachinery/pkg/runtime"
2221
)
2322

24-
const (
25-
rabbitmqImage string = "rabbitmq:3.8.9"
26-
defaultPersistentCapacity string = "10Gi"
27-
defaultMemoryLimit string = "2Gi"
28-
defaultCPULimit string = "2000m"
29-
defaultMemoryRequest string = "2Gi"
30-
defaultCPURequest string = "1000m"
31-
defaultServiceType = corev1.ServiceTypeClusterIP
32-
)
33-
3423
// +kubebuilder:object:root=true
3524

3625
// RabbitmqCluster is the Schema for the rabbitmqclusters API
@@ -50,15 +39,20 @@ type RabbitmqCluster struct {
5039
type RabbitmqClusterSpec struct {
5140
// Replicas is the number of nodes in the RabbitMQ cluster. Each node is deployed as a Replica in a StatefulSet. Only 1, 3, 5 replicas clusters are tested.
5241
// +kubebuilder:validation:Minimum:=0
42+
// +kubebuilder:default:=1
5343
Replicas *int32 `json:"replicas"`
5444
// Image is the name of the RabbitMQ docker image to use for RabbitMQ nodes in the RabbitmqCluster.
45+
// +kubebuilder:default:="rabbitmq:3.8.9"
5546
Image string `json:"image,omitempty"`
5647
// Name of the Secret resource containing access credentials to the registry for the RabbitMQ image. Required if the docker registry is private.
57-
ImagePullSecret string `json:"imagePullSecret,omitempty"`
58-
Service RabbitmqClusterServiceSpec `json:"service,omitempty"`
59-
Persistence RabbitmqClusterPersistenceSpec `json:"persistence,omitempty"`
60-
Resources *corev1.ResourceRequirements `json:"resources,omitempty"`
61-
Affinity *corev1.Affinity `json:"affinity,omitempty"`
48+
ImagePullSecret string `json:"imagePullSecret,omitempty"`
49+
// +kubebuilder:default:={type: "ClusterIP"}
50+
Service RabbitmqClusterServiceSpec `json:"service,omitempty"`
51+
// +kubebuilder:default:={storage: "10Gi"}
52+
Persistence RabbitmqClusterPersistenceSpec `json:"persistence,omitempty"`
53+
// +kubebuilder:default:={limits: {cpu: "2000m", memory: "2Gi"}, requests: {cpu: "1000m", memory: "2Gi"}}
54+
Resources *corev1.ResourceRequirements `json:"resources,omitempty"`
55+
Affinity *corev1.Affinity `json:"affinity,omitempty"`
6256
// Tolerations is the list of Toleration resources attached to each Pod in the RabbitmqCluster.
6357
Tolerations []corev1.Toleration `json:"tolerations,omitempty"`
6458
Rabbitmq RabbitmqClusterConfigurationSpec `json:"rabbitmq,omitempty"`
@@ -268,12 +262,14 @@ type RabbitmqClusterPersistenceSpec struct {
268262
// StorageClassName is the name of the StorageClass to claim a PersistentVolume from.
269263
StorageClassName *string `json:"storageClassName,omitempty"`
270264
// The requested size of the persistent volume attached to each Pod in the RabbitmqCluster.
265+
// +kubebuilder:default:="10Gi"
271266
Storage *k8sresource.Quantity `json:"storage,omitempty"`
272267
}
273268

274269
// Settable attributes for the Client Service resource.
275270
type RabbitmqClusterServiceSpec struct {
276271
// +kubebuilder:validation:Enum=ClusterIP;LoadBalancer;NodePort
272+
// +kubebuilder:default:="ClusterIP"
277273
Type corev1.ServiceType `json:"type,omitempty"`
278274
// Annotations to add to the Client Service.
279275
Annotations map[string]string `json:"annotations,omitempty"`
@@ -391,64 +387,3 @@ func (cluster RabbitmqCluster) ChildResourceName(name string) string {
391387
func init() {
392388
SchemeBuilder.Register(&RabbitmqCluster{}, &RabbitmqClusterList{})
393389
}
394-
395-
func getDefaultPersistenceStorageQuantity() *k8sresource.Quantity {
396-
tenGi := k8sresource.MustParse(defaultPersistentCapacity)
397-
return &tenGi
398-
}
399-
400-
var one int32 = 1
401-
402-
var rabbitmqClusterDefaults = RabbitmqCluster{
403-
Spec: RabbitmqClusterSpec{
404-
Replicas: &one,
405-
Image: rabbitmqImage,
406-
Service: RabbitmqClusterServiceSpec{
407-
Type: defaultServiceType,
408-
},
409-
Persistence: RabbitmqClusterPersistenceSpec{
410-
Storage: getDefaultPersistenceStorageQuantity(),
411-
},
412-
Resources: &corev1.ResourceRequirements{
413-
Limits: map[corev1.ResourceName]k8sresource.Quantity{
414-
"cpu": k8sresource.MustParse(defaultCPULimit),
415-
"memory": k8sresource.MustParse(defaultMemoryLimit),
416-
},
417-
Requests: map[corev1.ResourceName]k8sresource.Quantity{
418-
"cpu": k8sresource.MustParse(defaultCPURequest),
419-
"memory": k8sresource.MustParse(defaultMemoryRequest),
420-
},
421-
},
422-
},
423-
}
424-
425-
func MergeDefaults(current RabbitmqCluster) *RabbitmqCluster {
426-
var mergedRabbitmq = current
427-
428-
emptyRabbitmq := RabbitmqCluster{}
429-
// Note: we do not check for ImagePullSecret or StorageClassName since the default and nil value are both "".
430-
// The logic of the check would be 'if actual is an empty string, then set to an empty string'
431-
// We also do not check for Annotations as the nil value will be the empty map.
432-
433-
if mergedRabbitmq.Spec.Replicas == emptyRabbitmq.Spec.Replicas {
434-
mergedRabbitmq.Spec.Replicas = rabbitmqClusterDefaults.Spec.Replicas
435-
}
436-
437-
if mergedRabbitmq.Spec.Image == emptyRabbitmq.Spec.Image {
438-
mergedRabbitmq.Spec.Image = rabbitmqClusterDefaults.Spec.Image
439-
}
440-
441-
if mergedRabbitmq.Spec.Service.Type == emptyRabbitmq.Spec.Service.Type {
442-
mergedRabbitmq.Spec.Service.Type = rabbitmqClusterDefaults.Spec.Service.Type
443-
}
444-
445-
if reflect.DeepEqual(mergedRabbitmq.Spec.Persistence.Storage, emptyRabbitmq.Spec.Persistence.Storage) {
446-
mergedRabbitmq.Spec.Persistence.Storage = rabbitmqClusterDefaults.Spec.Persistence.Storage
447-
}
448-
449-
if reflect.DeepEqual(mergedRabbitmq.Spec.Resources, emptyRabbitmq.Spec.Resources) {
450-
mergedRabbitmq.Spec.Resources = rabbitmqClusterDefaults.Spec.Resources
451-
}
452-
453-
return &mergedRabbitmq
454-
}

0 commit comments

Comments
 (0)