@@ -18,13 +18,21 @@ package controller
1818
1919import (
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 4970func (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.
58113func (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