@@ -7,25 +7,43 @@ package manager
7
7
8
8
import (
9
9
"context"
10
+ "os"
10
11
"testing"
12
+ "time"
11
13
14
+ "github.com/cilium/tetragon/pkg/reader/node"
15
+ "github.com/cilium/tetragon/pkg/watcher"
12
16
"github.com/stretchr/testify/assert"
13
17
"github.com/stretchr/testify/suite"
18
+ corev1 "k8s.io/api/core/v1"
19
+ "k8s.io/apimachinery/pkg/api/errors"
20
+ metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
21
+ "sigs.k8s.io/controller-runtime/pkg/client"
14
22
"sigs.k8s.io/controller-runtime/pkg/envtest"
15
23
)
16
24
25
+ const (
26
+ nodeName = "tetragon-dev-control-plane"
27
+ )
28
+
29
+ // ManagerTestSuite is a test suite for the ControllerManager. It assumes that
30
+ // a Kind cluster created with "make kind" is running. More specifically, it
31
+ // assumes that the cluster has a single node named "tetragon-dev-control-plane".
17
32
type ManagerTestSuite struct {
18
33
suite.Suite
19
34
testEnv * envtest.Environment
20
35
manager * ControllerManager
21
36
}
22
37
23
38
func (suite * ManagerTestSuite ) SetupSuite () {
39
+ err := os .Setenv ("NODE_NAME" , nodeName )
40
+ assert .NoError (suite .T (), err )
41
+ node .SetKubernetesNodeName ()
24
42
useExistingCluster := true
25
43
suite .testEnv = & envtest.Environment {
26
44
UseExistingCluster : & useExistingCluster ,
27
45
}
28
- _ , err : = suite .testEnv .Start ()
46
+ _ , err = suite .testEnv .Start ()
29
47
assert .NoError (suite .T (), err )
30
48
suite .manager = Get ()
31
49
suite .manager .Start (context .Background ())
@@ -43,6 +61,85 @@ func (suite *ManagerTestSuite) TestListNamespaces() {
43
61
assert .Equal (suite .T (), namespaces [0 ].Name , namespace .Name )
44
62
}
45
63
64
+ func (suite * ManagerTestSuite ) TestFindPod () {
65
+ var pods corev1.PodList
66
+ err := suite .manager .Manager .GetCache ().List (context .Background (), & pods , client .InNamespace ("kube-system" ))
67
+ assert .NoError (suite .T (), err )
68
+ assert .NotEmpty (suite .T (), pods .Items )
69
+ pod , err := suite .manager .FindPod (string (pods .Items [0 ].UID ))
70
+ assert .NoError (suite .T (), err )
71
+ assert .Equal (suite .T (), pods .Items [0 ].UID , pod .UID )
72
+ }
73
+
74
+ func (suite * ManagerTestSuite ) TestFindContainer () {
75
+ // Create a pod.
76
+ pod := & corev1.Pod {
77
+ ObjectMeta : metav1.ObjectMeta {
78
+ Name : "nginx" ,
79
+ Namespace : "kube-system" ,
80
+ },
81
+ Spec : corev1.PodSpec {
82
+ Containers : []corev1.Container {{Name : "nginx" , Image : "nginx" }},
83
+ },
84
+ }
85
+ k8sClient := suite .manager .Manager .GetClient ()
86
+ _ = k8sClient .Create (context .Background (), pod )
87
+
88
+ // Get the container ID of the pod.
89
+ podFromClient := corev1.Pod {}
90
+ containerID := ""
91
+ assert .Eventually (suite .T (), func () bool {
92
+ err := k8sClient .Get (context .Background (), client.ObjectKey {Namespace : pod .Namespace , Name : pod .Name }, & podFromClient )
93
+ if err != nil {
94
+ return false
95
+ }
96
+ containerID , err = watcher .ContainerIDKey (podFromClient .Status .ContainerStatuses [0 ].ContainerID )
97
+ if err != nil {
98
+ return false
99
+ }
100
+ return true
101
+ }, 10 * time .Second , 1 * time .Second )
102
+
103
+ // FindContainer should return the pod and container.
104
+ podFromCache , container , found := suite .manager .FindContainer (containerID )
105
+ assert .True (suite .T (), found )
106
+ assert .Equal (suite .T (), pod .Name , podFromCache .Name )
107
+ assert .Equal (suite .T (), pod .Spec .Containers [0 ].Name , container .Name )
108
+
109
+ // Delete the pod.
110
+ err := k8sClient .Delete (context .Background (), pod )
111
+ assert .NoError (suite .T (), err )
112
+ assert .Eventually (suite .T (), func () bool {
113
+ err = k8sClient .Get (context .Background (), client.ObjectKey {Namespace : pod .Namespace , Name : pod .Name }, & podFromClient )
114
+ return errors .IsNotFound (err )
115
+ }, 10 * time .Second , 1 * time .Second )
116
+
117
+ // FindContainer should still return the pod and container from the deleted pod cache.
118
+ podFromCache , container , found = suite .manager .FindContainer (containerID )
119
+ assert .True (suite .T (), found )
120
+ assert .Equal (suite .T (), pod .Name , podFromCache .Name )
121
+ assert .Equal (suite .T (), pod .Spec .Containers [0 ].Name , container .Name )
122
+ }
123
+
124
+ func (suite * ManagerTestSuite ) TestLocalPods () {
125
+ ctx , cancel := context .WithCancel (context .Background ())
126
+ defer cancel ()
127
+ err := os .Setenv ("NODE_NAME" , "nonexistent-node" )
128
+ assert .NoError (suite .T (), err )
129
+ node .SetKubernetesNodeName ()
130
+ controllerManager , err := newControllerManager (false )
131
+ assert .NoError (suite .T (), err )
132
+ go func () {
133
+ assert .NoError (suite .T (), controllerManager .Manager .Start (ctx ))
134
+ }()
135
+ controllerManager .Manager .GetCache ().WaitForCacheSync (ctx )
136
+ pods := corev1.PodList {}
137
+ err = controllerManager .Manager .GetCache ().List (context .Background (), & pods )
138
+ assert .NoError (suite .T (), err )
139
+ // Pod cache should be empty because the node name is set to a nonexistent node.
140
+ assert .Empty (suite .T (), pods .Items )
141
+ }
142
+
46
143
func (suite * ManagerTestSuite ) TearDownSuite () {
47
144
assert .NoError (suite .T (), suite .testEnv .Stop ())
48
145
}
0 commit comments