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
2 changes: 1 addition & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -122,7 +122,7 @@ test: manifests generate fmt vet setup-envtest ## Run tests.
# The default setup assumes Kind is pre-installed and builds/loads the Manager Docker image locally.
# CertManager is installed by default; skip with:
# - CERT_MANAGER_INSTALL_SKIP=true
KIND_CLUSTER ?= memcached-operator-test-e2e
KIND_CLUSTER ?= typesense-operator-test-e2e

.PHONY: setup-test-e2e
setup-test-e2e: ## Set up a Kind cluster for e2e tests if it does not exist
Expand Down
24 changes: 23 additions & 1 deletion api/v1alpha1/typesensecluster_types_storage.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
package v1alpha1

import "k8s.io/apimachinery/pkg/api/resource"
import (
appsv1 "k8s.io/api/apps/v1"
"k8s.io/apimachinery/pkg/api/resource"
)

type StorageSpec struct {

Expand All @@ -15,7 +18,11 @@ type StorageSpec struct {
// +kubebuilder:default:=ReadWriteOnce
AccessMode string `json:"accessMode,omitempty"`

// +kubebuilder:validation:Optional
Annotations map[string]string `json:"annotations,omitempty"`

// +kubebuilder:validation:Optional
RetentionPolicy *appsv1.StatefulSetPersistentVolumeClaimRetentionPolicy `json:"retentionPolicy"`
}

func (s *TypesenseClusterSpec) GetStorage() StorageSpec {
Expand All @@ -27,5 +34,20 @@ func (s *TypesenseClusterSpec) GetStorage() StorageSpec {
Size: resource.MustParse("100Mi"),
StorageClassName: "standard",
AccessMode: "ReadWriteOnce",
RetentionPolicy: &appsv1.StatefulSetPersistentVolumeClaimRetentionPolicy{
WhenDeleted: appsv1.RetainPersistentVolumeClaimRetentionPolicyType,
WhenScaled: appsv1.RetainPersistentVolumeClaimRetentionPolicyType,
},
}
}

func (s *TypesenseClusterSpec) GetStorageRetentionPolicy() *appsv1.StatefulSetPersistentVolumeClaimRetentionPolicy {
if s.Storage != nil && s.Storage.RetentionPolicy != nil {
return s.Storage.RetentionPolicy
}

return &appsv1.StatefulSetPersistentVolumeClaimRetentionPolicy{
WhenDeleted: appsv1.RetainPersistentVolumeClaimRetentionPolicyType,
WhenScaled: appsv1.RetainPersistentVolumeClaimRetentionPolicyType,
}
}
6 changes: 6 additions & 0 deletions api/v1alpha1/zz_generated.deepcopy.go

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

23 changes: 22 additions & 1 deletion charts/typesense-operator/templates/typesensecluster-crd.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -4271,6 +4271,27 @@ spec:
x-kubernetes-int-or-string: true
storageClassName:
type: string
retentionPolicy:
description: |-
StatefulSetPersistentVolumeClaimRetentionPolicy describes the policy used for PVCs
created from the StatefulSet VolumeClaimTemplates.
properties:
whenDeleted:
description: |-
WhenDeleted specifies what happens to PVCs created from StatefulSet
VolumeClaimTemplates when the StatefulSet is deleted. The default policy
of `Retain` causes PVCs to not be affected by StatefulSet deletion. The
`Delete` policy causes those PVCs to be deleted.
type: string
whenScaled:
description: |-
WhenScaled specifies what happens to PVCs created from StatefulSet
VolumeClaimTemplates when the StatefulSet is scaled down. The default
policy of `Retain` causes PVCs to not be affected by a scaledown. The
`Delete` policy causes the associated PVCs for any excess pods above
the replica count to be deleted.
type: string
type: object
required:
- storageClassName
type: object
Expand Down Expand Up @@ -4580,4 +4601,4 @@ status:
kind: ""
plural: ""
conditions: []
storedVersions: []
storedVersions: []
21 changes: 21 additions & 0 deletions config/crd/bases/ts.opentelekomcloud.com_typesenseclusters.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -4326,6 +4326,27 @@ spec:
additionalProperties:
type: string
type: object
retentionPolicy:
description: |-
StatefulSetPersistentVolumeClaimRetentionPolicy describes the policy used for PVCs
created from the StatefulSet VolumeClaimTemplates.
properties:
whenDeleted:
description: |-
WhenDeleted specifies what happens to PVCs created from StatefulSet
VolumeClaimTemplates when the StatefulSet is deleted. The default policy
of `Retain` causes PVCs to not be affected by StatefulSet deletion. The
`Delete` policy causes those PVCs to be deleted.
type: string
whenScaled:
description: |-
WhenScaled specifies what happens to PVCs created from StatefulSet
VolumeClaimTemplates when the StatefulSet is scaled down. The default
policy of `Retain` causes PVCs to not be affected by a scaledown. The
`Delete` policy causes the associated PVCs for any excess pods above
the replica count to be deleted.
type: string
type: object
size:
anyOf:
- type: integer
Expand Down
5 changes: 4 additions & 1 deletion config/samples/ts_v1alpha1_typesensecluster.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -10,4 +10,7 @@ spec:
replicas: 3
storage:
size: 100Mi
storageClassName: standard
storageClassName: standard
retentionPolicy:
whenDeleted: Delete
whenScaled: Retain
1 change: 1 addition & 0 deletions internal/controller/typesensecluster_statefulset.go
Original file line number Diff line number Diff line change
Expand Up @@ -486,6 +486,7 @@ func (r *TypesenseClusterReconciler) buildStatefulSet(ctx context.Context, key c
},
},
},
PersistentVolumeClaimRetentionPolicy: ts.Spec.GetStorageRetentionPolicy(),
},
}

Expand Down
27 changes: 17 additions & 10 deletions internal/controller/typesensecluster_statefulset_hash.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,15 +17,16 @@ import (
type UpdateStatefulSetTrigger string

var (
SpecReplicasChanged UpdateStatefulSetTrigger = "SpecReplicasChanged"
HashAnnotationChanged UpdateStatefulSetTrigger = "HashAnnotationChanged"
PodAnnotationsChanged UpdateStatefulSetTrigger = "PodAnnotationsChanged"
StatefulSetAnnotationsChanged UpdateStatefulSetTrigger = "StatefulSetAnnotationsChanged"
SpecResourcesChanged UpdateStatefulSetTrigger = "SpecResourcesChanged"
PodSecurityContextChanged UpdateStatefulSetTrigger = "PodSecurityContextChanged"
InvalidContainerCount UpdateStatefulSetTrigger = "InvalidContainerCount"
ContainerSecurityContextChanged UpdateStatefulSetTrigger = "ContainerSecurityContextChanged"
SpecTypesenseVersionChanged UpdateStatefulSetTrigger = "SpecTypesenseVersionChanged"
SpecReplicasChanged UpdateStatefulSetTrigger = "SpecReplicasChanged"
HashAnnotationChanged UpdateStatefulSetTrigger = "HashAnnotationChanged"
PodAnnotationsChanged UpdateStatefulSetTrigger = "PodAnnotationsChanged"
StatefulSetAnnotationsChanged UpdateStatefulSetTrigger = "StatefulSetAnnotationsChanged"
StatefulSetARetentionPolicyChanged UpdateStatefulSetTrigger = "StatefulSetARetentionPolicyChanged"
SpecResourcesChanged UpdateStatefulSetTrigger = "SpecResourcesChanged"
PodSecurityContextChanged UpdateStatefulSetTrigger = "PodSecurityContextChanged"
InvalidContainerCount UpdateStatefulSetTrigger = "InvalidContainerCount"
ContainerSecurityContextChanged UpdateStatefulSetTrigger = "ContainerSecurityContextChanged"
SpecTypesenseVersionChanged UpdateStatefulSetTrigger = "SpecTypesenseVersionChanged"
)

func (r *TypesenseClusterReconciler) shouldUpdateStatefulSet(sts *appsv1.StatefulSet, desired *appsv1.StatefulSet, ts *tsv1alpha1.TypesenseCluster) (update bool, scaleOnly bool, triggers []UpdateStatefulSetTrigger) {
Expand All @@ -43,7 +44,7 @@ func (r *TypesenseClusterReconciler) shouldUpdateStatefulSet(sts *appsv1.Statefu

// SpecReplicasChanged
if *sts.Spec.Replicas != ts.Spec.Replicas &&
(condition.Reason != string(ConditionReasonQuorumDowngraded) || condition.Reason != string(ConditionReasonQuorumQueuedWrites)) {
(condition.Reason != string(ConditionReasonQuorumDowngraded) && condition.Reason != string(ConditionReasonQuorumQueuedWrites)) {
triggers = append(triggers, SpecReplicasChanged)
update = false
scaleOnly = true
Expand Down Expand Up @@ -71,6 +72,12 @@ func (r *TypesenseClusterReconciler) shouldUpdateStatefulSet(sts *appsv1.Statefu
update = true
}

// StatefulSetARetentionPolicyChanged
if !apiequality.Semantic.DeepEqual(sts.Spec.PersistentVolumeClaimRetentionPolicy, desired.Spec.PersistentVolumeClaimRetentionPolicy) {
triggers = append(triggers, StatefulSetARetentionPolicyChanged)
update = true
}

//// SpecResourcesChanged
//if !apiequality.Semantic.DeepEqual(sts.Spec.Template.Spec.Containers[0].Resources, ts.Spec.GetResources()) {
// triggers = append(triggers, SpecResourcesChanged)
Expand Down