Skip to content

Commit 67171a7

Browse files
committed
apis/v1beta1: remove ComponentUseLocalHostAsDefaultHost feature gate
Signed-off-by: Benedikt Bongartz <[email protected]>
1 parent 8eb13f1 commit 67171a7

File tree

5 files changed

+99
-109
lines changed

5 files changed

+99
-109
lines changed

.chloggen/remove_localhost_fg.yaml

+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
# One of 'breaking', 'deprecation', 'new_component', 'enhancement', 'bug_fix'
2+
change_type: bug_fix
3+
4+
# The name of the component, or a single word describing the area of concern, (e.g. collector, target allocator, auto-instrumentation, opamp, github action)
5+
component: operator
6+
7+
# A brief description of the change. Surround your text with quotes ("") if it needs to start with a backtick (`).
8+
note: Remove ComponentUseLocalHostAsDefaultHost feature gate.
9+
10+
# One or more tracking issues related to the change
11+
issues: [3306]
12+
13+
# (Optional) One or more lines of additional information to render under the primary note.
14+
# These lines will be padded with 2 spaces and then inserted directly into the document.
15+
# Use pipe (|) for multiline entries.
16+
subtext:

apis/v1beta1/collector_webhook.go

+26-18
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ package v1beta1
1717
import (
1818
"context"
1919
"fmt"
20+
"slices"
2021
"strings"
2122

2223
"github.com/go-logr/logr"
@@ -78,7 +79,9 @@ func (c CollectorWebhook) Default(_ context.Context, obj runtime.Object) error {
7879
otelcol.Spec.TargetAllocator.Replicas = &one
7980
}
8081

81-
ComponentUseLocalHostAsDefaultHost(otelcol)
82+
// NOTE: we may want to remove that part in the near future.
83+
// https://github.com/open-telemetry/opentelemetry-operator/issues/3306
84+
otelcol.Spec.Args = RemoveFeatureGate(otelcol.Spec.Args, "-component.UseLocalHostAsDefaultHost")
8285

8386
if otelcol.Spec.Autoscaler != nil && otelcol.Spec.Autoscaler.MaxReplicas != nil {
8487
if otelcol.Spec.Autoscaler.MinReplicas == nil {
@@ -454,22 +457,27 @@ func SetupCollectorWebhook(mgr ctrl.Manager, cfg config.Config, reviewer *rbac.R
454457
Complete()
455458
}
456459

457-
// ComponentUseLocalHostAsDefaultHost enables component.UseLocalHostAsDefaultHost
458-
// featuregate on the given collector instance.
459-
// NOTE: For more details, visit:
460-
// https://github.com/open-telemetry/opentelemetry-collector/issues/8510
461-
func ComponentUseLocalHostAsDefaultHost(otelcol *OpenTelemetryCollector) {
462-
const (
463-
baseFlag = "feature-gates"
464-
fgFlag = "component.UseLocalHostAsDefaultHost"
465-
)
466-
if otelcol.Spec.Args == nil {
467-
otelcol.Spec.Args = make(map[string]string)
468-
}
469-
args, ok := otelcol.Spec.Args[baseFlag]
470-
if !ok || len(args) == 0 {
471-
otelcol.Spec.Args[baseFlag] = "-" + fgFlag
472-
} else if !strings.Contains(otelcol.Spec.Args[baseFlag], fgFlag) {
473-
otelcol.Spec.Args[baseFlag] += ",-" + fgFlag
460+
const featureGateFlag = "feature-gates"
461+
462+
// RemoveFeatureGate removes a feature gate from args.
463+
func RemoveFeatureGate(args map[string]string, feature string) map[string]string {
464+
featureGates, ok := args[featureGateFlag]
465+
if !ok {
466+
return args
467+
}
468+
if !strings.Contains(featureGates, feature) {
469+
return args
470+
}
471+
472+
features := strings.Split(featureGates, ",")
473+
features = slices.DeleteFunc(features, func(s string) bool {
474+
return s == feature
475+
})
476+
if len(features) == 0 {
477+
delete(args, featureGateFlag)
478+
} else {
479+
featureGates = strings.Join(features, ",")
480+
args[featureGateFlag] = featureGates
474481
}
482+
return args
475483
}

apis/v1beta1/collector_webhook_test.go

+56-12
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,9 @@ func TestCollectorDefaultingWebhook(t *testing.T) {
148148
name: "update config defaults",
149149
otelcol: v1beta1.OpenTelemetryCollector{
150150
Spec: v1beta1.OpenTelemetryCollectorSpec{
151+
OpenTelemetryCommonFields: v1beta1.OpenTelemetryCommonFields{
152+
Args: map[string]string{"feature-gates": "-component.UseLocalHostAsDefaultHost"},
153+
},
151154
Config: func() v1beta1.Config {
152155
const input = `{"receivers":{"otlp":{"protocols":{"grpc":null,"http":null}}},"exporters":{"debug":null},"service":{"pipelines":{"traces":{"receivers":["otlp"],"exporters":["debug"]}}}}`
153156
var cfg v1beta1.Config
@@ -162,8 +165,8 @@ func TestCollectorDefaultingWebhook(t *testing.T) {
162165
},
163166
Spec: v1beta1.OpenTelemetryCollectorSpec{
164167
OpenTelemetryCommonFields: v1beta1.OpenTelemetryCommonFields{
165-
Args: map[string]string{"feature-gates": "-component.UseLocalHostAsDefaultHost"},
166168
ManagementState: v1beta1.ManagementStateManaged,
169+
Args: map[string]string{},
167170
Replicas: &one,
168171
},
169172
Mode: v1beta1.ModeDeployment,
@@ -195,7 +198,6 @@ func TestCollectorDefaultingWebhook(t *testing.T) {
195198
},
196199
Spec: v1beta1.OpenTelemetryCollectorSpec{
197200
OpenTelemetryCommonFields: v1beta1.OpenTelemetryCommonFields{
198-
Args: map[string]string{"feature-gates": "-component.UseLocalHostAsDefaultHost"},
199201
ManagementState: v1beta1.ManagementStateManaged,
200202
Replicas: &one,
201203
},
@@ -219,7 +221,6 @@ func TestCollectorDefaultingWebhook(t *testing.T) {
219221
},
220222
Spec: v1beta1.OpenTelemetryCollectorSpec{
221223
OpenTelemetryCommonFields: v1beta1.OpenTelemetryCommonFields{
222-
Args: map[string]string{"feature-gates": "-component.UseLocalHostAsDefaultHost"},
223224
ManagementState: v1beta1.ManagementStateManaged,
224225
Replicas: &one,
225226
},
@@ -247,7 +248,6 @@ func TestCollectorDefaultingWebhook(t *testing.T) {
247248
Mode: v1beta1.ModeSidecar,
248249
UpgradeStrategy: "adhoc",
249250
OpenTelemetryCommonFields: v1beta1.OpenTelemetryCommonFields{
250-
Args: map[string]string{"feature-gates": "-component.UseLocalHostAsDefaultHost"},
251251
Replicas: &five,
252252
ManagementState: v1beta1.ManagementStateManaged,
253253
},
@@ -274,7 +274,6 @@ func TestCollectorDefaultingWebhook(t *testing.T) {
274274
Mode: v1beta1.ModeSidecar,
275275
UpgradeStrategy: "adhoc",
276276
OpenTelemetryCommonFields: v1beta1.OpenTelemetryCommonFields{
277-
Args: map[string]string{"feature-gates": "-component.UseLocalHostAsDefaultHost"},
278277
Replicas: &five,
279278
ManagementState: v1beta1.ManagementStateUnmanaged,
280279
},
@@ -299,7 +298,6 @@ func TestCollectorDefaultingWebhook(t *testing.T) {
299298
Mode: v1beta1.ModeDeployment,
300299
UpgradeStrategy: v1beta1.UpgradeStrategyAutomatic,
301300
OpenTelemetryCommonFields: v1beta1.OpenTelemetryCommonFields{
302-
Args: map[string]string{"feature-gates": "-component.UseLocalHostAsDefaultHost"},
303301
Replicas: &one,
304302
ManagementState: v1beta1.ManagementStateManaged,
305303
},
@@ -328,7 +326,6 @@ func TestCollectorDefaultingWebhook(t *testing.T) {
328326
Spec: v1beta1.OpenTelemetryCollectorSpec{
329327
Mode: v1beta1.ModeDeployment,
330328
OpenTelemetryCommonFields: v1beta1.OpenTelemetryCommonFields{
331-
Args: map[string]string{"feature-gates": "-component.UseLocalHostAsDefaultHost"},
332329
ManagementState: v1beta1.ManagementStateManaged,
333330
Replicas: &one,
334331
},
@@ -364,7 +361,6 @@ func TestCollectorDefaultingWebhook(t *testing.T) {
364361
Spec: v1beta1.OpenTelemetryCollectorSpec{
365362
Mode: v1beta1.ModeDeployment,
366363
OpenTelemetryCommonFields: v1beta1.OpenTelemetryCommonFields{
367-
Args: map[string]string{"feature-gates": "-component.UseLocalHostAsDefaultHost"},
368364
Replicas: &one,
369365
ManagementState: v1beta1.ManagementStateManaged,
370366
PodDisruptionBudget: &v1beta1.PodDisruptionBudgetSpec{
@@ -402,7 +398,6 @@ func TestCollectorDefaultingWebhook(t *testing.T) {
402398
Spec: v1beta1.OpenTelemetryCollectorSpec{
403399
Mode: v1beta1.ModeDeployment,
404400
OpenTelemetryCommonFields: v1beta1.OpenTelemetryCommonFields{
405-
Args: map[string]string{"feature-gates": "-component.UseLocalHostAsDefaultHost"},
406401
Replicas: &one,
407402
ManagementState: v1beta1.ManagementStateManaged,
408403
},
@@ -445,7 +440,6 @@ func TestCollectorDefaultingWebhook(t *testing.T) {
445440
Spec: v1beta1.OpenTelemetryCollectorSpec{
446441
Mode: v1beta1.ModeDeployment,
447442
OpenTelemetryCommonFields: v1beta1.OpenTelemetryCommonFields{
448-
Args: map[string]string{"feature-gates": "-component.UseLocalHostAsDefaultHost"},
449443
Replicas: &one,
450444
ManagementState: v1beta1.ManagementStateManaged,
451445
},
@@ -483,7 +477,6 @@ func TestCollectorDefaultingWebhook(t *testing.T) {
483477
Spec: v1beta1.OpenTelemetryCollectorSpec{
484478
Mode: v1beta1.ModeDeployment,
485479
OpenTelemetryCommonFields: v1beta1.OpenTelemetryCommonFields{
486-
Args: map[string]string{"feature-gates": "-component.UseLocalHostAsDefaultHost"},
487480
Replicas: &one,
488481
ManagementState: v1beta1.ManagementStateManaged,
489482
},
@@ -514,7 +507,6 @@ func TestCollectorDefaultingWebhook(t *testing.T) {
514507
Spec: v1beta1.OpenTelemetryCollectorSpec{
515508
Mode: v1beta1.ModeDeployment,
516509
OpenTelemetryCommonFields: v1beta1.OpenTelemetryCommonFields{
517-
Args: map[string]string{"feature-gates": "-component.UseLocalHostAsDefaultHost"},
518510
Replicas: &one,
519511
ManagementState: v1beta1.ManagementStateManaged,
520512
},
@@ -1455,3 +1447,55 @@ func getReviewer(shouldFailSAR bool) *rbac.Reviewer {
14551447
})
14561448
return rbac.NewReviewer(c)
14571449
}
1450+
1451+
func TestRemoveFeatureGate(t *testing.T) {
1452+
tests := []struct {
1453+
test string
1454+
args map[string]string
1455+
feature string
1456+
expected map[string]string
1457+
}{
1458+
{
1459+
test: "empty",
1460+
args: map[string]string{},
1461+
expected: map[string]string{},
1462+
},
1463+
{
1464+
test: "no feature gates",
1465+
args: map[string]string{"foo": "bar"},
1466+
feature: "foo",
1467+
expected: map[string]string{"foo": "bar"},
1468+
},
1469+
{
1470+
test: "remove enabled feature gate",
1471+
args: map[string]string{"foo": "bar", "feature-gates": "+foo"},
1472+
feature: "-foo",
1473+
expected: map[string]string{"foo": "bar", "feature-gates": "+foo"},
1474+
},
1475+
{
1476+
test: "remove disabled feature gate",
1477+
args: map[string]string{"foo": "bar", "feature-gates": "-foo"},
1478+
feature: "-foo",
1479+
expected: map[string]string{"foo": "bar"},
1480+
},
1481+
{
1482+
test: "remove disabled feature gate, start",
1483+
args: map[string]string{"foo": "bar", "feature-gates": "-foo,bar"},
1484+
feature: "-foo",
1485+
expected: map[string]string{"foo": "bar", "feature-gates": "bar"},
1486+
},
1487+
{
1488+
test: "remove disabled feature gate, end",
1489+
args: map[string]string{"foo": "bar", "feature-gates": "bar,-foo"},
1490+
feature: "-foo",
1491+
expected: map[string]string{"foo": "bar", "feature-gates": "bar"},
1492+
},
1493+
}
1494+
1495+
for _, test := range tests {
1496+
t.Run(test.test, func(t *testing.T) {
1497+
args := v1beta1.RemoveFeatureGate(test.args, test.feature)
1498+
assert.Equal(t, test.expected, args)
1499+
})
1500+
}
1501+
}

pkg/collector/upgrade/v0_105_0.go

+1-27
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
package upgrade
1616

1717
import (
18-
"slices"
1918
"strings"
2019

2120
"github.com/open-telemetry/opentelemetry-operator/apis/v1beta1"
@@ -34,32 +33,7 @@ func upgrade0_105_0(_ VersionUpgrade, otelcol *v1beta1.OpenTelemetryCollector) (
3433
}
3534

3635
envVarExpansionFeatureFlag := "-confmap.unifyEnvVarExpansion"
37-
otelcol.Spec.OpenTelemetryCommonFields.Args = RemoveFeatureGate(otelcol.Spec.OpenTelemetryCommonFields.Args, envVarExpansionFeatureFlag)
36+
otelcol.Spec.OpenTelemetryCommonFields.Args = v1beta1.RemoveFeatureGate(otelcol.Spec.OpenTelemetryCommonFields.Args, envVarExpansionFeatureFlag)
3837

3938
return otelcol, nil
4039
}
41-
42-
const featureGateFlag = "feature-gates"
43-
44-
// RemoveFeatureGate removes a feature gate from args.
45-
func RemoveFeatureGate(args map[string]string, feature string) map[string]string {
46-
featureGates, ok := args[featureGateFlag]
47-
if !ok {
48-
return args
49-
}
50-
if !strings.Contains(featureGates, feature) {
51-
return args
52-
}
53-
54-
features := strings.Split(featureGates, ",")
55-
features = slices.DeleteFunc(features, func(s string) bool {
56-
return s == feature
57-
})
58-
if len(features) == 0 {
59-
delete(args, featureGateFlag)
60-
} else {
61-
featureGates = strings.Join(features, ",")
62-
args[featureGateFlag] = featureGates
63-
}
64-
return args
65-
}

pkg/collector/upgrade/v0_105_0_test.go

-52
Original file line numberDiff line numberDiff line change
@@ -71,55 +71,3 @@ func Test0_105_0Upgrade(t *testing.T) {
7171
assert.EqualValues(t,
7272
map[string]string{"foo": "bar", "feature-gates": "+baz"}, col.Spec.Args)
7373
}
74-
75-
func TestRemoveFeatureGate(t *testing.T) {
76-
tests := []struct {
77-
test string
78-
args map[string]string
79-
feature string
80-
expected map[string]string
81-
}{
82-
{
83-
test: "empty",
84-
args: map[string]string{},
85-
expected: map[string]string{},
86-
},
87-
{
88-
test: "no feature gates",
89-
args: map[string]string{"foo": "bar"},
90-
feature: "foo",
91-
expected: map[string]string{"foo": "bar"},
92-
},
93-
{
94-
test: "remove enabled feature gate",
95-
args: map[string]string{"foo": "bar", "feature-gates": "+foo"},
96-
feature: "-foo",
97-
expected: map[string]string{"foo": "bar", "feature-gates": "+foo"},
98-
},
99-
{
100-
test: "remove disabled feature gate",
101-
args: map[string]string{"foo": "bar", "feature-gates": "-foo"},
102-
feature: "-foo",
103-
expected: map[string]string{"foo": "bar"},
104-
},
105-
{
106-
test: "remove disabled feature gate, start",
107-
args: map[string]string{"foo": "bar", "feature-gates": "-foo,bar"},
108-
feature: "-foo",
109-
expected: map[string]string{"foo": "bar", "feature-gates": "bar"},
110-
},
111-
{
112-
test: "remove disabled feature gate, end",
113-
args: map[string]string{"foo": "bar", "feature-gates": "bar,-foo"},
114-
feature: "-foo",
115-
expected: map[string]string{"foo": "bar", "feature-gates": "bar"},
116-
},
117-
}
118-
119-
for _, test := range tests {
120-
t.Run(test.test, func(t *testing.T) {
121-
args := upgrade.RemoveFeatureGate(test.args, test.feature)
122-
assert.Equal(t, test.expected, args)
123-
})
124-
}
125-
}

0 commit comments

Comments
 (0)