Skip to content

Commit 8f6159c

Browse files
committed
Add PodDisruptionBudget
Signed-off-by: Yuri Sa <[email protected]>
2 parents 29135cd + 4d26028 commit 8f6159c

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

53 files changed

+1008
-1070
lines changed

controllers/builder_test.go

+56-36
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import (
2121
"github.com/go-logr/logr"
2222
monitoringv1 "github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring/v1"
2323
"github.com/stretchr/testify/require"
24+
go_yaml "gopkg.in/yaml.v3"
2425
appsv1 "k8s.io/api/apps/v1"
2526
corev1 "k8s.io/api/core/v1"
2627
networkingv1 "k8s.io/api/networking/v1"
@@ -33,6 +34,7 @@ import (
3334
colfeaturegate "go.opentelemetry.io/collector/featuregate"
3435

3536
"github.com/open-telemetry/opentelemetry-operator/apis/v1alpha1"
37+
"github.com/open-telemetry/opentelemetry-operator/apis/v1alpha2"
3638
"github.com/open-telemetry/opentelemetry-operator/internal/config"
3739
"github.com/open-telemetry/opentelemetry-operator/internal/manifests"
3840
"github.com/open-telemetry/opentelemetry-operator/pkg/featuregate"
@@ -73,7 +75,7 @@ var (
7375
)
7476

7577
func TestBuildCollector(t *testing.T) {
76-
var goodConfig = `receivers:
78+
var goodConfigYaml = `receivers:
7779
examplereceiver:
7880
endpoint: "0.0.0.0:12345"
7981
exporters:
@@ -84,9 +86,13 @@ service:
8486
receivers: [examplereceiver]
8587
exporters: [logging]
8688
`
89+
90+
goodConfig := v1alpha2.Config{}
91+
err := go_yaml.Unmarshal([]byte(goodConfigYaml), &goodConfig)
92+
require.NoError(t, err)
8793
one := int32(1)
8894
type args struct {
89-
instance v1alpha1.OpenTelemetryCollector
95+
instance v1alpha2.OpenTelemetryCollector
9096
}
9197
tests := []struct {
9298
name string
@@ -97,16 +103,18 @@ service:
97103
{
98104
name: "base case",
99105
args: args{
100-
instance: v1alpha1.OpenTelemetryCollector{
106+
instance: v1alpha2.OpenTelemetryCollector{
101107
ObjectMeta: metav1.ObjectMeta{
102108
Name: "test",
103109
Namespace: "test",
104110
},
105-
Spec: v1alpha1.OpenTelemetryCollectorSpec{
106-
Replicas: &one,
107-
Mode: "deployment",
108-
Image: "test",
109-
Config: goodConfig,
111+
Spec: v1alpha2.OpenTelemetryCollectorSpec{
112+
OpenTelemetryCommonFields: v1alpha2.OpenTelemetryCommonFields{
113+
Image: "test",
114+
Replicas: &one,
115+
},
116+
Mode: "deployment",
117+
Config: goodConfig,
110118
},
111119
},
112120
},
@@ -334,17 +342,19 @@ service:
334342
{
335343
name: "ingress",
336344
args: args{
337-
instance: v1alpha1.OpenTelemetryCollector{
345+
instance: v1alpha2.OpenTelemetryCollector{
338346
ObjectMeta: metav1.ObjectMeta{
339347
Name: "test",
340348
Namespace: "test",
341349
},
342-
Spec: v1alpha1.OpenTelemetryCollectorSpec{
343-
Replicas: &one,
344-
Mode: "deployment",
345-
Image: "test",
346-
Ingress: v1alpha1.Ingress{
347-
Type: v1alpha1.IngressTypeNginx,
350+
Spec: v1alpha2.OpenTelemetryCollectorSpec{
351+
OpenTelemetryCommonFields: v1alpha2.OpenTelemetryCommonFields{
352+
Image: "test",
353+
Replicas: &one,
354+
},
355+
Mode: "deployment",
356+
Ingress: v1alpha2.Ingress{
357+
Type: v1alpha2.IngressTypeNginx,
348358
Hostname: "example.com",
349359
Annotations: map[string]string{
350360
"something": "true",
@@ -617,17 +627,19 @@ service:
617627
{
618628
name: "specified service account case",
619629
args: args{
620-
instance: v1alpha1.OpenTelemetryCollector{
630+
instance: v1alpha2.OpenTelemetryCollector{
621631
ObjectMeta: metav1.ObjectMeta{
622632
Name: "test",
623633
Namespace: "test",
624634
},
625-
Spec: v1alpha1.OpenTelemetryCollectorSpec{
626-
Replicas: &one,
627-
Mode: "deployment",
628-
Image: "test",
629-
Config: goodConfig,
630-
ServiceAccount: "my-special-sa",
635+
Spec: v1alpha2.OpenTelemetryCollectorSpec{
636+
OpenTelemetryCommonFields: v1alpha2.OpenTelemetryCommonFields{
637+
Image: "test",
638+
Replicas: &one,
639+
ServiceAccount: "my-special-sa",
640+
},
641+
Mode: "deployment",
642+
Config: goodConfig,
631643
},
632644
},
633645
},
@@ -1083,7 +1095,7 @@ endpoint: ws://opamp-server:4320/v1/opamp
10831095
}
10841096

10851097
func TestBuildTargetAllocator(t *testing.T) {
1086-
var goodConfig = `
1098+
var goodConfigYaml = `
10871099
receivers:
10881100
prometheus:
10891101
config:
@@ -1108,9 +1120,13 @@ service:
11081120
receivers: [prometheus]
11091121
exporters: [logging]
11101122
`
1123+
1124+
goodConfig := v1alpha2.Config{}
1125+
err := go_yaml.Unmarshal([]byte(goodConfigYaml), &goodConfig)
1126+
require.NoError(t, err)
11111127
one := int32(1)
11121128
type args struct {
1113-
instance v1alpha1.OpenTelemetryCollector
1129+
instance v1alpha2.OpenTelemetryCollector
11141130
}
11151131
tests := []struct {
11161132
name string
@@ -1122,16 +1138,18 @@ service:
11221138
{
11231139
name: "base case",
11241140
args: args{
1125-
instance: v1alpha1.OpenTelemetryCollector{
1141+
instance: v1alpha2.OpenTelemetryCollector{
11261142
ObjectMeta: metav1.ObjectMeta{
11271143
Name: "test",
11281144
Namespace: "test",
11291145
},
1130-
Spec: v1alpha1.OpenTelemetryCollectorSpec{
1131-
Replicas: &one,
1132-
Mode: "statefulset",
1133-
Image: "test",
1134-
Config: goodConfig,
1146+
Spec: v1alpha2.OpenTelemetryCollectorSpec{
1147+
OpenTelemetryCommonFields: v1alpha2.OpenTelemetryCommonFields{
1148+
Image: "test",
1149+
Replicas: &one,
1150+
},
1151+
Mode: "statefulset",
1152+
Config: goodConfig,
11351153
TargetAllocator: v1alpha1.OpenTelemetryTargetAllocator{
11361154
Enabled: true,
11371155
FilterStrategy: "relabel-config",
@@ -1516,16 +1534,18 @@ prometheus_cr:
15161534
{
15171535
name: "enable metrics case",
15181536
args: args{
1519-
instance: v1alpha1.OpenTelemetryCollector{
1537+
instance: v1alpha2.OpenTelemetryCollector{
15201538
ObjectMeta: metav1.ObjectMeta{
15211539
Name: "test",
15221540
Namespace: "test",
15231541
},
1524-
Spec: v1alpha1.OpenTelemetryCollectorSpec{
1525-
Replicas: &one,
1526-
Mode: "statefulset",
1527-
Image: "test",
1528-
Config: goodConfig,
1542+
Spec: v1alpha2.OpenTelemetryCollectorSpec{
1543+
OpenTelemetryCommonFields: v1alpha2.OpenTelemetryCommonFields{
1544+
Image: "test",
1545+
Replicas: &one,
1546+
},
1547+
Mode: "statefulset",
1548+
Config: goodConfig,
15291549
TargetAllocator: v1alpha1.OpenTelemetryTargetAllocator{
15301550
Enabled: true,
15311551
PrometheusCR: v1alpha1.OpenTelemetryTargetAllocatorPrometheusCR{

controllers/common.go

+17-10
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import (
2424
monitoringv1 "github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring/v1"
2525
autoscalingv2 "k8s.io/api/autoscaling/v2"
2626
networkingv1 "k8s.io/api/networking/v1"
27+
policyV1 "k8s.io/api/policy/v1"
2728
rbacv1 "k8s.io/api/rbac/v1"
2829
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2930
"k8s.io/apimachinery/pkg/labels"
@@ -34,7 +35,6 @@ import (
3435
"sigs.k8s.io/controller-runtime/pkg/client"
3536
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
3637

37-
"github.com/open-telemetry/opentelemetry-operator/internal/api/convert"
3838
"github.com/open-telemetry/opentelemetry-operator/internal/autodetect/openshift"
3939
"github.com/open-telemetry/opentelemetry-operator/internal/manifests"
4040
"github.com/open-telemetry/opentelemetry-operator/internal/manifests/collector"
@@ -89,25 +89,21 @@ func BuildOpAMPBridge(params manifests.Params) ([]client.Object, error) {
8989

9090
func (r *OpenTelemetryCollectorReconciler) findOtelOwnedObjects(ctx context.Context, params manifests.Params) (map[types.UID]client.Object, error) {
9191
ownedObjects := map[types.UID]client.Object{}
92-
otelCol, err := convert.V1Alpha1to2(params.OtelCol)
93-
if err != nil {
94-
return nil, err
95-
}
9692

9793
listOps := &client.ListOptions{
98-
Namespace: otelCol.Namespace,
99-
LabelSelector: labels.SelectorFromSet(manifestutils.Labels(otelCol.ObjectMeta, naming.Collector(otelCol.Name), otelCol.Spec.Image, collector.ComponentOpenTelemetryCollector, params.Config.LabelsFilter())),
94+
Namespace: params.OtelCol.Namespace,
95+
LabelSelector: labels.SelectorFromSet(manifestutils.Labels(params.OtelCol.ObjectMeta, naming.Collector(params.OtelCol.Name), params.OtelCol.Spec.Image, collector.ComponentOpenTelemetryCollector, params.Config.LabelsFilter())),
10096
}
10197
hpaList := &autoscalingv2.HorizontalPodAutoscalerList{}
102-
err = r.List(ctx, hpaList, listOps)
98+
err := r.List(ctx, hpaList, listOps)
10399
if err != nil {
104100
return nil, fmt.Errorf("Error listing HorizontalPodAutoscalers: %w", err)
105101
}
106102
for i := range hpaList.Items {
107103
ownedObjects[hpaList.Items[i].GetUID()] = &hpaList.Items[i]
108104
}
109105

110-
if otelCol.Spec.Observability.Metrics.EnableMetrics && featuregate.PrometheusOperatorIsAvailable.IsEnabled() {
106+
if params.OtelCol.Spec.Observability.Metrics.EnableMetrics && featuregate.PrometheusOperatorIsAvailable.IsEnabled() {
111107
servicemonitorList := &monitoringv1.ServiceMonitorList{}
112108
err = r.List(ctx, servicemonitorList, listOps)
113109
if err != nil {
@@ -117,7 +113,7 @@ func (r *OpenTelemetryCollectorReconciler) findOtelOwnedObjects(ctx context.Cont
117113
ownedObjects[servicemonitorList.Items[i].GetUID()] = servicemonitorList.Items[i]
118114
}
119115

120-
podMonitorList := &monitoringv1.ServiceMonitorList{}
116+
podMonitorList := &monitoringv1.PodMonitorList{}
121117
err = r.List(ctx, podMonitorList, listOps)
122118
if err != nil {
123119
return nil, fmt.Errorf("Error listing PodMonitors: %w", err)
@@ -145,6 +141,17 @@ func (r *OpenTelemetryCollectorReconciler) findOtelOwnedObjects(ctx context.Cont
145141
ownedObjects[routesList.Items[i].GetUID()] = &routesList.Items[i]
146142
}
147143
}
144+
if params.OtelCol.Spec.PodDisruptionBudget != nil {
145+
pdbList := &policyV1.PodDisruptionBudgetList{}
146+
err := r.List(ctx, pdbList, listOps)
147+
if err != nil {
148+
return nil, fmt.Errorf("Error listing PodDisruptionBudgets: %w", err)
149+
}
150+
for i := range pdbList.Items {
151+
ownedObjects[pdbList.Items[i].GetUID()] = &pdbList.Items[i]
152+
}
153+
}
154+
148155
return ownedObjects, nil
149156
}
150157

controllers/opentelemetrycollector_controller.go

+14-5
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ import (
3434
"sigs.k8s.io/controller-runtime/pkg/client"
3535

3636
"github.com/open-telemetry/opentelemetry-operator/apis/v1alpha1"
37+
"github.com/open-telemetry/opentelemetry-operator/internal/api/convert"
3738
"github.com/open-telemetry/opentelemetry-operator/internal/autodetect/openshift"
3839
"github.com/open-telemetry/opentelemetry-operator/internal/config"
3940
"github.com/open-telemetry/opentelemetry-operator/internal/manifests"
@@ -59,15 +60,19 @@ type Params struct {
5960
Config config.Config
6061
}
6162

62-
func (r *OpenTelemetryCollectorReconciler) getParams(instance v1alpha1.OpenTelemetryCollector) manifests.Params {
63+
func (r *OpenTelemetryCollectorReconciler) getParams(instance v1alpha1.OpenTelemetryCollector) (manifests.Params, error) {
64+
otelCol, err := convert.V1Alpha1to2(instance)
65+
if err != nil {
66+
return manifests.Params{}, err
67+
}
6368
return manifests.Params{
6469
Config: r.config,
6570
Client: r.Client,
66-
OtelCol: instance,
71+
OtelCol: otelCol,
6772
Log: r.log,
6873
Scheme: r.scheme,
6974
Recorder: r.recorder,
70-
}
75+
}, nil
7176
}
7277

7378
// NewReconciler creates a new reconciler for OpenTelemetryCollector objects.
@@ -122,7 +127,11 @@ func (r *OpenTelemetryCollectorReconciler) Reconcile(ctx context.Context, req ct
122127
return ctrl.Result{}, nil
123128
}
124129

125-
params := r.getParams(instance)
130+
params, err := r.getParams(instance)
131+
if err != nil {
132+
log.Error(err, "Failed to create manifest.Params")
133+
return ctrl.Result{}, err
134+
}
126135

127136
desiredObjects, buildErr := BuildCollector(params)
128137
if buildErr != nil {
@@ -135,7 +144,7 @@ func (r *OpenTelemetryCollectorReconciler) Reconcile(ctx context.Context, req ct
135144
}
136145

137146
err = reconcileDesiredObjects(ctx, r.Client, log, &params.OtelCol, params.Scheme, desiredObjects, ownedObjects)
138-
return collectorStatus.HandleReconcileStatus(ctx, log, params, err)
147+
return collectorStatus.HandleReconcileStatus(ctx, log, params, instance, err)
139148
}
140149

141150
// SetupWithManager tells the manager what our controller is interested in.

0 commit comments

Comments
 (0)