From ec310fbf31715f8ea32ee04f7060b3ee7e20266e Mon Sep 17 00:00:00 2001 From: Hayden Date: Mon, 16 Mar 2026 03:14:13 +0800 Subject: [PATCH 1/2] add rudimentary support for service configurables --- api/v1alpha1/typesensecluster_types.go | 2 ++ .../typesensecluster_types_service.go | 27 +++++++++++++++++++ .../controller/typesensecluster_services.go | 9 +++++++ internal/controller/utils.go | 4 +++ 4 files changed, 42 insertions(+) create mode 100644 api/v1alpha1/typesensecluster_types_service.go diff --git a/api/v1alpha1/typesensecluster_types.go b/api/v1alpha1/typesensecluster_types.go index e8a0a09..5441664 100644 --- a/api/v1alpha1/typesensecluster_types.go +++ b/api/v1alpha1/typesensecluster_types.go @@ -121,6 +121,8 @@ type TypesenseClusterSpec struct { Ingress *IngressSpec `json:"ingress,omitempty"` + Service *ServiceSpec `json:"service,omitempty"` + HttpRoutes []HttpRouteSpec `json:"httpRoutes,omitempty"` Scrapers []DocSearchScraperSpec `json:"scrapers,omitempty"` diff --git a/api/v1alpha1/typesensecluster_types_service.go b/api/v1alpha1/typesensecluster_types_service.go new file mode 100644 index 0000000..5c8b9e9 --- /dev/null +++ b/api/v1alpha1/typesensecluster_types_service.go @@ -0,0 +1,27 @@ +package v1alpha1 + +import ( + corev1 "k8s.io/api/core/v1" +) + +type ServiceSpec struct { + // +optional + Labels map[string]string `json:"labels,omitempty"` + + // +optional + Annotations map[string]string `json:"annotations,omitempty"` + + // +optional + // +kubebuilder:default:="ClusterIP" + // +kubebuilder:validation:Enum=ClusterIP;NodePort;LoadBalancer;ExternalName + Type corev1.ServiceType `json:"type"` + + // +optional + // +kubebuilder:validation:Enum=Cluster;Local + InternalTrafficPolicy *corev1.ServiceInternalTrafficPolicy `json:"internalTrafficPolicy,omitempty"` + + // +optional + // +kubebuilder:default:="Cluster" + // +kubebuilder:validation:Enum=Cluster;Local + ExternalTrafficPolicy corev1.ServiceExternalTrafficPolicy `json:"externalTrafficPolicy,omitempty"` +} diff --git a/internal/controller/typesensecluster_services.go b/internal/controller/typesensecluster_services.go index effe309..279c1db 100644 --- a/internal/controller/typesensecluster_services.go +++ b/internal/controller/typesensecluster_services.go @@ -163,6 +163,15 @@ func (r *TypesenseClusterReconciler) createService(ctx context.Context, key clie }, } + svcSpec := ts.Spec.Service + if svcSpec != nil { + svc.ObjectMeta.Labels = mergeLabels(svc.ObjectMeta.Labels, svcSpec.Labels) + svc.ObjectMeta.Annotations = mergeAnnotations(svc.ObjectMeta.Annotations, svcSpec.Annotations) + svc.Spec.Type = svcSpec.Type + svc.Spec.InternalTrafficPolicy = svcSpec.InternalTrafficPolicy + svc.Spec.ExternalTrafficPolicy = svcSpec.ExternalTrafficPolicy + } + err := ctrl.SetControllerReference(ts, svc, r.Scheme) if err != nil { return nil, err diff --git a/internal/controller/utils.go b/internal/controller/utils.go index b0be441..084f05c 100644 --- a/internal/controller/utils.go +++ b/internal/controller/utils.go @@ -65,6 +65,10 @@ func mergeLabels(maps ...map[string]string) map[string]string { return merged } +func mergeAnnotations(maps ...map[string]string) map[string]string { + return mergeLabels(maps...) +} + func getMergedLabels(def map[string]string, scoped map[string]string) map[string]string { return mergeLabels(def, scoped) } From 85b7290fc0c1b77f4dba64572d099572f61bafa6 Mon Sep 17 00:00:00 2001 From: Hayden Date: Tue, 17 Mar 2026 04:09:51 +0800 Subject: [PATCH 2/2] restrict service configurability --- api/v1alpha1/typesensecluster_types_service.go | 12 +----------- internal/controller/typesensecluster_services.go | 3 --- internal/controller/utils.go | 4 ---- 3 files changed, 1 insertion(+), 18 deletions(-) diff --git a/api/v1alpha1/typesensecluster_types_service.go b/api/v1alpha1/typesensecluster_types_service.go index 5c8b9e9..8751bfe 100644 --- a/api/v1alpha1/typesensecluster_types_service.go +++ b/api/v1alpha1/typesensecluster_types_service.go @@ -5,21 +5,11 @@ import ( ) type ServiceSpec struct { - // +optional - Labels map[string]string `json:"labels,omitempty"` - - // +optional - Annotations map[string]string `json:"annotations,omitempty"` - // +optional // +kubebuilder:default:="ClusterIP" - // +kubebuilder:validation:Enum=ClusterIP;NodePort;LoadBalancer;ExternalName + // +kubebuilder:validation:Enum=ClusterIP;LoadBalancer Type corev1.ServiceType `json:"type"` - // +optional - // +kubebuilder:validation:Enum=Cluster;Local - InternalTrafficPolicy *corev1.ServiceInternalTrafficPolicy `json:"internalTrafficPolicy,omitempty"` - // +optional // +kubebuilder:default:="Cluster" // +kubebuilder:validation:Enum=Cluster;Local diff --git a/internal/controller/typesensecluster_services.go b/internal/controller/typesensecluster_services.go index 279c1db..0be83d0 100644 --- a/internal/controller/typesensecluster_services.go +++ b/internal/controller/typesensecluster_services.go @@ -165,10 +165,7 @@ func (r *TypesenseClusterReconciler) createService(ctx context.Context, key clie svcSpec := ts.Spec.Service if svcSpec != nil { - svc.ObjectMeta.Labels = mergeLabels(svc.ObjectMeta.Labels, svcSpec.Labels) - svc.ObjectMeta.Annotations = mergeAnnotations(svc.ObjectMeta.Annotations, svcSpec.Annotations) svc.Spec.Type = svcSpec.Type - svc.Spec.InternalTrafficPolicy = svcSpec.InternalTrafficPolicy svc.Spec.ExternalTrafficPolicy = svcSpec.ExternalTrafficPolicy } diff --git a/internal/controller/utils.go b/internal/controller/utils.go index 084f05c..b0be441 100644 --- a/internal/controller/utils.go +++ b/internal/controller/utils.go @@ -65,10 +65,6 @@ func mergeLabels(maps ...map[string]string) map[string]string { return merged } -func mergeAnnotations(maps ...map[string]string) map[string]string { - return mergeLabels(maps...) -} - func getMergedLabels(def map[string]string, scoped map[string]string) map[string]string { return mergeLabels(def, scoped) }