Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
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
Next Next commit
adds more statefulset reconciliation
  • Loading branch information
sklarsa committed Aug 5, 2023
commit 8105edf8064c16cdd5ae8b4dff7b47987c3eebce
19 changes: 12 additions & 7 deletions api/v1beta1/questdb_types.go
Original file line number Diff line number Diff line change
Expand Up @@ -52,13 +52,18 @@ type QuestDBSpec struct {

Image string `json:"image"`

Affinity *v1.Affinity `json:"affinity,omitempty"`
ExtraEnv []v1.EnvVar `json:"extraEnv,omitempty"`
ImagePullPolicy v1.PullPolicy `json:"imagePullPolicy,omitempty"`
ImagePullSecrets []v1.LocalObjectReference `json:"imagePullSecrets,omitempty"`
NodeSelector map[string]string `json:"nodeSelector,omitempty"`
Resources QuestDBResourcesSpec `json:"resources,omitempty"`
Tolerations []v1.Toleration `json:"tolerations,omitempty"`
Affinity *v1.Affinity `json:"affinity,omitempty"`
ExtraEnv []v1.EnvVar `json:"extraEnv,omitempty"`
ExtraVolumeMounts []v1.VolumeMount `json:"extraVolumeMounts,omitempty"`
ExtraVolumes []v1.Volume `json:"extraVolumes,omitempty"`
// ImagePullPolicy defaults to IfNotPresent
ImagePullPolicy v1.PullPolicy `json:"imagePullPolicy,omitempty"`
ImagePullSecrets []v1.LocalObjectReference `json:"imagePullSecrets,omitempty"`
NodeSelector map[string]string `json:"nodeSelector,omitempty"`
PodAnnotations map[string]string `json:"podAnnotations,omitempty"`
Resources QuestDBResourcesSpec `json:"resources,omitempty"`
StatefulSetAnnotations map[string]string `json:"statefulSetAnnotations,omitempty"`
Tolerations []v1.Toleration `json:"tolerations,omitempty"`
}

type QuestDBEndpointStatus struct {
Expand Down
5 changes: 5 additions & 0 deletions api/v1beta1/questdb_webhook.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ import (
"reflect"
"strings"

v1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/runtime"
ctrl "sigs.k8s.io/controller-runtime"
logf "sigs.k8s.io/controller-runtime/pkg/log"
Expand Down Expand Up @@ -107,6 +108,10 @@ func (r *QuestDB) ValidateCreate() error {
return err
}

if r.Spec.ImagePullPolicy == v1.PullPolicy("") {
r.Spec.ImagePullPolicy = v1.PullIfNotPresent
}

return nil
}

Expand Down
59 changes: 40 additions & 19 deletions internal/controller/questdb_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ import (
"sigs.k8s.io/controller-runtime/pkg/predicate"
"sigs.k8s.io/controller-runtime/pkg/source"

"github.com/davecgh/go-spew/spew"
crdv1beta1 "github.com/questdb/questdb-operator/api/v1beta1"
"github.com/questdb/questdb-operator/internal/secrets"

Expand Down Expand Up @@ -121,12 +122,17 @@ func (r *QuestDBReconciler) SetupWithManager(mgr ctrl.Manager) error {
}

func (r *QuestDBReconciler) buildStatefulSet(q *crdv1beta1.QuestDB, s secrets.QuestDBSecrets) appsv1.StatefulSet {
pullPolicy := q.Spec.ImagePullPolicy
if pullPolicy == v1.PullPolicy("") {
pullPolicy = v1.PullIfNotPresent
}

sts := appsv1.StatefulSet{
ObjectMeta: metav1.ObjectMeta{
Name: q.Name,
Namespace: q.Namespace,
Labels: q.Labels,
Name: q.Name,
Namespace: q.Namespace,
Labels: q.Labels,
Annotations: q.Spec.StatefulSetAnnotations,
},
Spec: appsv1.StatefulSetSpec{
ServiceName: q.Name,
Expand All @@ -136,34 +142,39 @@ func (r *QuestDBReconciler) buildStatefulSet(q *crdv1beta1.QuestDB, s secrets.Qu
},
Template: v1.PodTemplateSpec{
ObjectMeta: metav1.ObjectMeta{
Name: q.Name,
Namespace: q.Namespace,
Labels: q.Labels,
Name: q.Name,
Namespace: q.Namespace,
Labels: q.Labels,
Annotations: q.Spec.PodAnnotations,
},
Spec: v1.PodSpec{
Affinity: q.Spec.Affinity,
Containers: []v1.Container{
{
Name: "questdb",
Image: q.Spec.Image,
ImagePullPolicy: q.Spec.ImagePullPolicy,
ImagePullPolicy: pullPolicy,
Env: q.Spec.ExtraEnv,
Ports: []v1.ContainerPort{
{
Name: "http",
ContainerPort: 9000,
Protocol: v1.ProtocolTCP,
},
{
Name: "psql",
ContainerPort: 8812,
Protocol: v1.ProtocolTCP,
},
{
Name: "ilp",
ContainerPort: 9009,
Protocol: v1.ProtocolTCP,
},
{
Name: "metrics",
ContainerPort: 9003,
Protocol: v1.ProtocolTCP,
},
},
Resources: v1.ResourceRequirements{
Expand All @@ -175,6 +186,7 @@ func (r *QuestDBReconciler) buildStatefulSet(q *crdv1beta1.QuestDB, s secrets.Qu
InitialDelaySeconds: 5,
PeriodSeconds: 10,
TimeoutSeconds: 2,
SuccessThreshold: 1,
ProbeHandler: v1.ProbeHandler{
HTTPGet: &v1.HTTPGetAction{
Path: "/status",
Expand All @@ -197,7 +209,9 @@ func (r *QuestDBReconciler) buildStatefulSet(q *crdv1beta1.QuestDB, s secrets.Qu
},
},
},
VolumeMounts: []v1.VolumeMount{
TerminationMessagePath: "/dev/termination-log",
TerminationMessagePolicy: v1.TerminationMessageReadFile,
VolumeMounts: append([]v1.VolumeMount{
{
Name: "data",
MountPath: "/var/lib/questdb/db",
Expand All @@ -206,7 +220,7 @@ func (r *QuestDBReconciler) buildStatefulSet(q *crdv1beta1.QuestDB, s secrets.Qu
Name: "config",
MountPath: "/var/lib/questdb/conf",
},
},
}, q.Spec.ExtraVolumeMounts...),
},
},
ImagePullSecrets: q.Spec.ImagePullSecrets,
Expand All @@ -215,7 +229,7 @@ func (r *QuestDBReconciler) buildStatefulSet(q *crdv1beta1.QuestDB, s secrets.Qu
FSGroup: pointer.Int64(10001),
},
Tolerations: q.Spec.Tolerations,
Volumes: []v1.Volume{
Volumes: append([]v1.Volume{
{
Name: "data",
VolumeSource: v1.VolumeSource{
Expand All @@ -231,10 +245,11 @@ func (r *QuestDBReconciler) buildStatefulSet(q *crdv1beta1.QuestDB, s secrets.Qu
LocalObjectReference: v1.LocalObjectReference{
Name: q.Name,
},
DefaultMode: pointer.Int32(0420),
},
},
},
},
}, q.Spec.ExtraVolumes...),
},
},
},
Expand Down Expand Up @@ -298,15 +313,23 @@ func (r *QuestDBReconciler) reconcileStatefulSet(ctx context.Context, q *crdv1be

var needsUpdate bool

// Update the StatefulSet image if needed
if actual.Spec.Template.Spec.Containers[0].Image != q.Spec.Image {
actual.Spec.Template.Spec.Containers[0].Image = q.Spec.Image
if !reflect.DeepEqual(actual.Spec.Template.ObjectMeta, desired.Spec.Template.ObjectMeta) {
actual.Spec.Template.ObjectMeta = desired.ObjectMeta
needsUpdate = true
}

if !reflect.DeepEqual(actual.Spec.Template.Spec.Containers, desired.Spec.Template.Spec.Containers) {
spew.Dump(actual.Spec.Template.Spec.Containers)
spew.Dump(desired.Spec.Template.Spec.Containers)
actual.Spec.Template.Spec.Containers = desired.Spec.Template.Spec.Containers
needsUpdate = true

}

// Update the StatefulSet pgauth
if !reflect.DeepEqual(actual.Spec.Template.Spec.Containers[0].EnvFrom, desired.Spec.Template.Spec.Containers[0].EnvFrom) {
actual.Spec.Template.Spec.Containers[0].EnvFrom = desired.Spec.Template.Spec.Containers[0].EnvFrom
if !reflect.DeepEqual(actual.Spec.Template.Spec.Volumes, desired.Spec.Template.Spec.Volumes) {
spew.Dump(actual.Spec.Template.Spec.Volumes)
spew.Dump(desired.Spec.Template.Spec.Volumes)
actual.Spec.Template.Spec.Volumes = desired.Spec.Template.Spec.Volumes
needsUpdate = true
}

Expand All @@ -318,8 +341,6 @@ func (r *QuestDBReconciler) reconcileStatefulSet(ctx context.Context, q *crdv1be
r.Recorder.Event(q, v1.EventTypeNormal, "StatefulSetUpdated", "StatefulSet updated")
}

// Status updates below

// Update the StatefulSetPodsReady status
if actual.Status.ReadyReplicas != int32(q.Status.StatefulSetReadyReplicas) {
q.Status.StatefulSetReadyReplicas = int(actual.Status.ReadyReplicas)
Expand Down