123 lines
4.5 KiB
Go
123 lines
4.5 KiB
Go
/*
|
|
Copyright 2025.
|
|
|
|
Licensed under the Apache License, Version 2.0 (the "License");
|
|
you may not use this file except in compliance with the License.
|
|
You may obtain a copy of the License at
|
|
|
|
http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
Unless required by applicable law or agreed to in writing, software
|
|
distributed under the License is distributed on an "AS IS" BASIS,
|
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
See the License for the specific language governing permissions and
|
|
limitations under the License.
|
|
*/
|
|
|
|
package controller
|
|
|
|
import (
|
|
"context"
|
|
apps "k8s.io/api/apps/v1"
|
|
batch "k8s.io/api/batch/v1"
|
|
apierrors "k8s.io/apimachinery/pkg/api/errors"
|
|
"k8s.io/apimachinery/pkg/runtime"
|
|
ctrl "sigs.k8s.io/controller-runtime"
|
|
"sigs.k8s.io/controller-runtime/pkg/client"
|
|
"sigs.k8s.io/controller-runtime/pkg/controller"
|
|
"sigs.k8s.io/controller-runtime/pkg/event"
|
|
logf "sigs.k8s.io/controller-runtime/pkg/log"
|
|
"sigs.k8s.io/controller-runtime/pkg/predicate"
|
|
|
|
locustiov1alpha1 "git.lilpenguins.com/crichardson/locust-operator/api/v1alpha1"
|
|
)
|
|
|
|
// LocustClusterReconciler reconciles a LocustCluster object
|
|
type LocustClusterReconciler struct {
|
|
client.Client
|
|
Scheme *runtime.Scheme
|
|
}
|
|
|
|
// +kubebuilder:rbac:groups=locust.io,resources=locustclusters,verbs=get;list;watch;create;update;patch;delete
|
|
// +kubebuilder:rbac:groups=locust.io,resources=locustclusters/status,verbs=get;update;patch
|
|
// +kubebuilder:rbac:groups=locust.io,resources=locustclusters/finalizers,verbs=update
|
|
|
|
// Reconcile is part of the main kubernetes reconciliation loop which aims to
|
|
// move the current state of the cluster closer to the desired state.
|
|
// TODO(user): Modify the Reconcile function to compare the state specified by
|
|
// the LocustCluster object against the actual cluster state, and then
|
|
// perform operations to make the cluster state reflect the state specified by
|
|
// the user.
|
|
//
|
|
// For more details, check Reconcile and its Result here:
|
|
// - https://pkg.go.dev/sigs.k8s.io/controller-runtime@v0.20.4/pkg/reconcile
|
|
func (r *LocustClusterReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
|
|
log := logf.FromContext(ctx).WithValues()
|
|
|
|
log.Info("Looking up LocustCluster")
|
|
// logf.Log.Info("Looking up LocustCluster", "LocustClusterName", req.Name,
|
|
// "Namespace", req.Namespace)
|
|
|
|
// locustCluster, err := GetLocustCluster(r.Client, ctx, req.Namespace, req.Name)
|
|
_, err := GetLocustCluster(r.Client, ctx, req.Namespace, req.Name)
|
|
if err != nil {
|
|
if apierrors.IsNotFound(err) {
|
|
log.Info("LocustCluster not found")
|
|
// logf.Log.Info("LocustCluster not found", "LocustClusterName", req.Name,
|
|
// "Namespace", req.Namespace)
|
|
return ctrl.Result{}, nil
|
|
}
|
|
log.Error(err, "LocustCluster not found")
|
|
// logf.Log.Error(err, "Failed to lookup LocustCluster", "LocustClusterName", req.Name,
|
|
// "Namespace", req.Namespace)
|
|
return ctrl.Result{Requeue: true}, err
|
|
}
|
|
/*
|
|
podList, err := r.IsLeaderUp(log, locustCluster, ctx)
|
|
if err != nil {
|
|
return ctrl.Result{Requeue: true}, err
|
|
}
|
|
|
|
err = r.CreateUpdateLeader(log, locustCluster, ctx, podList)
|
|
if err != nil {
|
|
return ctrl.Result{Requeue: true}, err
|
|
}
|
|
*/
|
|
return ctrl.Result{}, nil
|
|
}
|
|
|
|
// SetupWithManager sets up the controller with the Manager.
|
|
func (r *LocustClusterReconciler) SetupWithManager(mgr ctrl.Manager, ctx context.Context) error {
|
|
/*
|
|
return ctrl.NewControllerManagedBy(mgr).
|
|
For(&locustiov1alpha1.LocustCluster{}).
|
|
Named("locustcluster").
|
|
Complete(r)
|
|
*/
|
|
|
|
log := logf.FromContext(ctx).WithValues()
|
|
ns := "default"
|
|
predLocustCluster := predicate.Funcs{
|
|
UpdateFunc: func(e event.UpdateEvent) bool {
|
|
log.Info("UpdateFunc", "kind", "LocustCluster", "process event", true, "event.namespace", e.ObjectNew.GetNamespace(), "event.name", e.ObjectNew.GetName(), "currentNamespace", ns)
|
|
return true
|
|
},
|
|
CreateFunc: func(e event.CreateEvent) bool {
|
|
log.Info("CreateFunc", "kind", "LocustCluster", "process event", true, "event.namespace", e.Object.GetNamespace(), "event.name", e.Object.GetName(), "currentNamespace", ns)
|
|
return true
|
|
},
|
|
DeleteFunc: func(e event.DeleteEvent) bool {
|
|
log.Info("DeleteFunc", "kind", "LocustCluster", "process event", false, "event.namespace", e.Object.GetNamespace(), "event.name", e.Object.GetName(), "currentNamespace", ns)
|
|
return false
|
|
},
|
|
}
|
|
|
|
return ctrl.NewControllerManagedBy(mgr).
|
|
For(&locustiov1alpha1.LocustCluster{}).
|
|
Owns(&batch.Job{}).
|
|
Owns(&apps.Deployment{}).
|
|
WithEventFilter(predLocustCluster).
|
|
WithOptions(controller.Options{MaxConcurrentReconciles: MaxConcurrentReconciles}).
|
|
Complete(r)
|
|
}
|