Skip to content

Commit 2cb7f5d

Browse files
committed
refactor: streamline garbage collection logic for nodes and K8s resources
1 parent 9b6dfe9 commit 2cb7f5d

3 files changed

Lines changed: 84 additions & 97 deletions

File tree

controllers/k8s_scan/deployment_handler.go

Lines changed: 2 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ import (
2020

2121
"go.mondoo.com/mondoo-operator/api/v1alpha2"
2222
"go.mondoo.com/mondoo-operator/pkg/client/mondooclient"
23-
"go.mondoo.com/mondoo-operator/pkg/constants"
2423
"go.mondoo.com/mondoo-operator/pkg/utils/k8s"
2524
"go.mondoo.com/mondoo-operator/pkg/utils/mondoo"
2625
)
@@ -612,59 +611,14 @@ func (n *DeploymentHandler) garbageCollectIfNeeded(ctx context.Context, clusterU
612611

613612
// performGarbageCollection calls the Mondoo API to garbage collect stale K8s resource scan assets.
614613
func (n *DeploymentHandler) performGarbageCollection(ctx context.Context, managedBy string) error {
615-
if n.MondooClientBuilder == nil {
616-
logger.Info("MondooClientBuilder not configured, skipping garbage collection")
617-
return nil
618-
}
619-
620-
// Read service account credentials from the creds secret
621-
credsSecret := &corev1.Secret{}
622-
credsSecretKey := client.ObjectKey{
623-
Namespace: n.Mondoo.Namespace,
624-
Name: n.Mondoo.Spec.MondooCredsSecretRef.Name,
625-
}
626-
if err := n.KubeClient.Get(ctx, credsSecretKey, credsSecret); err != nil {
627-
return fmt.Errorf("failed to get credentials secret: %w", err)
628-
}
629-
630-
saData, ok := credsSecret.Data[constants.MondooCredsSecretServiceAccountKey]
631-
if !ok {
632-
return fmt.Errorf("credentials secret missing key %q", constants.MondooCredsSecretServiceAccountKey)
633-
}
634-
635-
sa, err := mondoo.LoadServiceAccountFromFile(saData)
636-
if err != nil {
637-
return fmt.Errorf("failed to load service account: %w", err)
638-
}
639-
640-
token, err := mondoo.GenerateTokenFromServiceAccount(*sa, logger)
641-
if err != nil {
642-
return fmt.Errorf("failed to generate token: %w", err)
643-
}
644-
645-
opts := mondooclient.MondooClientOptions{
646-
ApiEndpoint: sa.ApiEndpoint,
647-
Token: token,
648-
}
649-
if n.MondooOperatorConfig != nil {
650-
opts.HttpProxy = n.MondooOperatorConfig.Spec.HttpProxy
651-
opts.HttpsProxy = n.MondooOperatorConfig.Spec.HttpsProxy
652-
opts.NoProxy = n.MondooOperatorConfig.Spec.NoProxy
653-
}
654-
655-
mondooClient, err := n.MondooClientBuilder(opts)
656-
if err != nil {
657-
return fmt.Errorf("failed to create mondoo client: %w", err)
658-
}
659-
660614
gcOpts := &mondooclient.GarbageCollectOptions{
661615
ManagedBy: managedBy,
662616
PlatformRuntime: "k8s-cluster",
663617
OlderThan: time.Now().Add(-2 * time.Hour).Format(time.RFC3339),
664618
}
665619

666-
if err := mondooClient.GarbageCollectAssets(ctx, gcOpts); err != nil {
667-
return fmt.Errorf("garbage collection API call failed: %w", err)
620+
if err := mondoo.GarbageCollectAssets(ctx, n.KubeClient, n.Mondoo, n.MondooOperatorConfig, n.MondooClientBuilder, gcOpts, logger); err != nil {
621+
return err
668622
}
669623

670624
logger.Info("Successfully performed garbage collection of K8s resource scan assets")

controllers/nodes/deployment_handler.go

Lines changed: 2 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,12 @@ package nodes
55

66
import (
77
"context"
8-
"fmt"
98
"maps"
109
"slices"
1110
"time"
1211

1312
"go.mondoo.com/mondoo-operator/api/v1alpha2"
1413
"go.mondoo.com/mondoo-operator/pkg/client/mondooclient"
15-
"go.mondoo.com/mondoo-operator/pkg/constants"
1614
"go.mondoo.com/mondoo-operator/pkg/utils/k8s"
1715
"go.mondoo.com/mondoo-operator/pkg/utils/mondoo"
1816
appsv1 "k8s.io/api/apps/v1"
@@ -437,59 +435,14 @@ func (n *DeploymentHandler) garbageCollectIfNeeded(ctx context.Context, clusterU
437435

438436
// performGarbageCollection calls the Mondoo API to garbage collect stale node scan assets.
439437
func (n *DeploymentHandler) performGarbageCollection(ctx context.Context, managedBy string) error {
440-
if n.MondooClientBuilder == nil {
441-
logger.Info("MondooClientBuilder not configured, skipping node scan garbage collection")
442-
return nil
443-
}
444-
445-
// Read service account credentials from the creds secret
446-
credsSecret := &corev1.Secret{}
447-
credsSecretKey := client.ObjectKey{
448-
Namespace: n.Mondoo.Namespace,
449-
Name: n.Mondoo.Spec.MondooCredsSecretRef.Name,
450-
}
451-
if err := n.KubeClient.Get(ctx, credsSecretKey, credsSecret); err != nil {
452-
return fmt.Errorf("failed to get credentials secret: %w", err)
453-
}
454-
455-
saData, ok := credsSecret.Data[constants.MondooCredsSecretServiceAccountKey]
456-
if !ok {
457-
return fmt.Errorf("credentials secret missing key %q", constants.MondooCredsSecretServiceAccountKey)
458-
}
459-
460-
sa, err := mondoo.LoadServiceAccountFromFile(saData)
461-
if err != nil {
462-
return fmt.Errorf("failed to load service account: %w", err)
463-
}
464-
465-
token, err := mondoo.GenerateTokenFromServiceAccount(*sa, logger)
466-
if err != nil {
467-
return fmt.Errorf("failed to generate token: %w", err)
468-
}
469-
470-
opts := mondooclient.MondooClientOptions{
471-
ApiEndpoint: sa.ApiEndpoint,
472-
Token: token,
473-
}
474-
if n.MondooOperatorConfig != nil {
475-
opts.HttpProxy = n.MondooOperatorConfig.Spec.HttpProxy
476-
opts.HttpsProxy = n.MondooOperatorConfig.Spec.HttpsProxy
477-
opts.NoProxy = n.MondooOperatorConfig.Spec.NoProxy
478-
}
479-
480-
mondooClient, err := n.MondooClientBuilder(opts)
481-
if err != nil {
482-
return fmt.Errorf("failed to create mondoo client: %w", err)
483-
}
484-
485438
gcOpts := &mondooclient.GarbageCollectOptions{
486439
ManagedBy: managedBy,
487440
Labels: map[string]string{"k8s.mondoo.com/kind": "node"},
488441
OlderThan: time.Now().Add(-2 * time.Hour).Format(time.RFC3339),
489442
}
490443

491-
if err := mondooClient.GarbageCollectAssets(ctx, gcOpts); err != nil {
492-
return fmt.Errorf("garbage collection API call failed: %w", err)
444+
if err := mondoo.GarbageCollectAssets(ctx, n.KubeClient, n.Mondoo, n.MondooOperatorConfig, n.MondooClientBuilder, gcOpts, logger); err != nil {
445+
return err
493446
}
494447

495448
logger.Info("Successfully performed garbage collection of node scan assets")

pkg/utils/mondoo/gc.go

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
// Copyright Mondoo, Inc. 2026
2+
// SPDX-License-Identifier: BUSL-1.1
3+
4+
package mondoo
5+
6+
import (
7+
"context"
8+
"fmt"
9+
10+
"github.com/go-logr/logr"
11+
corev1 "k8s.io/api/core/v1"
12+
"sigs.k8s.io/controller-runtime/pkg/client"
13+
14+
"go.mondoo.com/mondoo-operator/api/v1alpha2"
15+
"go.mondoo.com/mondoo-operator/pkg/client/mondooclient"
16+
"go.mondoo.com/mondoo-operator/pkg/constants"
17+
)
18+
19+
// GarbageCollectAssets builds a Mondoo API client from the operator's credentials and
20+
// calls GarbageCollectAssets with the provided options. This is shared between node scan
21+
// and k8s resource scan garbage collection.
22+
func GarbageCollectAssets(
23+
ctx context.Context,
24+
kubeClient client.Client,
25+
mondoo *v1alpha2.MondooAuditConfig,
26+
operatorConfig *v1alpha2.MondooOperatorConfig,
27+
clientBuilder func(mondooclient.MondooClientOptions) (mondooclient.MondooClient, error),
28+
gcOpts *mondooclient.GarbageCollectOptions,
29+
logger logr.Logger,
30+
) error {
31+
if clientBuilder == nil {
32+
logger.Info("MondooClientBuilder not configured, skipping garbage collection")
33+
return nil
34+
}
35+
36+
credsSecret := &corev1.Secret{}
37+
credsSecretKey := client.ObjectKey{
38+
Namespace: mondoo.Namespace,
39+
Name: mondoo.Spec.MondooCredsSecretRef.Name,
40+
}
41+
if err := kubeClient.Get(ctx, credsSecretKey, credsSecret); err != nil {
42+
return fmt.Errorf("failed to get credentials secret: %w", err)
43+
}
44+
45+
saData, ok := credsSecret.Data[constants.MondooCredsSecretServiceAccountKey]
46+
if !ok {
47+
return fmt.Errorf("credentials secret missing key %q", constants.MondooCredsSecretServiceAccountKey)
48+
}
49+
50+
sa, err := LoadServiceAccountFromFile(saData)
51+
if err != nil {
52+
return fmt.Errorf("failed to load service account: %w", err)
53+
}
54+
55+
token, err := GenerateTokenFromServiceAccount(*sa, logger)
56+
if err != nil {
57+
return fmt.Errorf("failed to generate token: %w", err)
58+
}
59+
60+
opts := mondooclient.MondooClientOptions{
61+
ApiEndpoint: sa.ApiEndpoint,
62+
Token: token,
63+
}
64+
if operatorConfig != nil {
65+
opts.HttpProxy = operatorConfig.Spec.HttpProxy
66+
opts.HttpsProxy = operatorConfig.Spec.HttpsProxy
67+
opts.NoProxy = operatorConfig.Spec.NoProxy
68+
}
69+
70+
mc, err := clientBuilder(opts)
71+
if err != nil {
72+
return fmt.Errorf("failed to create mondoo client: %w", err)
73+
}
74+
75+
if err := mc.GarbageCollectAssets(ctx, gcOpts); err != nil {
76+
return fmt.Errorf("garbage collection API call failed: %w", err)
77+
}
78+
79+
return nil
80+
}

0 commit comments

Comments
 (0)