Skip to content

Commit 1b19a56

Browse files
committed
- reconciler works
1 parent bf6186d commit 1b19a56

File tree

2 files changed

+97
-5
lines changed

2 files changed

+97
-5
lines changed

api/v4/kvservice_types.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,12 @@ import (
2323
// EDIT THIS FILE! THIS IS SCAFFOLDING FOR YOU TO OWN!
2424
// NOTE: json tags are required. Any new fields you add must have json tags for the fields to be serialized.
2525

26+
const (
27+
// KVServicePausedAnnotation is the annotation that pauses the reconciliation (triggers
28+
// an immediate requeue)
29+
KVServicePausedAnnotation = "kvservice.enterprise.splunk.com/paused"
30+
)
31+
2632
// KVServiceSpec defines the desired state of KVService
2733
type KVServiceSpec struct {
2834
// INSERT ADDITIONAL SPEC FIELDS - desired state of cluster

internal/controller/kvservice_controller.go

Lines changed: 91 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,21 @@ package controller
1818

1919
import (
2020
"context"
21+
"time"
2122

23+
"github.com/pkg/errors"
24+
enterprisev4 "github.com/splunk/splunk-operator/api/v4"
25+
"github.com/splunk/splunk-operator/internal/controller/common"
26+
metrics "github.com/splunk/splunk-operator/pkg/splunk/client/metrics"
27+
corev1 "k8s.io/api/core/v1"
28+
k8serrors "k8s.io/apimachinery/pkg/api/errors"
2229
"k8s.io/apimachinery/pkg/runtime"
2330
ctrl "sigs.k8s.io/controller-runtime"
2431
"sigs.k8s.io/controller-runtime/pkg/client"
32+
"sigs.k8s.io/controller-runtime/pkg/controller"
33+
"sigs.k8s.io/controller-runtime/pkg/handler"
2534
"sigs.k8s.io/controller-runtime/pkg/log"
26-
27-
enterprisev4 "github.com/splunk/splunk-operator/api/v4"
35+
"sigs.k8s.io/controller-runtime/pkg/predicate"
2836
)
2937

3038
// KVServiceReconciler reconciles a KVService object
@@ -33,6 +41,19 @@ type KVServiceReconciler struct {
3341
Scheme *runtime.Scheme
3442
}
3543

44+
//+kubebuilder:rbac:groups=apiextensions.k8s.io,resources=customresourcedefinitions,verbs=get;list
45+
//+kubebuilder:rbac:groups=core,resources=services,verbs=get;list;watch;create;update;patch;delete
46+
//+kubebuilder:rbac:groups=core,resources=services/finalizers,verbs=get;list;watch;create;update;patch;delete
47+
//+kubebuilder:rbac:groups=core,resources=serviceaccounts,verbs=get;list;watch;create;update;patch;delete
48+
//+kubebuilder:rbac:groups=core,resources=endpoints,verbs=get;list;watch;create;update;patch;delete
49+
//+kubebuilder:rbac:groups=core,resources=pods,verbs=get;list;watch;create;update;patch;delete
50+
//+kubebuilder:rbac:groups=core,resources=pods/exec,verbs=get;list;watch;create;update;patch;delete
51+
//+kubebuilder:rbac:groups=core,resources=persistentvolumeclaims,verbs=get;list;watch;create;update;patch;delete
52+
//+kubebuilder:rbac:groups=core,resources=events,verbs=get;list;watch;create;update;patch;delete
53+
//+kubebuilder:rbac:groups=core,resources=configmaps,verbs=get;list;watch;create;update;patch;delete
54+
//+kubebuilder:rbac:groups=core,resources=secrets,verbs=get;list;watch;create;update;patch;delete
55+
//+kubebuilder:rbac:groups=apps,resources=statefulsets,verbs=get;list;watch;create;update;patch;delete
56+
3657
// +kubebuilder:rbac:groups=enterprise.splunk.com,resources=kvservices,verbs=get;list;watch;create;update;patch;delete
3758
// +kubebuilder:rbac:groups=enterprise.splunk.com,resources=kvservices/status,verbs=get;update;patch
3859
// +kubebuilder:rbac:groups=enterprise.splunk.com,resources=kvservices/finalizers,verbs=update
@@ -47,16 +68,81 @@ type KVServiceReconciler struct {
4768
// For more details, check Reconcile and its Result here:
4869
// - https://pkg.go.dev/sigs.k8s.io/[email protected]/pkg/reconcile
4970
func (r *KVServiceReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
50-
_ = log.FromContext(ctx)
71+
metrics.ReconcileCounters.With(metrics.GetPrometheusLabels(req, "KVService")).Inc()
72+
defer recordInstrumentionData(time.Now(), req, "controller", "KVService")
73+
74+
reqLogger := log.FromContext(ctx)
75+
reqLogger = reqLogger.WithValues("kvservice", req.NamespacedName)
76+
77+
// Fetch the KVService
78+
instance := &enterprisev4.KVService{}
79+
err := r.Get(ctx, req.NamespacedName, instance)
80+
if err != nil {
81+
if k8serrors.IsNotFound(err) {
82+
// Request object not found, could have been deleted after
83+
// reconcile request. Owned objects are automatically
84+
// garbage collected. For additional cleanup logic use
85+
// finalizers. Return and don't requeue
86+
return ctrl.Result{}, nil
87+
}
88+
// Error reading the object - requeue the request.
89+
return ctrl.Result{}, errors.Wrap(err, "could not load kvservice data")
90+
}
91+
92+
// If the reconciliation is paused, requeue
93+
annotations := instance.GetAnnotations()
94+
if annotations != nil {
95+
if _, ok := annotations[enterprisev4.KVServicePausedAnnotation]; ok {
96+
return ctrl.Result{Requeue: true, RequeueAfter: pauseRetryDelay}, nil
97+
}
98+
}
99+
100+
reqLogger.Info("start", "CR version", instance.GetResourceVersion())
101+
102+
// ToDo: Commenting for now, will be implementing in follow-up stories
103+
// result, err := ApplyKVService(ctx, r.Client, instance)
104+
// if result.Requeue && result.RequeueAfter != 0 {
105+
// reqLogger.Info("Requeued", "period(seconds)", int(result.RequeueAfter/time.Second))
106+
// }
51107

52-
// TODO(user): your logic here
108+
// return result, err
53109

54110
return ctrl.Result{}, nil
55111
}
56112

57-
// SetupWithManager sets up the controller with the Manager.
58113
func (r *KVServiceReconciler) SetupWithManager(mgr ctrl.Manager) error {
59114
return ctrl.NewControllerManagedBy(mgr).
60115
For(&enterprisev4.KVService{}).
116+
WithEventFilter(predicate.Or(
117+
common.GenerationChangedPredicate(),
118+
common.AnnotationChangedPredicate(),
119+
common.LabelChangedPredicate(),
120+
common.SecretChangedPredicate(),
121+
common.StatefulsetChangedPredicate(),
122+
common.PodChangedPredicate(),
123+
common.ConfigMapChangedPredicate(),
124+
common.CrdChangedPredicate(),
125+
)).
126+
Watches(&corev1.Secret{},
127+
handler.EnqueueRequestForOwner(
128+
mgr.GetScheme(),
129+
mgr.GetRESTMapper(),
130+
&enterprisev4.KVService{},
131+
)).
132+
Watches(&corev1.Pod{},
133+
handler.EnqueueRequestForOwner(
134+
mgr.GetScheme(),
135+
mgr.GetRESTMapper(),
136+
&enterprisev4.KVService{},
137+
)).
138+
Watches(&corev1.ConfigMap{},
139+
handler.EnqueueRequestForOwner(
140+
mgr.GetScheme(),
141+
mgr.GetRESTMapper(),
142+
&enterprisev4.KVService{},
143+
)).
144+
WithOptions(controller.Options{
145+
MaxConcurrentReconciles: enterprisev4.TotalWorker,
146+
}).
61147
Complete(r)
62148
}

0 commit comments

Comments
 (0)