Skip to content

Commit 56f1361

Browse files
committed
feat: Add tests and add feature to update daemonset to have selector
1 parent 18e50b0 commit 56f1361

File tree

2 files changed

+182
-19
lines changed

2 files changed

+182
-19
lines changed

internal/status/collector/collector.go

+5-19
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,3 @@
1-
// Copyright The OpenTelemetry Authors
2-
//
3-
// Licensed under the Apache License, Version 2.0 (the "License");
4-
// you may not use this file except in compliance with the License.
5-
// You may obtain a copy of the License at
6-
//
7-
// http://www.apache.org/licenses/LICENSE-2.0
8-
//
9-
// Unless required by applicable law or agreed to in writing, software
10-
// distributed under the License is distributed on an "AS IS" BASIS,
11-
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12-
// See the License for the specific language governing permissions and
13-
// limitations under the License.
14-
151
package collector
162

173
import (
@@ -32,27 +18,26 @@ import (
3218

3319
func UpdateCollectorStatus(ctx context.Context, cli client.Client, changed *v1alpha1.OpenTelemetryCollector) error {
3420
if changed.Status.Version == "" {
35-
// a version is not set, otherwise let the upgrade mechanism take care of it!
3621
changed.Status.Version = version.OpenTelemetryCollector()
3722
}
23+
3824
mode := changed.Spec.Mode
39-
if mode != v1alpha1.ModeDeployment && mode != v1alpha1.ModeStatefulSet {
25+
26+
if mode != v1alpha1.ModeDeployment && mode != v1alpha1.ModeStatefulSet && mode != v1alpha1.ModeDaemonSet {
4027
changed.Status.Scale.Replicas = 0
4128
changed.Status.Scale.Selector = ""
4229
return nil
4330
}
4431

4532
name := naming.Collector(changed.Name)
4633

47-
// Set the scale selector
4834
labels := manifestutils.Labels(changed.ObjectMeta, name, changed.Spec.Image, collector.ComponentOpenTelemetryCollector, []string{})
4935
selector, err := metav1.LabelSelectorAsSelector(&metav1.LabelSelector{MatchLabels: labels})
5036
if err != nil {
5137
return fmt.Errorf("failed to get selector for labelSelector: %w", err)
5238
}
5339
changed.Status.Scale.Selector = selector.String()
5440

55-
// Set the scale replicas
5641
objKey := client.ObjectKey{
5742
Namespace: changed.GetNamespace(),
5843
Name: naming.Collector(changed.Name),
@@ -63,7 +48,7 @@ func UpdateCollectorStatus(ctx context.Context, cli client.Client, changed *v1al
6348
var statusReplicas string
6449
var statusImage string
6550

66-
switch mode { // nolint:exhaustive
51+
switch mode {
6752
case v1alpha1.ModeDeployment:
6853
obj := &appsv1.Deployment{}
6954
if err := cli.Get(ctx, objKey, obj); err != nil {
@@ -91,6 +76,7 @@ func UpdateCollectorStatus(ctx context.Context, cli client.Client, changed *v1al
9176
}
9277
statusImage = obj.Spec.Template.Spec.Containers[0].Image
9378
}
79+
9480
changed.Status.Scale.Replicas = replicas
9581
changed.Status.Image = statusImage
9682
changed.Status.Scale.StatusReplicas = statusReplicas
+177
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,177 @@
1+
package collector
2+
3+
import (
4+
"context"
5+
"testing"
6+
7+
"github.com/open-telemetry/opentelemetry-operator/apis/v1alpha1"
8+
"github.com/stretchr/testify/assert"
9+
appsv1 "k8s.io/api/apps/v1"
10+
corev1 "k8s.io/api/core/v1"
11+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
12+
"sigs.k8s.io/controller-runtime/pkg/client"
13+
"sigs.k8s.io/controller-runtime/pkg/client/fake"
14+
)
15+
16+
func TestUpdateCollectorStatusUnsupported(t *testing.T) {
17+
ctx := context.TODO()
18+
cli := client.Client(fake.NewFakeClient())
19+
20+
changed := &v1alpha1.OpenTelemetryCollector{
21+
ObjectMeta: metav1.ObjectMeta{
22+
Name: "test-sidecar",
23+
Namespace: "default",
24+
},
25+
Spec: v1alpha1.OpenTelemetryCollectorSpec{
26+
Mode: v1alpha1.ModeSidecar,
27+
},
28+
}
29+
30+
err := UpdateCollectorStatus(ctx, cli, changed)
31+
assert.NoError(t, err)
32+
33+
assert.Equal(t, int32(0), changed.Status.Scale.Replicas, "expected replicas to be 0")
34+
assert.Equal(t, "", changed.Status.Scale.Selector, "expected selector to be empty")
35+
}
36+
37+
func createMockKubernetesClientDeployment() client.Client {
38+
deployment := &appsv1.Deployment{
39+
ObjectMeta: metav1.ObjectMeta{
40+
Name: "test-deployment-collector",
41+
Namespace: "default",
42+
},
43+
Status: appsv1.DeploymentStatus{
44+
Replicas: 1,
45+
ReadyReplicas: 1,
46+
},
47+
Spec: appsv1.DeploymentSpec{
48+
Template: corev1.PodTemplateSpec{
49+
Spec: corev1.PodSpec{
50+
Containers: []corev1.Container{
51+
{
52+
Name: "app",
53+
Image: "app:latest",
54+
},
55+
},
56+
},
57+
},
58+
},
59+
}
60+
return fake.NewClientBuilder().WithObjects(deployment).Build()
61+
}
62+
63+
func TestUpdateCollectorStatusDeploymentMode(t *testing.T) {
64+
ctx := context.TODO()
65+
cli := createMockKubernetesClientDeployment()
66+
67+
changed := &v1alpha1.OpenTelemetryCollector{
68+
ObjectMeta: metav1.ObjectMeta{
69+
Name: "test-deployment",
70+
Namespace: "default",
71+
},
72+
Spec: v1alpha1.OpenTelemetryCollectorSpec{
73+
Mode: v1alpha1.ModeDeployment,
74+
},
75+
}
76+
77+
err := UpdateCollectorStatus(ctx, cli, changed)
78+
assert.NoError(t, err)
79+
80+
assert.Equal(t, int32(1), changed.Status.Scale.Replicas, "expected replicas to be 1")
81+
assert.Equal(t, "1/1", changed.Status.Scale.StatusReplicas, "expected status replicas to be 1/1")
82+
assert.Equal(t, "app:latest", changed.Status.Image, "expected image to be app:latest")
83+
}
84+
85+
func createMockKubernetesClientStatefulset() client.Client {
86+
statefulset := &appsv1.StatefulSet{
87+
ObjectMeta: metav1.ObjectMeta{
88+
Name: "test-statefulset-collector",
89+
Namespace: "default",
90+
},
91+
Status: appsv1.StatefulSetStatus{
92+
Replicas: 1,
93+
ReadyReplicas: 1,
94+
},
95+
Spec: appsv1.StatefulSetSpec{
96+
Template: corev1.PodTemplateSpec{
97+
Spec: corev1.PodSpec{
98+
Containers: []corev1.Container{
99+
{
100+
Name: "app",
101+
Image: "app:latest",
102+
},
103+
},
104+
},
105+
},
106+
},
107+
}
108+
return fake.NewClientBuilder().WithObjects(statefulset).Build()
109+
}
110+
111+
func TestUpdateCollectorStatusStatefulset(t *testing.T) {
112+
ctx := context.TODO()
113+
cli := createMockKubernetesClientStatefulset()
114+
115+
changed := &v1alpha1.OpenTelemetryCollector{
116+
ObjectMeta: metav1.ObjectMeta{
117+
Name: "test-statefulset",
118+
Namespace: "default",
119+
},
120+
Spec: v1alpha1.OpenTelemetryCollectorSpec{
121+
Mode: v1alpha1.ModeStatefulSet,
122+
},
123+
}
124+
125+
err := UpdateCollectorStatus(ctx, cli, changed)
126+
assert.NoError(t, err)
127+
128+
assert.Equal(t, int32(1), changed.Status.Scale.Replicas, "expected replicas to be 1")
129+
assert.Equal(t, "1/1", changed.Status.Scale.StatusReplicas, "expected status replicas to be 1/1")
130+
assert.Equal(t, "app:latest", changed.Status.Image, "expected image to be app:latest")
131+
}
132+
133+
func createMockKubernetesClientDaemonset() client.Client {
134+
daemonset := &appsv1.DaemonSet{
135+
ObjectMeta: metav1.ObjectMeta{
136+
Name: "test-daemonset-collector",
137+
Namespace: "default",
138+
},
139+
Spec: appsv1.DaemonSetSpec{
140+
Template: corev1.PodTemplateSpec{
141+
Spec: corev1.PodSpec{
142+
Containers: []corev1.Container{
143+
{
144+
Name: "app",
145+
Image: "app:latest",
146+
},
147+
},
148+
},
149+
},
150+
},
151+
}
152+
return fake.NewClientBuilder().WithObjects(daemonset).Build()
153+
}
154+
155+
func TestUpdateCollectorStatusDaemonsetMode(t *testing.T) {
156+
ctx := context.TODO()
157+
cli := createMockKubernetesClientDaemonset()
158+
159+
changed := &v1alpha1.OpenTelemetryCollector{
160+
ObjectMeta: metav1.ObjectMeta{
161+
Name: "test-daemonset",
162+
Namespace: "default",
163+
Labels: map[string]string{
164+
"customLabel": "customValue",
165+
},
166+
},
167+
Spec: v1alpha1.OpenTelemetryCollectorSpec{
168+
Mode: v1alpha1.ModeDaemonSet,
169+
},
170+
}
171+
172+
err := UpdateCollectorStatus(ctx, cli, changed)
173+
assert.NoError(t, err)
174+
175+
assert.Contains(t, changed.Status.Scale.Selector, "customLabel=customValue", "expected selector to contain customlabel=customValue")
176+
assert.Equal(t, "app:latest", changed.Status.Image, "expected image to be app:latest")
177+
}

0 commit comments

Comments
 (0)