Skip to content

Commit 0d2e010

Browse files
committed
internal/manifests/collector: migrate configmap
Signed-off-by: Benedikt Bongartz <[email protected]>
1 parent ebe2ccb commit 0d2e010

7 files changed

+71
-48
lines changed

internal/manifests/collector/config_replace.go

+11-7
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,9 @@ import (
1919

2020
promconfig "github.com/prometheus/prometheus/config"
2121
_ "github.com/prometheus/prometheus/discovery/install" // Package install has the side-effect of registering all builtin.
22-
"gopkg.in/yaml.v2"
22+
"gopkg.in/yaml.v3"
2323

24-
"github.com/open-telemetry/opentelemetry-operator/apis/v1alpha1"
24+
"github.com/open-telemetry/opentelemetry-operator/apis/v1alpha2"
2525
"github.com/open-telemetry/opentelemetry-operator/internal/manifests/collector/adapters"
2626
ta "github.com/open-telemetry/opentelemetry-operator/internal/manifests/targetallocator/adapters"
2727
"github.com/open-telemetry/opentelemetry-operator/internal/naming"
@@ -42,18 +42,22 @@ type Config struct {
4242
TargetAllocConfig *targetAllocator `yaml:"target_allocator,omitempty"`
4343
}
4444

45-
func ReplaceConfig(instance v1alpha1.OpenTelemetryCollector) (string, error) {
45+
func ReplaceConfig(instance v1alpha2.OpenTelemetryCollector) (string, error) {
46+
cfgStr, err := yaml.Marshal(&instance.Spec.Config)
47+
if err != nil {
48+
return "", err
49+
}
4650
// Check if TargetAllocator is enabled, if not, return the original config
4751
if !instance.Spec.TargetAllocator.Enabled {
48-
return instance.Spec.Config, nil
52+
return string(cfgStr), nil
4953
}
5054

51-
config, err := adapters.ConfigFromString(instance.Spec.Config)
55+
config, err := adapters.ConfigFromString(string(cfgStr))
5256
if err != nil {
5357
return "", err
5458
}
5559

56-
promCfgMap, getCfgPromErr := ta.ConfigToPromConfig(instance.Spec.Config)
60+
promCfgMap, getCfgPromErr := ta.ConfigToPromConfig(string(cfgStr))
5761
if getCfgPromErr != nil {
5862
return "", getCfgPromErr
5963
}
@@ -78,7 +82,6 @@ func ReplaceConfig(instance v1alpha1.OpenTelemetryCollector) (string, error) {
7882
if updCfgMarshalErr != nil {
7983
return "", updCfgMarshalErr
8084
}
81-
8285
return string(out), nil
8386
}
8487

@@ -89,6 +92,7 @@ func ReplaceConfig(instance v1alpha1.OpenTelemetryCollector) (string, error) {
8992
return "", err
9093
}
9194

95+
// To avoid issues caused by Prometheus validation logic, which fails regex validation when it encounters
9296
// type coercion checks are handled in the ConfigToPromConfig method above
9397
config["receivers"].(map[interface{}]interface{})["prometheus"] = updPromCfgMap
9498

internal/manifests/collector/config_replace_test.go

+24-15
Original file line numberDiff line numberDiff line change
@@ -24,21 +24,24 @@ import (
2424
colfeaturegate "go.opentelemetry.io/collector/featuregate"
2525
"gopkg.in/yaml.v2"
2626

27+
"github.com/open-telemetry/opentelemetry-operator/internal/api/convert"
2728
ta "github.com/open-telemetry/opentelemetry-operator/internal/manifests/targetallocator/adapters"
2829
"github.com/open-telemetry/opentelemetry-operator/pkg/featuregate"
2930
)
3031

3132
func TestPrometheusParser(t *testing.T) {
3233
param, err := newParams("test/test-img", "testdata/http_sd_config_test.yaml")
3334
assert.NoError(t, err)
35+
otelCol, err := convert.V1Alpha1to2(param.OtelCol)
36+
assert.NoError(t, err)
3437

3538
t.Run("should update config with http_sd_config", func(t *testing.T) {
3639
err := colfeaturegate.GlobalRegistry().Set(featuregate.EnableTargetAllocatorRewrite.ID(), false)
3740
require.NoError(t, err)
3841
t.Cleanup(func() {
3942
_ = colfeaturegate.GlobalRegistry().Set(featuregate.EnableTargetAllocatorRewrite.ID(), true)
4043
})
41-
actualConfig, err := ReplaceConfig(param.OtelCol)
44+
actualConfig, err := ReplaceConfig(otelCol)
4245
assert.NoError(t, err)
4346

4447
// prepare
@@ -71,8 +74,8 @@ func TestPrometheusParser(t *testing.T) {
7174

7275
t.Run("should update config with targetAllocator block if block not present", func(t *testing.T) {
7376
// Set up the test scenario
74-
param.OtelCol.Spec.TargetAllocator.Enabled = true
75-
actualConfig, err := ReplaceConfig(param.OtelCol)
77+
otelCol.Spec.TargetAllocator.Enabled = true
78+
actualConfig, err := ReplaceConfig(otelCol)
7679
assert.NoError(t, err)
7780

7881
// Verify the expected changes in the config
@@ -96,9 +99,12 @@ func TestPrometheusParser(t *testing.T) {
9699
// Set up the test scenario
97100
paramTa, err := newParams("test/test-img", "testdata/http_sd_config_ta_test.yaml")
98101
require.NoError(t, err)
102+
otelColTa, err := convert.V1Alpha1to2(paramTa.OtelCol)
103+
assert.NoError(t, err)
104+
99105
paramTa.OtelCol.Spec.TargetAllocator.Enabled = true
100106

101-
actualConfig, err := ReplaceConfig(paramTa.OtelCol)
107+
actualConfig, err := ReplaceConfig(otelColTa)
102108
assert.NoError(t, err)
103109

104110
// Verify the expected changes in the config
@@ -119,8 +125,9 @@ func TestPrometheusParser(t *testing.T) {
119125
})
120126

121127
t.Run("should not update config with http_sd_config", func(t *testing.T) {
122-
param.OtelCol.Spec.TargetAllocator.Enabled = false
123-
actualConfig, err := ReplaceConfig(param.OtelCol)
128+
otelCol.Spec.TargetAllocator.Enabled = false
129+
130+
actualConfig, err := ReplaceConfig(otelCol)
124131
assert.NoError(t, err)
125132

126133
// prepare
@@ -156,17 +163,19 @@ func TestPrometheusParser(t *testing.T) {
156163
func TestReplaceConfig(t *testing.T) {
157164
param, err := newParams("test/test-img", "testdata/relabel_config_original.yaml")
158165
assert.NoError(t, err)
166+
otelCol, err := convert.V1Alpha1to2(param.OtelCol)
167+
assert.NoError(t, err)
159168

160169
t.Run("should not modify config when TargetAllocator is disabled", func(t *testing.T) {
161-
param.OtelCol.Spec.TargetAllocator.Enabled = false
170+
otelCol.Spec.TargetAllocator.Enabled = false
162171
expectedConfigBytes, err := os.ReadFile("testdata/relabel_config_original.yaml")
163172
assert.NoError(t, err)
164173
expectedConfig := string(expectedConfigBytes)
165174

166-
actualConfig, err := ReplaceConfig(param.OtelCol)
175+
actualConfig, err := ReplaceConfig(otelCol)
167176
assert.NoError(t, err)
168177

169-
assert.Equal(t, expectedConfig, actualConfig)
178+
assert.YAMLEq(t, expectedConfig, actualConfig)
170179
})
171180

172181
t.Run("should rewrite scrape configs with SD config when TargetAllocator is enabled and feature flag is not set", func(t *testing.T) {
@@ -176,28 +185,28 @@ func TestReplaceConfig(t *testing.T) {
176185
_ = colfeaturegate.GlobalRegistry().Set(featuregate.EnableTargetAllocatorRewrite.ID(), true)
177186
})
178187

179-
param.OtelCol.Spec.TargetAllocator.Enabled = true
188+
otelCol.Spec.TargetAllocator.Enabled = true
180189

181190
expectedConfigBytes, err := os.ReadFile("testdata/relabel_config_expected_with_sd_config.yaml")
182191
assert.NoError(t, err)
183192
expectedConfig := string(expectedConfigBytes)
184193

185-
actualConfig, err := ReplaceConfig(param.OtelCol)
194+
actualConfig, err := ReplaceConfig(otelCol)
186195
assert.NoError(t, err)
187196

188-
assert.Equal(t, expectedConfig, actualConfig)
197+
assert.YAMLEq(t, expectedConfig, actualConfig)
189198
})
190199

191200
t.Run("should remove scrape configs if TargetAllocator is enabled and feature flag is set", func(t *testing.T) {
192-
param.OtelCol.Spec.TargetAllocator.Enabled = true
201+
otelCol.Spec.TargetAllocator.Enabled = true
193202

194203
expectedConfigBytes, err := os.ReadFile("testdata/config_expected_targetallocator.yaml")
195204
assert.NoError(t, err)
196205
expectedConfig := string(expectedConfigBytes)
197206

198-
actualConfig, err := ReplaceConfig(param.OtelCol)
207+
actualConfig, err := ReplaceConfig(otelCol)
199208
assert.NoError(t, err)
200209

201-
assert.Equal(t, expectedConfig, actualConfig)
210+
assert.YAMLEq(t, expectedConfig, actualConfig)
202211
})
203212
}

internal/manifests/collector/configmap.go

+10-5
Original file line numberDiff line numberDiff line change
@@ -18,16 +18,21 @@ import (
1818
corev1 "k8s.io/api/core/v1"
1919
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2020

21+
"github.com/open-telemetry/opentelemetry-operator/internal/api/convert"
2122
"github.com/open-telemetry/opentelemetry-operator/internal/manifests"
2223
"github.com/open-telemetry/opentelemetry-operator/internal/manifests/manifestutils"
2324
"github.com/open-telemetry/opentelemetry-operator/internal/naming"
2425
)
2526

2627
func ConfigMap(params manifests.Params) (*corev1.ConfigMap, error) {
27-
name := naming.ConfigMap(params.OtelCol.Name)
28-
labels := manifestutils.Labels(params.OtelCol.ObjectMeta, name, params.OtelCol.Spec.Image, ComponentOpenTelemetryCollector, []string{})
28+
otelCol, err := convert.V1Alpha1to2(params.OtelCol)
29+
if err != nil {
30+
return nil, err
31+
}
32+
name := naming.ConfigMap(otelCol.Name)
33+
labels := manifestutils.Labels(otelCol.ObjectMeta, name, otelCol.Spec.Image, ComponentOpenTelemetryCollector, []string{})
2934

30-
replacedConf, err := ReplaceConfig(params.OtelCol)
35+
replacedConf, err := ReplaceConfig(otelCol)
3136
if err != nil {
3237
params.Log.V(2).Info("failed to update prometheus config to use sharded targets: ", "err", err)
3338
return nil, err
@@ -36,9 +41,9 @@ func ConfigMap(params manifests.Params) (*corev1.ConfigMap, error) {
3641
return &corev1.ConfigMap{
3742
ObjectMeta: metav1.ObjectMeta{
3843
Name: name,
39-
Namespace: params.OtelCol.Namespace,
44+
Namespace: otelCol.Namespace,
4045
Labels: labels,
41-
Annotations: params.OtelCol.Annotations,
46+
Annotations: otelCol.Annotations,
4247
},
4348
Data: map[string]string{
4449
"collector.yaml": replacedConf,

internal/manifests/collector/configmap_test.go

+21-13
Original file line numberDiff line numberDiff line change
@@ -37,9 +37,9 @@ func TestDesiredConfigMap(t *testing.T) {
3737
expectedLables["app.kubernetes.io/name"] = "test-collector"
3838
expectedLables["app.kubernetes.io/version"] = "0.47.0"
3939

40+
const filenameCollector = "collector.yaml"
4041
expectedData := map[string]string{
41-
"collector.yaml": `processors:
42-
receivers:
42+
"collector.yaml": `receivers:
4343
jaeger:
4444
protocols:
4545
grpc:
@@ -68,8 +68,10 @@ service:
6868
assert.NoError(t, err)
6969
assert.Equal(t, "test-collector", actual.Name)
7070
assert.Equal(t, expectedLables, actual.Labels)
71-
assert.Equal(t, expectedData, actual.Data)
72-
71+
assert.Equal(t, len(expectedData), len(actual.Data))
72+
for k, expected := range expectedData {
73+
assert.YAMLEq(t, expected, actual.Data[k])
74+
}
7375
})
7476

7577
t.Run("should return expected collector config map with http_sd_config if rewrite flag disabled", func(t *testing.T) {
@@ -83,8 +85,7 @@ service:
8385

8486
expectedData := map[string]string{
8587
"collector.yaml": `exporters:
86-
debug: null
87-
processors: null
88+
debug:
8889
receivers:
8990
jaeger:
9091
protocols:
@@ -115,7 +116,10 @@ service:
115116
assert.NoError(t, err)
116117
assert.Equal(t, "test-collector", actual.GetName())
117118
assert.Equal(t, expectedLables, actual.GetLabels())
118-
assert.Equal(t, expectedData, actual.Data)
119+
assert.Equal(t, len(expectedData), len(actual.Data))
120+
for k, expected := range expectedData {
121+
assert.YAMLEq(t, expected, actual.Data[k])
122+
}
119123

120124
})
121125

@@ -132,8 +136,7 @@ service:
132136

133137
expectedData := map[string]string{
134138
"collector.yaml": `exporters:
135-
debug: null
136-
processors: null
139+
debug:
137140
receivers:
138141
prometheus:
139142
config:
@@ -166,7 +169,10 @@ service:
166169
assert.NoError(t, err)
167170
assert.Equal(t, "test-collector", actual.Name)
168171
assert.Equal(t, expectedLables, actual.Labels)
169-
assert.Equal(t, expectedData, actual.Data)
172+
assert.Equal(t, len(expectedData), len(actual.Data))
173+
for k, expected := range expectedData {
174+
assert.YAMLEq(t, expected, actual.Data[k])
175+
}
170176

171177
// Reset the value
172178
expectedLables["app.kubernetes.io/version"] = "0.47.0"
@@ -180,8 +186,7 @@ service:
180186

181187
expectedData := map[string]string{
182188
"collector.yaml": `exporters:
183-
debug: null
184-
processors: null
189+
debug:
185190
receivers:
186191
prometheus:
187192
config: {}
@@ -208,7 +213,10 @@ service:
208213
assert.NoError(t, err)
209214
assert.Equal(t, "test-collector", actual.Name)
210215
assert.Equal(t, expectedLables, actual.Labels)
211-
assert.Equal(t, expectedData, actual.Data)
216+
assert.Equal(t, len(expectedData), len(actual.Data))
217+
for k, expected := range expectedData {
218+
assert.YAMLEq(t, expected, actual.Data[k])
219+
}
212220

213221
// Reset the value
214222
expectedLables["app.kubernetes.io/version"] = "0.47.0"

internal/manifests/collector/testdata/config_expected_targetallocator.yaml

+2-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
1-
debug: null
2-
exporters: null
3-
processors: null
1+
exporters:
2+
debug:
43
receivers:
54
prometheus:
65
config:

internal/manifests/collector/testdata/relabel_config_expected_with_sd_config.yaml

+2-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
1-
debug: null
2-
exporters: null
3-
processors: null
1+
exporters:
2+
debug:
43
receivers:
54
prometheus:
65
config:

internal/manifests/collector/testdata/relabel_config_original.yaml

+1-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
exporters:
2-
debug:
3-
processors:
2+
debug:
43
receivers:
54
prometheus:
65
config:

0 commit comments

Comments
 (0)