From 38737741061353a156746a332390c88235ea599b Mon Sep 17 00:00:00 2001 From: rthalho Date: Wed, 3 Apr 2024 20:51:31 +0200 Subject: [PATCH 1/4] fix: bumb go version --- Dockerfile | 2 +- go.mod | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index f8b184a..81e7d02 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,6 +1,6 @@ # SPDX-License-Identifier: MIT # Build the manager binary -FROM golang:1.21.5 as builder +FROM golang:1.21.8 as builder ARG TARGETOS ARG TARGETARCH diff --git a/go.mod b/go.mod index 1569fbe..df635d4 100644 --- a/go.mod +++ b/go.mod @@ -1,7 +1,7 @@ // SPDX-License-Identifier: MIT module github.com/mercedes-benz/garm-operator -go 1.21.5 +go 1.21.8 require ( github.com/cloudbase/garm v0.1.4 From 83a9117ba916d333bd51286bb4d1c6d5924422b3 Mon Sep 17 00:00:00 2001 From: rthalho Date: Wed, 3 Apr 2024 20:52:17 +0200 Subject: [PATCH 2/4] fix: debug mode disable liveness and readiness probe to keep debug session alive --- config/overlays/debug/manager_patch.yaml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/config/overlays/debug/manager_patch.yaml b/config/overlays/debug/manager_patch.yaml index 916268f..265c680 100644 --- a/config/overlays/debug/manager_patch.yaml +++ b/config/overlays/debug/manager_patch.yaml @@ -26,6 +26,8 @@ spec: - --garm-username=admin - --garm-password=LmrBG1KcBOsDfNKq4cQTGpc0hJ0kejkk - --operator-watch-namespace=garm-operator-system + - --operator-min-idle-runners-age=1m + - --operator-runner-reconciliation=true ports: - containerPort: 2345 name: delve @@ -35,3 +37,7 @@ spec: memory: 1Gi requests: memory: 1Gi + livenessProbe: + $patch: delete + readinessProbe: + $patch: delete From b3fbd81096c9a97442732d435b2d5401803f0ffb Mon Sep 17 00:00:00 2001 From: rthalho Date: Wed, 3 Apr 2024 20:52:55 +0200 Subject: [PATCH 3/4] fix: moved filter functions and rename packages --- internal/controller/pool_controller.go | 22 ++++++++++--------- internal/controller/runner_controller.go | 14 +++++------- pkg/{ => util}/filter/filter.go | 0 pkg/util/{pool/pool.go => pools/pools.go} | 13 +++++------ .../pool/pool.go => util/pools/predicate.go} | 4 ++-- .../instance.go => util/runners/predicate.go} | 4 ++-- pkg/util/{pool => runners}/runners.go | 4 ++-- pkg/util/{pool => runners}/runners_test.go | 2 +- pkg/util/{pool => tags}/tags.go | 2 +- 9 files changed, 31 insertions(+), 34 deletions(-) rename pkg/{ => util}/filter/filter.go (100%) rename pkg/util/{pool/pool.go => pools/pools.go} (94%) rename pkg/{filter/pool/pool.go => util/pools/predicate.go} (93%) rename pkg/{filter/instance/instance.go => util/runners/predicate.go} (76%) rename pkg/util/{pool => runners}/runners.go (95%) rename pkg/util/{pool => runners}/runners_test.go (99%) rename pkg/util/{pool => tags}/tags.go (99%) diff --git a/internal/controller/pool_controller.go b/internal/controller/pool_controller.go index 0600cb4..a2b8c4b 100644 --- a/internal/controller/pool_controller.go +++ b/internal/controller/pool_controller.go @@ -34,7 +34,9 @@ import ( "github.com/mercedes-benz/garm-operator/pkg/event" "github.com/mercedes-benz/garm-operator/pkg/util/annotations" "github.com/mercedes-benz/garm-operator/pkg/util/conditions" - poolUtil "github.com/mercedes-benz/garm-operator/pkg/util/pool" + poolUtil "github.com/mercedes-benz/garm-operator/pkg/util/pools" + runnerUtil "github.com/mercedes-benz/garm-operator/pkg/util/runners" + "github.com/mercedes-benz/garm-operator/pkg/util/tags" ) // PoolReconciler reconciles a Pool object @@ -178,7 +180,7 @@ func (r *PoolReconciler) reconcileUpdate(ctx context.Context, garmClient garmCli } } - longRunningIdleRunnersCount := len(poolUtil.OldIdleRunners(config.Config.Operator.MinIdleRunnersAge, idleRunners)) + longRunningIdleRunnersCount := len(runnerUtil.OldIdleRunners(config.Config.Operator.MinIdleRunnersAge, idleRunners)) switch { case pool.Spec.MinIdleRunners == 0: @@ -188,7 +190,7 @@ func (r *PoolReconciler) reconcileUpdate(ctx context.Context, garmClient garmCli log.Info("Scaling pool", "pool", pool.Name) event.Scaling(r.Recorder, pool, fmt.Sprintf("scale idle runners down to %d", pool.Spec.MinIdleRunners)) - runners := poolUtil.DeletableRunners(ctx, idleRunners) + runners := runnerUtil.DeletableRunners(ctx, idleRunners) for _, runner := range runners { if err := instanceClient.DeleteInstance(instances.NewDeleteInstanceParams().WithInstanceName(runner.Name)); err != nil { log.Error(err, "unable to delete runner", "runner", runner.Name) @@ -200,13 +202,13 @@ func (r *PoolReconciler) reconcileUpdate(ctx context.Context, garmClient garmCli // the spec, we delete old idle runners // get all idle runners that are older than minRunnerAge - longRunningIdleRunners := poolUtil.OldIdleRunners(config.Config.Operator.MinIdleRunnersAge, idleRunners) + longRunningIdleRunners := runnerUtil.OldIdleRunners(config.Config.Operator.MinIdleRunnersAge, idleRunners) // calculate how many old runners need to be deleted to match the desired minIdleRunners - alignedRunners := poolUtil.AlignIdleRunners(int(pool.Spec.MinIdleRunners), longRunningIdleRunners) + alignedRunners := runnerUtil.AlignIdleRunners(int(pool.Spec.MinIdleRunners), longRunningIdleRunners) // extract runners which are deletable - runners := poolUtil.DeletableRunners(ctx, alignedRunners) + runners := runnerUtil.DeletableRunners(ctx, alignedRunners) for _, runner := range runners { log.Info("Scaling pool", "pool", pool.Name) event.Scaling(r.Recorder, pool, fmt.Sprintf("scale long running idle runners down to %d", pool.Spec.MinIdleRunners)) @@ -259,13 +261,13 @@ func (r *PoolReconciler) reconcileDelete(ctx context.Context, garmClient garmCli } // get all runners - runners, err := poolUtil.GetAllRunners(ctx, pool, instanceClient) + runners, err := runnerUtil.GetRunnersByPoolID(ctx, pool, instanceClient) if err != nil { return ctrl.Result{Requeue: true, RequeueAfter: 1 * time.Minute}, err } // get a list of all idle runners to trigger deletion - deletableRunners := poolUtil.DeletableRunners(ctx, runners) + deletableRunners := runnerUtil.DeletableRunners(ctx, runners) if err != nil { return ctrl.Result{Requeue: true, RequeueAfter: 1 * time.Minute}, err } @@ -355,7 +357,7 @@ func (r *PoolReconciler) comparePoolSpecs(ctx context.Context, pool *garmoperato // as there are some "special" tags, which aren't set by the user and aren't part of the pool spec // we need to "discover" them and add them to the pool spec before comparing - poolTags, err := poolUtil.CreateComparableRunnerTags(pool.Spec.Tags, pool.Spec.OSArch, pool.Spec.OSType) + poolTags, err := tags.CreateComparableRunnerTags(pool.Spec.Tags, pool.Spec.OSArch, pool.Spec.OSType) if err != nil { return false, []params.Instance{}, err } @@ -406,7 +408,7 @@ func (r *PoolReconciler) comparePoolSpecs(ctx context.Context, pool *garmoperato } // we are only interested in IdleRunners - idleInstances := poolUtil.IdleRunners(ctx, garmPool.Payload.Instances) + idleInstances := runnerUtil.IdleRunners(ctx, garmPool.Payload.Instances) // empty instances for comparison garmPool.Payload.Instances = nil diff --git a/internal/controller/runner_controller.go b/internal/controller/runner_controller.go index 071b5b3..2a92928 100644 --- a/internal/controller/runner_controller.go +++ b/internal/controller/runner_controller.go @@ -29,8 +29,8 @@ import ( garmClient "github.com/mercedes-benz/garm-operator/pkg/client" "github.com/mercedes-benz/garm-operator/pkg/client/key" "github.com/mercedes-benz/garm-operator/pkg/config" - "github.com/mercedes-benz/garm-operator/pkg/filter" - instancefilter "github.com/mercedes-benz/garm-operator/pkg/filter/instance" + "github.com/mercedes-benz/garm-operator/pkg/util/filter" + runnerUtil "github.com/mercedes-benz/garm-operator/pkg/util/runners" ) // RunnerReconciler reconciles a Runner object @@ -51,7 +51,7 @@ func (r *RunnerReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctr func (r *RunnerReconciler) reconcile(ctx context.Context, req ctrl.Request, instanceClient garmClient.InstanceClient) (ctrl.Result, error) { // try fetch runner instance in garm db with events coming from reconcile loop events of RunnerCR or from manually enqueued events of garm api. - garmRunner, err := r.getGarmRunnerInstance(instanceClient, req.Name) + garmRunner, err := r.getGarmRunnerInstanceByName(instanceClient, req.Name) if err != nil { return ctrl.Result{}, err } @@ -124,13 +124,13 @@ func (r *RunnerReconciler) reconcileDelete(ctx context.Context, runnerClient gar return ctrl.Result{}, nil } -func (r *RunnerReconciler) getGarmRunnerInstance(client garmClient.InstanceClient, name string) (*params.Instance, error) { +func (r *RunnerReconciler) getGarmRunnerInstanceByName(client garmClient.InstanceClient, name string) (*params.Instance, error) { allInstances, err := client.ListInstances(instances.NewListInstancesParams().WithDefaults()) if err != nil { return nil, err } - filteredInstances := filter.Match(allInstances.Payload, instancefilter.MatchesName(name)) + filteredInstances := filter.Match(allInstances.Payload, runnerUtil.MatchesName(name)) if len(filteredInstances) == 0 { return nil, nil } @@ -230,10 +230,6 @@ func (r *RunnerReconciler) EnqueueRunnerInstances(ctx context.Context, instanceC return err } - if len(pools.Items) < 1 { - return nil - } - // fetching runners by pools to ensure only runners belonging to pools in same namespace are being shown garmRunnerInstances, err := r.fetchRunnerInstancesByNamespacedPools(instanceClient, pools) if err != nil { diff --git a/pkg/filter/filter.go b/pkg/util/filter/filter.go similarity index 100% rename from pkg/filter/filter.go rename to pkg/util/filter/filter.go diff --git a/pkg/util/pool/pool.go b/pkg/util/pools/pools.go similarity index 94% rename from pkg/util/pool/pool.go rename to pkg/util/pools/pools.go index cf3c2be..52079fd 100644 --- a/pkg/util/pool/pool.go +++ b/pkg/util/pools/pools.go @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -package pool +package pools import ( "context" @@ -17,8 +17,7 @@ import ( garmoperatorv1alpha1 "github.com/mercedes-benz/garm-operator/api/v1alpha1" garmClient "github.com/mercedes-benz/garm-operator/pkg/client" - "github.com/mercedes-benz/garm-operator/pkg/filter" - poolfilter "github.com/mercedes-benz/garm-operator/pkg/filter/pool" + "github.com/mercedes-benz/garm-operator/pkg/util/filter" ) func GetGarmPoolBySpecs(ctx context.Context, garmClient garmClient.PoolClient, pool *garmoperatorv1alpha1.Pool, image *garmoperatorv1alpha1.Image, gitHubScopeRef garmoperatorv1alpha1.GitHubScope) (*params.Pool, error) { @@ -38,10 +37,10 @@ func GetGarmPoolBySpecs(ctx context.Context, garmClient garmClient.PoolClient, p } filteredGarmPools := filter.Match(garmPools.Payload, - poolfilter.MatchesImage(image.Spec.Tag), - poolfilter.MatchesFlavor(pool.Spec.Flavor), - poolfilter.MatchesProvider(pool.Spec.ProviderName), - poolfilter.MatchesGitHubScope(scope, githubScopeRefID), + MatchesImage(image.Spec.Tag), + MatchesFlavor(pool.Spec.Flavor), + MatchesProvider(pool.Spec.ProviderName), + MatchesGitHubScope(scope, githubScopeRefID), ) log.WithValues("image", image.Spec.Tag, diff --git a/pkg/filter/pool/pool.go b/pkg/util/pools/predicate.go similarity index 93% rename from pkg/filter/pool/pool.go rename to pkg/util/pools/predicate.go index 94b3ab0..3ac36d3 100644 --- a/pkg/filter/pool/pool.go +++ b/pkg/util/pools/predicate.go @@ -1,12 +1,12 @@ // SPDX-License-Identifier: MIT -package pool +package pools import ( "github.com/cloudbase/garm/params" garmoperatorv1alpha1 "github.com/mercedes-benz/garm-operator/api/v1alpha1" - "github.com/mercedes-benz/garm-operator/pkg/filter" + "github.com/mercedes-benz/garm-operator/pkg/util/filter" ) func MatchesGitHubScope(scope garmoperatorv1alpha1.GitHubScopeKind, id string) filter.Predicate[params.Pool] { diff --git a/pkg/filter/instance/instance.go b/pkg/util/runners/predicate.go similarity index 76% rename from pkg/filter/instance/instance.go rename to pkg/util/runners/predicate.go index 397cf01..b677365 100644 --- a/pkg/filter/instance/instance.go +++ b/pkg/util/runners/predicate.go @@ -1,13 +1,13 @@ // SPDX-License-Identifier: MIT -package instance +package runners import ( "strings" "github.com/cloudbase/garm/params" - "github.com/mercedes-benz/garm-operator/pkg/filter" + "github.com/mercedes-benz/garm-operator/pkg/util/filter" ) func MatchesName(name string) filter.Predicate[params.Instance] { diff --git a/pkg/util/pool/runners.go b/pkg/util/runners/runners.go similarity index 95% rename from pkg/util/pool/runners.go rename to pkg/util/runners/runners.go index e5b2b0b..5f8380c 100644 --- a/pkg/util/pool/runners.go +++ b/pkg/util/runners/runners.go @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -package pool +package runners import ( "context" @@ -15,7 +15,7 @@ import ( garmClient "github.com/mercedes-benz/garm-operator/pkg/client" ) -func GetAllRunners(ctx context.Context, pool *garmoperatorv1alpha1.Pool, instanceClient garmClient.InstanceClient) ([]params.Instance, error) { +func GetRunnersByPoolID(ctx context.Context, pool *garmoperatorv1alpha1.Pool, instanceClient garmClient.InstanceClient) ([]params.Instance, error) { log := log.FromContext(ctx) log.Info("discover idle runners", "pool", pool.Name) diff --git a/pkg/util/pool/runners_test.go b/pkg/util/runners/runners_test.go similarity index 99% rename from pkg/util/pool/runners_test.go rename to pkg/util/runners/runners_test.go index 7e686da..49114da 100644 --- a/pkg/util/pool/runners_test.go +++ b/pkg/util/runners/runners_test.go @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -package pool +package runners import ( "context" diff --git a/pkg/util/pool/tags.go b/pkg/util/tags/tags.go similarity index 99% rename from pkg/util/pool/tags.go rename to pkg/util/tags/tags.go index 832cca3..75cb8b7 100644 --- a/pkg/util/pool/tags.go +++ b/pkg/util/tags/tags.go @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -package pool +package tags import ( "sort" From db84a355e03676b49e9e2a09bcff792f0841b27e Mon Sep 17 00:00:00 2001 From: rthalho Date: Mon, 13 May 2024 10:31:05 +0200 Subject: [PATCH 4/4] fix: use filter generic filter func --- api/v1alpha1/pool_types.go | 34 +++---------- api/v1alpha1/pool_types_test.go | 61 +++++++++++++++++++++--- api/v1alpha1/pool_webhook.go | 8 ++-- internal/controller/runner_controller.go | 6 +-- pkg/util/filter/filter.go | 10 ++-- 5 files changed, 75 insertions(+), 44 deletions(-) diff --git a/api/v1alpha1/pool_types.go b/api/v1alpha1/pool_types.go index dcad148..7231f39 100644 --- a/api/v1alpha1/pool_types.go +++ b/api/v1alpha1/pool_types.go @@ -6,6 +6,8 @@ import ( commonParams "github.com/cloudbase/garm-provider-common/params" corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + + "github.com/mercedes-benz/garm-operator/pkg/util/filter" ) // EDIT THIS FILE! THIS IS SCAFFOLDING FOR YOU TO OWN! @@ -98,54 +100,32 @@ func init() { SchemeBuilder.Register(&Pool{}, &PoolList{}) } -// +k8s:deepcopy-gen=false -type Predicate func(p Pool) bool - -func MatchesImage(image string) Predicate { +func MatchesImage(image string) filter.Predicate[Pool] { return func(p Pool) bool { return p.Spec.ImageName == image } } -func MatchesFlavor(flavor string) Predicate { +func MatchesFlavor(flavor string) filter.Predicate[Pool] { return func(p Pool) bool { return p.Spec.Flavor == flavor } } -func MatchesProvider(provider string) Predicate { +func MatchesProvider(provider string) filter.Predicate[Pool] { return func(p Pool) bool { return p.Spec.ProviderName == provider } } -func MatchesGitHubScope(name, kind string) Predicate { +func MatchesGitHubScope(name, kind string) filter.Predicate[Pool] { return func(p Pool) bool { return p.Spec.GitHubScopeRef.Name == name && p.Spec.GitHubScopeRef.Kind == kind } } -func MatchesID(id string) Predicate { +func MatchesID(id string) filter.Predicate[Pool] { return func(p Pool) bool { return p.Status.ID == id } } - -func (p *PoolList) FilterByFields(predicates ...Predicate) { - var filteredItems []Pool - - for _, pool := range p.Items { - match := true - for _, predicate := range predicates { - if !predicate(pool) { - match = false - break - } - } - if match { - filteredItems = append(filteredItems, pool) - } - } - - p.Items = filteredItems -} diff --git a/api/v1alpha1/pool_types_test.go b/api/v1alpha1/pool_types_test.go index 4bb932a..4c25309 100644 --- a/api/v1alpha1/pool_types_test.go +++ b/api/v1alpha1/pool_types_test.go @@ -8,6 +8,8 @@ import ( corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/utils/ptr" + + "github.com/mercedes-benz/garm-operator/pkg/util/filter" ) func TestPoolList_FilterByFields(t *testing.T) { @@ -17,7 +19,7 @@ func TestPoolList_FilterByFields(t *testing.T) { Items []Pool } type args struct { - predicates []Predicate + predicates []filter.Predicate[Pool] } tests := []struct { name string @@ -68,7 +70,7 @@ func TestPoolList_FilterByFields(t *testing.T) { }, }, args: args{ - predicates: []Predicate{ + predicates: []filter.Predicate[Pool]{ MatchesImage("ubuntu-2204"), MatchesFlavor("large"), MatchesProvider("openstack"), @@ -120,7 +122,7 @@ func TestPoolList_FilterByFields(t *testing.T) { }, }, args: args{ - predicates: []Predicate{ + predicates: []filter.Predicate[Pool]{ MatchesImage("ubuntu-2404"), MatchesFlavor("large"), MatchesProvider("openstack"), @@ -129,6 +131,53 @@ func TestPoolList_FilterByFields(t *testing.T) { }, length: 0, }, + { + name: "no predicates provided", + fields: fields{ + TypeMeta: metav1.TypeMeta{}, + ListMeta: metav1.ListMeta{}, + Items: []Pool{ + { + TypeMeta: metav1.TypeMeta{}, + ObjectMeta: metav1.ObjectMeta{ + Name: "ubuntu-2004-large", + Namespace: "test", + }, + Spec: PoolSpec{ + ImageName: "ubuntu-2004", + Flavor: "large", + ProviderName: "openstack", + GitHubScopeRef: corev1.TypedLocalObjectReference{ + Name: "test", + Kind: "Enterprise", + APIGroup: ptr.To[string]("github.com"), + }, + }, + }, + { + TypeMeta: metav1.TypeMeta{}, + ObjectMeta: metav1.ObjectMeta{ + Name: "ubuntu-2204-large", + Namespace: "test", + }, + Spec: PoolSpec{ + ImageName: "ubuntu-2204", + Flavor: "large", + ProviderName: "openstack", + GitHubScopeRef: corev1.TypedLocalObjectReference{ + Name: "test", + Kind: "Enterprise", + APIGroup: ptr.To[string]("github.com"), + }, + }, + }, + }, + }, + args: args{ + predicates: []filter.Predicate[Pool]{}, + }, + length: 2, + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { @@ -138,10 +187,10 @@ func TestPoolList_FilterByFields(t *testing.T) { Items: tt.fields.Items, } - p.FilterByFields(tt.args.predicates...) + filteredPools := filter.Match(p.Items, tt.args.predicates...) - if len(p.Items) != tt.length { - t.Errorf("FilterByFields() = %v, want %v", len(p.Items), tt.length) + if len(filteredPools) != tt.length { + t.Errorf("FilterByFields() = %v, want %v", len(filteredPools), tt.length) } }) } diff --git a/api/v1alpha1/pool_webhook.go b/api/v1alpha1/pool_webhook.go index e9ea353..4688f05 100644 --- a/api/v1alpha1/pool_webhook.go +++ b/api/v1alpha1/pool_webhook.go @@ -17,6 +17,8 @@ import ( logf "sigs.k8s.io/controller-runtime/pkg/log" "sigs.k8s.io/controller-runtime/pkg/webhook" "sigs.k8s.io/controller-runtime/pkg/webhook/admission" + + "github.com/mercedes-benz/garm-operator/pkg/util/filter" ) // log is for logging in this package. @@ -58,15 +60,15 @@ func (r *Pool) ValidateCreate() (admission.Warnings, error) { return nil, err } - poolList.FilterByFields( + filteredPoolList := filter.Match(poolList.Items, MatchesFlavor(r.Spec.Flavor), MatchesImage(r.Spec.ImageName), MatchesProvider(r.Spec.ProviderName), MatchesGitHubScope(r.Spec.GitHubScopeRef.Name, r.Spec.GitHubScopeRef.Kind), ) - if len(poolList.Items) > 0 { - existing := poolList.Items[0] + if len(filteredPoolList) > 0 { + existing := filteredPoolList[0] return nil, apierrors.NewBadRequest( fmt.Sprintf("can not create pool, pool=%s with same image=%s, flavor=%s and provider=%s already exists for specified GitHubScope=%s", existing.Name, existing.Spec.ImageName, existing.Spec.Flavor, existing.Spec.ProviderName, existing.Spec.GitHubScopeRef.Name)) } diff --git a/internal/controller/runner_controller.go b/internal/controller/runner_controller.go index 2a92928..5958f10 100644 --- a/internal/controller/runner_controller.go +++ b/internal/controller/runner_controller.go @@ -162,10 +162,10 @@ func (r *RunnerReconciler) updateRunnerStatus(ctx context.Context, runner *garmo pools := &garmoperatorv1alpha1.PoolList{} err := r.List(ctx, pools) if err == nil { - pools.FilterByFields(garmoperatorv1alpha1.MatchesID(garmRunner.PoolID)) + filteredPools := filter.Match(pools.Items, garmoperatorv1alpha1.MatchesID(garmRunner.PoolID)) - if len(pools.Items) > 0 { - poolName = pools.Items[0].Name + if len(filteredPools) > 0 { + poolName = filteredPools[0].Name } } diff --git a/pkg/util/filter/filter.go b/pkg/util/filter/filter.go index c21852d..3c64ec1 100644 --- a/pkg/util/filter/filter.go +++ b/pkg/util/filter/filter.go @@ -5,20 +5,20 @@ package filter type Predicate[T any] func(T) bool func Match[T any](items []T, predicates ...Predicate[T]) []T { - var filteredPools []T + var resultList []T - for _, pool := range items { + for _, item := range items { match := true for _, predicate := range predicates { - if !predicate(pool) { + if !predicate(item) { match = false break } } if match { - filteredPools = append(filteredPools, pool) + resultList = append(resultList, item) } } - return filteredPools + return resultList }