From 60f4f654070ab475a0eab7ea7eb961f5aef5d564 Mon Sep 17 00:00:00 2001 From: Chris Richardson Date: Tue, 13 May 2025 08:01:53 -0400 Subject: [PATCH] asD --- internal/controller/build.go | 16 ++++++ internal/controller/common.go | 56 ++++++++++++++++++- .../controller/locustcluster_controller.go | 23 +++++--- internal/controller/sync.go | 35 +++++++++++- 4 files changed, 120 insertions(+), 10 deletions(-) create mode 100644 internal/controller/build.go diff --git a/internal/controller/build.go b/internal/controller/build.go new file mode 100644 index 0000000..62f9429 --- /dev/null +++ b/internal/controller/build.go @@ -0,0 +1,16 @@ +package controller + +import ( + "context" + locustCluster "git.lilpenguins.com/crichardson/locust-operator/api/v1alpha1" + "github.com/go-logr/logr" +) + +func (r *LocustClusterReconciler) CreateLeaderJob(log logr.Logger, locustCluster *locustCluster.LocustCluster, ctx context.Context) error { + return nil +} + +func (r *LocustClusterReconciler) CreateLeaderService(log logr.Logger, locustCluster *locustCluster.LocustCluster, + ctx context.Context) error { + return nil +} diff --git a/internal/controller/common.go b/internal/controller/common.go index 1f0d6f0..ddd0482 100644 --- a/internal/controller/common.go +++ b/internal/controller/common.go @@ -1,6 +1,56 @@ package controller -import "sigs.k8s.io/controller-runtime/pkg/client" +import ( + "fmt" + "sigs.k8s.io/controller-runtime/pkg/client" + "time" +) + +const ( + MaxConcurrentReconciles = 20 + NamespaceDefault = "pie-coordination-dev" + TestEnvCheck = "TEST_ENV_CHECK" + KubernetesClusterEnv = "KUBERNETES_CLUSTER" + LocustOperatorVersionDesc = "Locust Operator Version" + LeaderContainer = "locustio/locust:2.37.1" + LeaderTestFile = "/usr/local/locust/dummy.py" + LeaderPortNameWeb = "locust-web" + LeaderPortProtocol = "TCP" + LeaderPortWeb = 8089 + LeaderPortNameLocust1 = "listener1" + LeaderPortListener1 = 5557 + LeaderPortNameLocust2 = "listener2" + LeaderPortListener2 = 5558 + LeaderMaxCPU = "0.5" + LeaderMaxMemory = "1Gi" + LeaderMinCPU = "0.25" + LeaderMinMemory = "512Mi" + LeaderBuildParamConfig = "/usr/local/etc/locust_build_params" + MosaicContainer = "docker.apple.com/telemetry/mosaic-agent:2.19.1" + MosaicPortNameHttp = "mosaic-http" + MosaicPortHttp = 8080 + MosaicPortProtocol = "TCP" + MosaicVolumeConfigPath = "/usr/local/mosaic/conf.d" + MosaicEndpointSuffix = "PROMETHEUS" + GrafanaEndpoint = "playground-fuji.grafana.telemetry.g.apple.com" + WorkerMaxCPU = "2" + WorkerMinCPU = "1" + WorkerMaxMemory = "3Gi" + WorkerMinMemory = "1Gi" + WorkerMaxStorage = "20Gi" + WorkerMinStorage = "10Gi" + SDRIdentName = "identity-certs" + CertsMount = "/certs/" + TimeoutDefault = time.Second * 20 + TimeoutInterval = time.Millisecond * 250 + SUCCESS bool = true + FAILURE bool = false + KeyMosaic = "mosaic" + KeyLeader = "leader" + KeyWorker = "worker" + KeyOperator = "operator" + KeyDB = "locust-db" +) func BuildObjectKey(namespace string, name string) client.ObjectKey { return client.ObjectKey{ @@ -8,3 +58,7 @@ func BuildObjectKey(namespace string, name string) client.ObjectKey { Name: name, } } + +func BuildName(name string, suffix string) string { + return fmt.Sprintf("%s-%s", name, suffix) +} diff --git a/internal/controller/locustcluster_controller.go b/internal/controller/locustcluster_controller.go index 07eba21..7d471f6 100644 --- a/internal/controller/locustcluster_controller.go +++ b/internal/controller/locustcluster_controller.go @@ -48,24 +48,31 @@ type LocustClusterReconciler struct { // 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) { - _ = logf.FromContext(ctx) + log := logf.FromContext(ctx).WithValues() - logf.Log.Info("Looking up LocustCluster", "LocustClusterName", req.Name, - "Namespace", req.Namespace) + 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) + locustCluster, err := GetLocustCluster(r.Client, ctx, req.Namespace, req.Name) if err != nil { if apierrors.IsNotFound(err) { - logf.Log.Info("LocustCluster not found", "LocustClusterName", req.Name, - "Namespace", req.Namespace) + log.Info("LocustCluster not found") + // logf.Log.Info("LocustCluster not found", "LocustClusterName", req.Name, + // "Namespace", req.Namespace) return ctrl.Result{}, nil } - logf.Log.Error(err, "Failed to lookup LocustCluster", "LocustClusterName", req.Name, - "Namespace", req.Namespace) + 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) + + r.CreateUpdateLeader(log, locustCluster, ctx, podList) + return ctrl.Result{}, nil } diff --git a/internal/controller/sync.go b/internal/controller/sync.go index a7a661d..a236d92 100644 --- a/internal/controller/sync.go +++ b/internal/controller/sync.go @@ -2,8 +2,9 @@ package controller import ( "context" - locustCluster "git.lilpenguins.com/crichardson/locust-operator/api/v1alpha1" + "github.com/go-logr/logr" + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "sigs.k8s.io/controller-runtime/pkg/client" ) @@ -16,3 +17,35 @@ func GetLocustCluster(client client.Client, ctx context.Context, namespace strin } return cluster, nil } + +func (r *LocustClusterReconciler) IsLeaderUp(log logr.Logger, locustCluster *locustCluster.LocustCluster, ctx context.Context) (*unstructured.UnstructuredList, error) { + podkind := &unstructured.UnstructuredList{} + podkind.SetKind("pod") + podkind.SetAPIVersion("v1") + + searchLabels := map[string]string{ + "job-name": BuildName(locustCluster.GetName(), KeyLeader), + } + err := r.List(ctx, podkind, client.InNamespace(locustCluster.Namespace), client.MatchingLabels(searchLabels)) + if err != nil { + log.Info("Leader not found") + return nil, err + } + return podkind, nil +} + +func (r *LocustClusterReconciler) CreateUpdateLeader(log logr.Logger, locustCluster *locustCluster.LocustCluster, ctx context.Context, + podList *unstructured.UnstructuredList) error { + var err error + if len(podList.Items) == 0 { + if err = r.CreateLeaderJob(log, locustCluster, ctx); err != nil { + log.Error(err, "Failed to create leader") + return err + } + if err = r.CreateLeaderService(log, locustCluster, ctx); err != nil { + log.Error(err, "Failed to create leader service") + return err + } + } + return err +}