Skip to content

Commit d3e194c

Browse files
Use controller-runtime manager to access namespaces
Use controller-runtime [^1] to access Kubernetes namespaces instead of explicitly initializing an informer. It dynamically adds informers on read, so we don't need to initialize informers upfront. [^1]: https://pkg.go.dev/sigs.k8s.io/controller-runtime Fixes: c968ed4 ("watcher: Watch namespaces") Signed-off-by: Michi Mutsuzaki <[email protected]>
1 parent 24af65f commit d3e194c

File tree

6 files changed

+133
-98
lines changed

6 files changed

+133
-98
lines changed

.github/workflows/podinfo-test.yaml renamed to .github/workflows/integration-test.yaml

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
name: PodInfo Integration Test
1+
name: Integration Test
22
on:
33
pull_request:
44
types:
@@ -61,4 +61,4 @@ jobs:
6161
--set tetragonOperator.podInfo.enabled=true \
6262
--set tetragonOperator.image.override=${{ steps.vars.outputs.operatorImage }}
6363
kubectl rollout status -n kube-system deployment/tetragon-operator
64-
go test --tags=integration -v ./operator/...
64+
go test --tags=integration -v ./operator/... ./pkg/manager/...

cmd/tetragon/main.go

+4-3
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ import (
3535
tetragonGrpc "github.com/cilium/tetragon/pkg/grpc"
3636
"github.com/cilium/tetragon/pkg/health"
3737
"github.com/cilium/tetragon/pkg/logger"
38+
"github.com/cilium/tetragon/pkg/manager"
3839
"github.com/cilium/tetragon/pkg/metrics"
3940
"github.com/cilium/tetragon/pkg/metricsconfig"
4041
"github.com/cilium/tetragon/pkg/observer"
@@ -398,6 +399,9 @@ func tetragonExecuteCtx(ctx context.Context, cancel context.CancelFunc, ready fu
398399
var k8sWatcher watcher.K8sResourceWatcher
399400
if option.Config.EnableK8s {
400401
log.Info("Enabling Kubernetes API")
402+
// Start controller-runtime manager.
403+
controllerManager := manager.Get()
404+
controllerManager.Start(ctx)
401405
// retrieve k8s clients
402406
k8sClient, crdClient, err = watcher.GetK8sClients(waitCRDs)
403407
if err != nil {
@@ -416,9 +420,6 @@ func tetragonExecuteCtx(ctx context.Context, cancel context.CancelFunc, ready fu
416420
if err != nil {
417421
return err
418422
}
419-
if err := watcher.AddNamespaceInformer(k8sWatcher); err != nil {
420-
return err
421-
}
422423
} else {
423424
log.Info("Disabling Kubernetes API")
424425
k8sWatcher = watcher.NewFakeK8sWatcher(nil)

pkg/manager/manager.go

+75
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
// SPDX-License-Identifier: Apache-2.0
2+
// Copyright Authors of Tetragon
3+
4+
package manager
5+
6+
import (
7+
"context"
8+
"sync"
9+
10+
"github.com/bombsimon/logrusr/v4"
11+
"github.com/cilium/tetragon/pkg/logger"
12+
corev1 "k8s.io/api/core/v1"
13+
"k8s.io/apimachinery/pkg/runtime"
14+
"k8s.io/apimachinery/pkg/types"
15+
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
16+
clientgoscheme "k8s.io/client-go/kubernetes/scheme"
17+
ctrl "sigs.k8s.io/controller-runtime"
18+
"sigs.k8s.io/controller-runtime/pkg/client"
19+
ctrlManager "sigs.k8s.io/controller-runtime/pkg/manager"
20+
)
21+
22+
var (
23+
initOnce, startOnce sync.Once
24+
manager *ControllerManager
25+
)
26+
27+
// ControllerManager is responsible for running controller-runtime controllers,
28+
// and interacting with Kubernetes API server in general. If you need to interact
29+
// with Kubernetes API server, this is the place to start.
30+
type ControllerManager struct {
31+
Manager ctrlManager.Manager
32+
}
33+
34+
func Get() *ControllerManager {
35+
initOnce.Do(func() {
36+
ctrl.SetLogger(logrusr.New(logger.GetLogger()))
37+
scheme := runtime.NewScheme()
38+
utilruntime.Must(clientgoscheme.AddToScheme(scheme))
39+
controllerManager, err := ctrl.NewManager(ctrl.GetConfigOrDie(), ctrl.Options{Scheme: scheme})
40+
if err != nil {
41+
panic(err)
42+
}
43+
manager = &ControllerManager{
44+
Manager: controllerManager,
45+
}
46+
})
47+
return manager
48+
}
49+
50+
func (cm *ControllerManager) Start(ctx context.Context) {
51+
startOnce.Do(func() {
52+
go func() {
53+
if err := cm.Manager.Start(ctx); err != nil {
54+
panic(err)
55+
}
56+
}()
57+
cm.Manager.GetCache().WaitForCacheSync(ctx)
58+
})
59+
}
60+
61+
func (cm *ControllerManager) GetNamespace(name string) (*corev1.Namespace, error) {
62+
ns := corev1.Namespace{}
63+
if err := cm.Manager.GetCache().Get(context.Background(), types.NamespacedName{Name: name}, &ns); err != nil {
64+
return nil, err
65+
}
66+
return &ns, nil
67+
}
68+
69+
func (cm *ControllerManager) ListNamespaces() ([]corev1.Namespace, error) {
70+
namespaceList := corev1.NamespaceList{}
71+
if err := cm.Manager.GetCache().List(context.Background(), &namespaceList, &client.ListOptions{}); err != nil {
72+
return nil, err
73+
}
74+
return namespaceList.Items, nil
75+
}
+52
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
// SPDX-License-Identifier: Apache-2.0
2+
// Copyright Authors of Tetragon
3+
4+
//go:build integration
5+
6+
package manager
7+
8+
import (
9+
"context"
10+
"testing"
11+
12+
"github.com/stretchr/testify/assert"
13+
"github.com/stretchr/testify/suite"
14+
"sigs.k8s.io/controller-runtime/pkg/envtest"
15+
)
16+
17+
type ManagerTestSuite struct {
18+
suite.Suite
19+
testEnv *envtest.Environment
20+
manager *ControllerManager
21+
}
22+
23+
func (suite *ManagerTestSuite) SetupSuite() {
24+
useExistingCluster := true
25+
suite.testEnv = &envtest.Environment{
26+
UseExistingCluster: &useExistingCluster,
27+
}
28+
_, err := suite.testEnv.Start()
29+
assert.NoError(suite.T(), err)
30+
suite.manager = Get()
31+
suite.manager.Start(context.Background())
32+
}
33+
34+
func (suite *ManagerTestSuite) TestListNamespaces() {
35+
// List namespaces.
36+
namespaces, err := suite.manager.ListNamespaces()
37+
assert.NoError(suite.T(), err)
38+
assert.NotEmpty(suite.T(), namespaces)
39+
40+
// Call GetNamespace on the first namespace in the list.
41+
namespace, err := suite.manager.GetNamespace(namespaces[0].Name)
42+
assert.NoError(suite.T(), err)
43+
assert.Equal(suite.T(), namespaces[0].Name, namespace.Name)
44+
}
45+
46+
func (suite *ManagerTestSuite) TearDownSuite() {
47+
assert.NoError(suite.T(), suite.testEnv.Stop())
48+
}
49+
50+
func TestControllerSuite(t *testing.T) {
51+
suite.Run(t, new(ManagerTestSuite))
52+
}

pkg/watcher/namespace.go

-48
This file was deleted.

pkg/watcher/namespace_test.go

-45
This file was deleted.

0 commit comments

Comments
 (0)