Skip to content

Commit 6497a51

Browse files
committed
Generate target allocator manifests from TargetAllocator CR
1 parent 6daa60e commit 6497a51

22 files changed

+286
-318
lines changed

controllers/builder_test.go

+9-3
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ import (
3737
"github.com/open-telemetry/opentelemetry-operator/apis/v1beta1"
3838
"github.com/open-telemetry/opentelemetry-operator/internal/config"
3939
"github.com/open-telemetry/opentelemetry-operator/internal/manifests"
40+
"github.com/open-telemetry/opentelemetry-operator/internal/manifests/collector"
4041
"github.com/open-telemetry/opentelemetry-operator/pkg/featuregate"
4142
)
4243

@@ -1350,6 +1351,7 @@ collector_selector:
13501351
app.kubernetes.io/instance: test.test
13511352
app.kubernetes.io/managed-by: opentelemetry-operator
13521353
app.kubernetes.io/part-of: opentelemetry
1354+
matchexpressions: []
13531355
config:
13541356
scrape_configs:
13551357
- job_name: example
@@ -1408,7 +1410,7 @@ prometheus_cr:
14081410
"app.kubernetes.io/version": "latest",
14091411
},
14101412
Annotations: map[string]string{
1411-
"opentelemetry-targetallocator-config/hash": "59307aaa5652c8723f7803aa2d2b631389d1a0267444a4a8dc559878b5c4aa2c",
1413+
"opentelemetry-targetallocator-config/hash": "ba38217bad7e399f1210b90a464252159a8c4e17060c246799b8e4cb29a6f18f",
14121414
},
14131415
},
14141416
Spec: corev1.PodSpec{
@@ -1747,6 +1749,7 @@ collector_selector:
17471749
app.kubernetes.io/instance: test.test
17481750
app.kubernetes.io/managed-by: opentelemetry-operator
17491751
app.kubernetes.io/part-of: opentelemetry
1752+
matchexpressions: []
17501753
config:
17511754
scrape_configs:
17521755
- job_name: example
@@ -1805,7 +1808,7 @@ prometheus_cr:
18051808
"app.kubernetes.io/version": "latest",
18061809
},
18071810
Annotations: map[string]string{
1808-
"opentelemetry-targetallocator-config/hash": "59307aaa5652c8723f7803aa2d2b631389d1a0267444a4a8dc559878b5c4aa2c",
1811+
"opentelemetry-targetallocator-config/hash": "ba38217bad7e399f1210b90a464252159a8c4e17060c246799b8e4cb29a6f18f",
18091812
},
18101813
},
18111814
Spec: corev1.PodSpec{
@@ -1972,10 +1975,13 @@ prometheus_cr:
19721975
Config: cfg,
19731976
OtelCol: tt.args.instance,
19741977
}
1978+
targetAllocator, err := collector.TargetAllocator(params)
1979+
require.NoError(t, err)
1980+
params.TargetAllocator = *targetAllocator
19751981
if len(tt.featuregates) > 0 {
19761982
fg := strings.Join(tt.featuregates, ",")
19771983
flagset := featuregate.Flags(colfeaturegate.GlobalRegistry())
1978-
if err := flagset.Set(featuregate.FeatureGatesFlag, fg); err != nil {
1984+
if err = flagset.Set(featuregate.FeatureGatesFlag, fg); err != nil {
19791985
t.Errorf("featuregate setting error = %v", err)
19801986
return
19811987
}

controllers/reconcile_test.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -451,8 +451,8 @@ func TestOpenTelemetryCollectorReconciler_Reconcile(t *testing.T) {
451451
assert.NoError(t, err)
452452

453453
taConfig := make(map[interface{}]interface{})
454-
taConfig["collector_selector"] = map[string]any{
455-
"matchlabels": map[string]string{
454+
taConfig["collector_selector"] = metav1.LabelSelector{
455+
MatchLabels: map[string]string{
456456
"app.kubernetes.io/instance": "default.test",
457457
"app.kubernetes.io/managed-by": "opentelemetry-operator",
458458
"app.kubernetes.io/component": "opentelemetry-collector",

internal/manifests/targetallocator/annotations.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ import (
2626
const configMapHashAnnotationKey = "opentelemetry-targetallocator-config/hash"
2727

2828
// Annotations returns the annotations for the TargetAllocator Pod.
29-
func Annotations(instance v1beta1.OpenTelemetryCollector, configMap *v1.ConfigMap) map[string]string {
29+
func Annotations(instance v1beta1.TargetAllocator, configMap *v1.ConfigMap) map[string]string {
3030
// Make a copy of PodAnnotations to be safe
3131
annotations := make(map[string]string, len(instance.Spec.PodAnnotations))
3232
for key, value := range instance.Spec.PodAnnotations {

internal/manifests/targetallocator/annotations_test.go

+9-9
Original file line numberDiff line numberDiff line change
@@ -23,13 +23,12 @@ import (
2323
"github.com/stretchr/testify/assert"
2424
"github.com/stretchr/testify/require"
2525

26-
"github.com/open-telemetry/opentelemetry-operator/apis/v1beta1"
2726
"github.com/open-telemetry/opentelemetry-operator/internal/config"
2827
"github.com/open-telemetry/opentelemetry-operator/internal/manifests"
2928
)
3029

3130
func TestPodAnnotations(t *testing.T) {
32-
instance := collectorInstance()
31+
instance := targetAllocatorInstance()
3332
instance.Spec.PodAnnotations = map[string]string{
3433
"key": "value",
3534
}
@@ -39,26 +38,27 @@ func TestPodAnnotations(t *testing.T) {
3938

4039
func TestConfigMapHash(t *testing.T) {
4140
cfg := config.New()
42-
instance := collectorInstance()
41+
collector := collectorInstance()
42+
targetAllocator := targetAllocatorInstance()
4343
params := manifests.Params{
44-
OtelCol: instance,
45-
Config: cfg,
46-
Log: logr.Discard(),
44+
OtelCol: collector,
45+
TargetAllocator: targetAllocator,
46+
Config: cfg,
47+
Log: logr.Discard(),
4748
}
4849
expectedConfigMap, err := ConfigMap(params)
4950
require.NoError(t, err)
5051
expectedConfig := expectedConfigMap.Data[targetAllocatorFilename]
5152
require.NotEmpty(t, expectedConfig)
5253
expectedHash := sha256.Sum256([]byte(expectedConfig))
53-
annotations := Annotations(instance, expectedConfigMap)
54+
annotations := Annotations(targetAllocator, expectedConfigMap)
5455
require.Contains(t, annotations, configMapHashAnnotationKey)
5556
cmHash := annotations[configMapHashAnnotationKey]
5657
assert.Equal(t, fmt.Sprintf("%x", expectedHash), cmHash)
5758
}
5859

5960
func TestInvalidConfigNoHash(t *testing.T) {
60-
instance := collectorInstance()
61-
instance.Spec.Config = v1beta1.Config{}
61+
instance := targetAllocatorInstance()
6262
annotations := Annotations(instance, nil)
6363
require.NotContains(t, annotations, configMapHashAnnotationKey)
6464
}

internal/manifests/targetallocator/configmap.go

+25-39
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,6 @@ import (
2121

2222
"github.com/open-telemetry/opentelemetry-operator/apis/v1beta1"
2323
"github.com/open-telemetry/opentelemetry-operator/internal/manifests"
24-
"github.com/open-telemetry/opentelemetry-operator/internal/manifests/collector"
25-
"github.com/open-telemetry/opentelemetry-operator/internal/manifests/manifestutils"
26-
"github.com/open-telemetry/opentelemetry-operator/internal/manifests/targetallocator/adapters"
2724
"github.com/open-telemetry/opentelemetry-operator/internal/naming"
2825
)
2926

@@ -32,61 +29,50 @@ const (
3229
)
3330

3431
func ConfigMap(params manifests.Params) (*corev1.ConfigMap, error) {
35-
name := naming.TAConfigMap(params.OtelCol.Name)
36-
labels := Labels(params.OtelCol, name)
37-
// TODO: https://github.com/open-telemetry/opentelemetry-operator/issues/2603
38-
cfgStr, err := params.OtelCol.Spec.Config.Yaml()
39-
if err != nil {
40-
return &corev1.ConfigMap{}, err
41-
}
42-
43-
// Collector supports environment variable substitution, but the TA does not.
44-
// TA ConfigMap should have a single "$", as it does not support env var substitution
45-
prometheusReceiverConfig, err := adapters.UnescapeDollarSignsInPromConfig(cfgStr)
46-
if err != nil {
47-
return &corev1.ConfigMap{}, err
48-
}
32+
instance := params.TargetAllocator
33+
name := naming.TAConfigMap(instance.Name)
34+
labels := Labels(instance, name)
35+
taSpec := instance.Spec
4936

5037
taConfig := make(map[interface{}]interface{})
5138
prometheusCRConfig := make(map[interface{}]interface{})
52-
collectorSelectorLabels := manifestutils.SelectorLabels(params.OtelCol.ObjectMeta, collector.ComponentOpenTelemetryCollector)
53-
taConfig["collector_selector"] = map[string]any{
54-
"matchlabels": collectorSelectorLabels,
55-
}
39+
taConfig["collector_selector"] = taSpec.CollectorSelector
5640
// The below instruction is here for compatibility with the previous target allocator version
5741
// TODO: Drop it after 3 more versions
58-
taConfig["label_selector"] = collectorSelectorLabels
59-
// We only take the "config" from the returned object, if it's present
60-
if prometheusConfig, ok := prometheusReceiverConfig["config"]; ok {
61-
taConfig["config"] = prometheusConfig
42+
taConfig["label_selector"] = taSpec.CollectorSelector.MatchLabels
43+
44+
// Add scrape configs if present
45+
if instance.Spec.ScrapeConfigs != nil {
46+
taConfig["config"] = map[string]interface{}{
47+
"scrape_configs": instance.Spec.ScrapeConfigs,
48+
}
6249
}
6350

64-
if len(params.OtelCol.Spec.TargetAllocator.AllocationStrategy) > 0 {
65-
taConfig["allocation_strategy"] = params.OtelCol.Spec.TargetAllocator.AllocationStrategy
51+
if len(taSpec.AllocationStrategy) > 0 {
52+
taConfig["allocation_strategy"] = taSpec.AllocationStrategy
6653
} else {
6754
taConfig["allocation_strategy"] = v1beta1.TargetAllocatorAllocationStrategyConsistentHashing
6855
}
56+
taConfig["filter_strategy"] = taSpec.FilterStrategy
6957

70-
taConfig["filter_strategy"] = params.OtelCol.Spec.TargetAllocator.FilterStrategy
71-
72-
if params.OtelCol.Spec.TargetAllocator.PrometheusCR.ScrapeInterval.Size() > 0 {
73-
prometheusCRConfig["scrape_interval"] = params.OtelCol.Spec.TargetAllocator.PrometheusCR.ScrapeInterval.Duration
58+
if taSpec.PrometheusCR.ScrapeInterval.Size() > 0 {
59+
prometheusCRConfig["scrape_interval"] = taSpec.PrometheusCR.ScrapeInterval.Duration
7460
}
7561

76-
prometheusCRConfig["service_monitor_selector"] = params.OtelCol.Spec.TargetAllocator.PrometheusCR.ServiceMonitorSelector
62+
prometheusCRConfig["service_monitor_selector"] = taSpec.PrometheusCR.ServiceMonitorSelector
7763

7864
// The below instruction is here for compatibility with the previous target allocator version
7965
// TODO: Drop it after 3 more versions
80-
if params.OtelCol.Spec.TargetAllocator.PrometheusCR.ServiceMonitorSelector != nil {
81-
taConfig["service_monitor_selector"] = &params.OtelCol.Spec.TargetAllocator.PrometheusCR.ServiceMonitorSelector.MatchLabels
66+
if taSpec.PrometheusCR.ServiceMonitorSelector != nil {
67+
taConfig["service_monitor_selector"] = &taSpec.PrometheusCR.ServiceMonitorSelector.MatchLabels
8268
}
8369

84-
prometheusCRConfig["pod_monitor_selector"] = params.OtelCol.Spec.TargetAllocator.PrometheusCR.PodMonitorSelector
70+
prometheusCRConfig["pod_monitor_selector"] = taSpec.PrometheusCR.PodMonitorSelector
8571

8672
// The below instruction is here for compatibility with the previous target allocator version
8773
// TODO: Drop it after 3 more versions
88-
if params.OtelCol.Spec.TargetAllocator.PrometheusCR.PodMonitorSelector != nil {
89-
taConfig["pod_monitor_selector"] = &params.OtelCol.Spec.TargetAllocator.PrometheusCR.PodMonitorSelector.MatchLabels
74+
if taSpec.PrometheusCR.PodMonitorSelector != nil {
75+
taConfig["pod_monitor_selector"] = &taSpec.PrometheusCR.PodMonitorSelector.MatchLabels
9076
}
9177

9278
if len(prometheusCRConfig) > 0 {
@@ -101,9 +87,9 @@ func ConfigMap(params manifests.Params) (*corev1.ConfigMap, error) {
10187
return &corev1.ConfigMap{
10288
ObjectMeta: metav1.ObjectMeta{
10389
Name: name,
104-
Namespace: params.OtelCol.Namespace,
90+
Namespace: instance.Namespace,
10591
Labels: labels,
106-
Annotations: params.OtelCol.Annotations,
92+
Annotations: instance.Annotations,
10793
},
10894
Data: map[string]string{
10995
targetAllocatorFilename: string(taConfigYAML),

0 commit comments

Comments
 (0)