@@ -19,17 +19,114 @@ import (
19
19
20
20
"github.com/stretchr/testify/assert"
21
21
"github.com/stretchr/testify/require"
22
+ colfeaturegate "go.opentelemetry.io/collector/featuregate"
22
23
corev1 "k8s.io/api/core/v1"
23
24
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
24
25
logf "sigs.k8s.io/controller-runtime/pkg/log"
25
26
26
27
"github.com/open-telemetry/opentelemetry-operator/apis/v1beta1"
27
28
"github.com/open-telemetry/opentelemetry-operator/internal/config"
28
29
"github.com/open-telemetry/opentelemetry-operator/internal/naming"
30
+ "github.com/open-telemetry/opentelemetry-operator/pkg/featuregate"
29
31
)
30
32
31
33
var logger = logf .Log .WithName ("unit-tests" )
32
34
35
+ func sidecarFeatureGate (t * testing.T ) {
36
+ originalVal := featuregate .EnableNativeSidecarContainers .IsEnabled ()
37
+ t .Logf ("original is: %+v" , originalVal )
38
+ require .NoError (t , colfeaturegate .GlobalRegistry ().Set (featuregate .EnableNativeSidecarContainers .ID (), true ))
39
+ t .Cleanup (func () {
40
+ require .NoError (t , colfeaturegate .GlobalRegistry ().Set (featuregate .EnableNativeSidecarContainers .ID (), originalVal ))
41
+ })
42
+ }
43
+
44
+ func TestAddNativeSidecar (t * testing.T ) {
45
+ sidecarFeatureGate (t )
46
+ // prepare
47
+ pod := corev1.Pod {
48
+ Spec : corev1.PodSpec {
49
+ Containers : []corev1.Container {
50
+ {Name : "my-app" },
51
+ },
52
+ InitContainers : []corev1.Container {
53
+ {
54
+ Name : "my-init" ,
55
+ },
56
+ },
57
+ // cross-test: the pod has a volume already, make sure we don't remove it
58
+ Volumes : []corev1.Volume {{}},
59
+ },
60
+ }
61
+
62
+ otelcol := v1beta1.OpenTelemetryCollector {
63
+ ObjectMeta : metav1.ObjectMeta {
64
+ Name : "otelcol-native-sidecar" ,
65
+ Namespace : "some-app" ,
66
+ },
67
+ Spec : v1beta1.OpenTelemetryCollectorSpec {
68
+ Mode : v1beta1 .ModeSidecar ,
69
+ OpenTelemetryCommonFields : v1beta1.OpenTelemetryCommonFields {
70
+ Ports : []corev1.ServicePort {
71
+ {
72
+ Name : "metrics" ,
73
+ Port : 8888 ,
74
+ Protocol : corev1 .ProtocolTCP ,
75
+ },
76
+ },
77
+ InitContainers : []corev1.Container {
78
+ {
79
+ Name : "test" ,
80
+ },
81
+ },
82
+ },
83
+ },
84
+ }
85
+
86
+ otelcolYaml , err := otelcol .Spec .Config .Yaml ()
87
+ require .NoError (t , err )
88
+ cfg := config .New (config .WithCollectorImage ("some-default-image" ))
89
+
90
+ // test
91
+ changed , err := add (cfg , logger , otelcol , pod , nil )
92
+
93
+ // verify
94
+ assert .NoError (t , err )
95
+ require .Len (t , changed .Spec .Containers , 1 )
96
+ require .Len (t , changed .Spec .InitContainers , 3 )
97
+ require .Len (t , changed .Spec .Volumes , 1 )
98
+ assert .Equal (t , "some-app.otelcol-native-sidecar" ,
99
+ changed .Labels ["sidecar.opentelemetry.io/injected" ])
100
+ expectedPolicy := corev1 .ContainerRestartPolicyAlways
101
+ assert .Equal (t , corev1.Container {
102
+ Name : "otc-container" ,
103
+ Image : "some-default-image" ,
104
+ Args : []string {"--config=env:OTEL_CONFIG" },
105
+ RestartPolicy : & expectedPolicy ,
106
+ Env : []corev1.EnvVar {
107
+ {
108
+ Name : "POD_NAME" ,
109
+ ValueFrom : & corev1.EnvVarSource {
110
+ FieldRef : & corev1.ObjectFieldSelector {
111
+ FieldPath : "metadata.name" ,
112
+ },
113
+ },
114
+ },
115
+ {
116
+ Name : "OTEL_CONFIG" ,
117
+ Value : string (otelcolYaml ),
118
+ },
119
+ },
120
+ Ports : []corev1.ContainerPort {
121
+ {
122
+ Name : "metrics" ,
123
+ ContainerPort : 8888 ,
124
+ Protocol : corev1 .ProtocolTCP ,
125
+ },
126
+ },
127
+ }, changed .Spec .InitContainers [2 ])
128
+ }
129
+
33
130
func TestAddSidecarWhenNoSidecarExists (t * testing.T ) {
34
131
// prepare
35
132
pod := corev1.Pod {
@@ -144,6 +241,11 @@ func TestRemoveSidecar(t *testing.T) {
144
241
{Name : naming .Container ()},
145
242
{Name : naming .Container ()}, // two sidecars! should remove both
146
243
},
244
+ InitContainers : []corev1.Container {
245
+ {Name : "something" },
246
+ {Name : naming .Container ()}, // NOTE: native sidecar since k8s 1.28.
247
+ {Name : naming .Container ()}, // two sidecars! should remove both
248
+ },
147
249
},
148
250
}
149
251
@@ -190,6 +292,19 @@ func TestExistsIn(t *testing.T) {
190
292
},
191
293
true },
192
294
295
+ {"does-have-native-sidecar" ,
296
+ corev1.Pod {
297
+ Spec : corev1.PodSpec {
298
+ Containers : []corev1.Container {
299
+ {Name : "my-app" },
300
+ },
301
+ InitContainers : []corev1.Container {
302
+ {Name : naming .Container ()},
303
+ },
304
+ },
305
+ },
306
+ true },
307
+
193
308
{"does-not-have-sidecar" ,
194
309
corev1.Pod {
195
310
Spec : corev1.PodSpec {
0 commit comments