Skip to content
Open
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
7 changes: 6 additions & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ help: ## Display this help.

.PHONY: manifests
manifests: controller-gen ## Generate WebhookConfiguration, ClusterRole and CustomResourceDefinition objects.
$(CONTROLLER_GEN) rbac:roleName=manager-role crd webhook paths="./..." output:crd:artifacts:config=config/crd/bases
$(CONTROLLER_GEN) rbac:roleName=manager-role crd:maxDescLen=0 webhook paths="./..." output:crd:artifacts:config=config/crd/bases

.PHONY: generate
generate: controller-gen ## Generate code containing DeepCopy, DeepCopyInto, and DeepCopyObject method implementations.
Expand All @@ -61,6 +61,11 @@ test: manifests generate fmt vet envtest ## Run tests.
GOBIN=$(LOCALBIN) go install github.com/onsi/ginkgo/v2/[email protected]
KUBEBUILDER_ASSETS="$(shell $(ENVTEST) use $(ENVTEST_K8S_VERSION) --bin-dir $(LOCALBIN) -p path)" $(GINKGO) -vv -r -p -coverprofile cover.out

.PHONY: test-single
test-single: manifests generate fmt vet envtest ## Run a single test by name. Usage: make test-single TEST="test name"
GOBIN=$(LOCALBIN) go install github.com/onsi/ginkgo/v2/[email protected]
KUBEBUILDER_ASSETS="$(shell $(ENVTEST) use $(ENVTEST_K8S_VERSION) --bin-dir $(LOCALBIN) -p path)" $(GINKGO) -vv --focus="$(TEST)" ./e2e

##@ Build

.PHONY: build
Expand Down
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ Main features include:

- Automatic failover
- Scaling horizontally and vertically with custom rollout strategy
- Horizontal Pod Autoscaling (HPA) support
- Authentication and server TLS
- Automatic snapshots to PVCs and S3
- Monitoring with Prometheus and Grafana
Expand Down
76 changes: 75 additions & 1 deletion api/v1alpha1/dragonfly_types.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ limitations under the License.
package v1alpha1

import (
autoscalingv2 "k8s.io/api/autoscaling/v2"
corev1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)
Expand Down Expand Up @@ -75,22 +76,30 @@ type DragonflySpec struct {
// (Optional) Additional containers to add to dragonflycluster. Replace container on name collision.
// +optional
// +kubebuilder:validation:Optional
// +kubebuilder:pruning:PreserveUnknownFields
// +kubebuilder:validation:Type=array
AdditionalContainers []corev1.Container `json:"additionalContainers,omitempty"`

// (Optional) Additional volumes to add to dragonflycluster. Replace volume on name collision.
// +optional
// +kubebuilder:validation:Optional
// +kubebuilder:pruning:PreserveUnknownFields
// +kubebuilder:validation:Type=array
AdditionalVolumes []corev1.Volume `json:"additionalVolumes,omitempty"`

// (Optional) Dragonfly container resource limits. Any container limits
// can be specified.
// +optional
// +kubebuilder:validation:Optional
// +kubebuilder:pruning:PreserveUnknownFields
// +kubebuilder:validation:Type=object
Resources *corev1.ResourceRequirements `json:"resources,omitempty"`

// (Optional) Dragonfly pod affinity
// +optional
// +kubebuilder:validation:Optional
// +kubebuilder:pruning:PreserveUnknownFields
// +kubebuilder:validation:Type=object
Affinity *corev1.Affinity `json:"affinity,omitempty"`

// (Optional) Dragonfly pod node selector
Expand All @@ -106,11 +115,15 @@ type DragonflySpec struct {
// (Optional) Dragonfly pod tolerations
// +optional
// +kubebuilder:validation:Optional
// +kubebuilder:pruning:PreserveUnknownFields
// +kubebuilder:validation:Type=array
Tolerations []corev1.Toleration `json:"tolerations,omitempty"`

// (Optional) Dragonfly pod topologySpreadConstraints
// +optional
// +kubebuilder:validation:Optional
// +kubebuilder:pruning:PreserveUnknownFields
// +kubebuilder:validation:Type=array
TopologySpreadConstraints []corev1.TopologySpreadConstraint `json:"topologySpreadConstraints,omitempty"`

// (Optional) Dragonfly Authentication mechanism
Expand All @@ -121,11 +134,15 @@ type DragonflySpec struct {
// (Optional) Dragonfly container security context
// +optional
// +kubebuilder:validation:Optional
// +kubebuilder:pruning:PreserveUnknownFields
// +kubebuilder:validation:Type=object
ContainerSecurityContext *corev1.SecurityContext `json:"containerSecurityContext,omitempty"`

// (Optional) Dragonfly pod security context
// +optional
// +kubebuilder:validation:Optional
// +kubebuilder:pruning:PreserveUnknownFields
// +kubebuilder:validation:Type=object
PodSecurityContext *corev1.PodSecurityContext `json:"podSecurityContext,omitempty"`

// (Optional) Dragonfly pod service account name
Expand Down Expand Up @@ -168,9 +185,17 @@ type DragonflySpec struct {
// (Optional) Dragonfly pod init containers
// +optional
// +kubebuilder:validation:Optional
// +kubebuilder:pruning:PreserveUnknownFields
// +kubebuilder:validation:Type=array
InitContainers []corev1.Container `json:"initContainers,omitempty"`

// (Optional) Dragonfly direct child resources additional annotations and labels

// (Optional) Dragonfly autoscaler configuration
// +optional
// +kubebuilder:validation:Optional
Autoscaler *AutoscalerSpec `json:"autoscaler,omitempty"`

// (Optional) Dragonfly direct child resources additional annotations and labels
// +optional
// +kubebuilder:validation:Optional
OwnedObjectsMetadata *OwnedObjectsMetadata `json:"ownedObjectsMetadata,omitempty"`
Expand Down Expand Up @@ -212,6 +237,8 @@ type Tiering struct {
// (Optional) Dragonfly PVC spec for cache tiering configuration
// +optional
// +kubebuilder:validation:Optional
// +kubebuilder:pruning:PreserveUnknownFields
// +kubebuilder:validation:Type=object
PersistentVolumeClaimSpec *corev1.PersistentVolumeClaimSpec `json:"persistentVolumeClaimSpec,omitempty"`
}

Expand All @@ -236,6 +263,8 @@ type Snapshot struct {
// (Optional) Dragonfly PVC spec
// +optional
// +kubebuilder:validation:Optional
// +kubebuilder:pruning:PreserveUnknownFields
// +kubebuilder:validation:Type=object
PersistentVolumeClaimSpec *corev1.PersistentVolumeClaimSpec `json:"persistentVolumeClaimSpec,omitempty"`
}

Expand All @@ -250,6 +279,51 @@ type Authentication struct {
ClientCaCertSecret *corev1.SecretKeySelector `json:"clientCaCertSecret,omitempty"`
}

// AutoscalerSpec defines the autoscaling configuration for Dragonfly
type AutoscalerSpec struct {
// Whether autoscaling is enabled
// +kubebuilder:validation:Required
Enabled bool `json:"enabled"`

// Minimum number of replicas
// +kubebuilder:validation:Minimum=1
// +kubebuilder:validation:Required
MinReplicas int32 `json:"minReplicas"`

// Maximum number of replicas
// +kubebuilder:validation:Minimum=1
// +kubebuilder:validation:Required
MaxReplicas int32 `json:"maxReplicas"`

// Scaling behavior policies
// +optional
// +kubebuilder:validation:Optional
// +kubebuilder:pruning:PreserveUnknownFields
// +kubebuilder:validation:Type=object
Behavior *autoscalingv2.HorizontalPodAutoscalerBehavior `json:"behavior,omitempty"`

// Metrics to be used for autoscaling
// +optional
// +kubebuilder:validation:Optional
// +kubebuilder:pruning:PreserveUnknownFields
// +kubebuilder:validation:Type=array
Metrics []autoscalingv2.MetricSpec `json:"metrics,omitempty"`

// Target CPU utilization percentage
// +optional
// +kubebuilder:validation:Optional
// +kubebuilder:validation:Minimum=1
// +kubebuilder:validation:Maximum=100
TargetCPUUtilizationPercentage *int32 `json:"targetCPUUtilizationPercentage,omitempty"`

// Target memory utilization percentage
// +optional
// +kubebuilder:validation:Optional
// +kubebuilder:validation:Minimum=1
// +kubebuilder:validation:Maximum=100
TargetMemoryUtilizationPercentage *int32 `json:"targetMemoryUtilizationPercentage,omitempty"`
}

// DragonflyStatus defines the observed state of Dragonfly
type DragonflyStatus struct {
// INSERT ADDITIONAL STATUS FIELD - define observed state of cluster
Expand Down
45 changes: 44 additions & 1 deletion api/v1alpha1/zz_generated.deepcopy.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion cmd/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -181,7 +181,7 @@ func main() {
if watchNamespaces != "" {
setupLog.Info(fmt.Sprintf("Watch namespaces: %s", watchNamespaces))
} else {
setupLog.Info(fmt.Sprintf("Watch all namespaces."))
setupLog.Info("Watch all namespaces.")
}

if err := mgr.Start(ctrl.SetupSignalHandler()); err != nil {
Expand Down
Loading