Skip to content

Commit c327061

Browse files
authoredMar 5, 2024
Add conversion go APIs (open-telemetry#2711)
* Add conversion go APIs Signed-off-by: Pavol Loffay <p.loffay@gmail.com> * Fix Signed-off-by: Pavol Loffay <p.loffay@gmail.com> * Fix Signed-off-by: Pavol Loffay <p.loffay@gmail.com> * Fix Signed-off-by: Pavol Loffay <p.loffay@gmail.com> --------- Signed-off-by: Pavol Loffay <p.loffay@gmail.com>
1 parent 5b59a10 commit c327061

File tree

6 files changed

+142
-27
lines changed

6 files changed

+142
-27
lines changed
 

‎apis/v1alpha1/convert.go

+41-2
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,53 @@ package v1alpha1
1616

1717
import (
1818
"errors"
19+
"fmt"
1920

2021
"gopkg.in/yaml.v3"
2122
appsv1 "k8s.io/api/apps/v1"
2223
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
24+
"sigs.k8s.io/controller-runtime/pkg/conversion"
2325

2426
"github.com/open-telemetry/opentelemetry-operator/apis/v1beta1"
2527
)
2628

27-
func Tov1beta1(in OpenTelemetryCollector) (v1beta1.OpenTelemetryCollector, error) {
29+
var _ conversion.Convertible = &OpenTelemetryCollector{}
30+
31+
func (src *OpenTelemetryCollector) ConvertTo(dstRaw conversion.Hub) error {
32+
switch t := dstRaw.(type) {
33+
case *v1beta1.OpenTelemetryCollector:
34+
dst := dstRaw.(*v1beta1.OpenTelemetryCollector)
35+
convertedSrc, err := tov1beta1(*src)
36+
if err != nil {
37+
return fmt.Errorf("failed to convert to v1beta1: %w", err)
38+
}
39+
dst.ObjectMeta = convertedSrc.ObjectMeta
40+
dst.Spec = convertedSrc.Spec
41+
dst.Status = convertedSrc.Status
42+
default:
43+
return fmt.Errorf("unsupported type %v", t)
44+
}
45+
return nil
46+
}
47+
48+
func (dst *OpenTelemetryCollector) ConvertFrom(srcRaw conversion.Hub) error {
49+
switch t := srcRaw.(type) {
50+
case *v1beta1.OpenTelemetryCollector:
51+
src := srcRaw.(*v1beta1.OpenTelemetryCollector)
52+
srcConverted, err := tov1alpha1(*src)
53+
if err != nil {
54+
return fmt.Errorf("failed to convert to v1alpha1: %w", err)
55+
}
56+
dst.ObjectMeta = srcConverted.ObjectMeta
57+
dst.Spec = srcConverted.Spec
58+
dst.Status = srcConverted.Status
59+
default:
60+
return fmt.Errorf("unsupported type %v", t)
61+
}
62+
return nil
63+
}
64+
65+
func tov1beta1(in OpenTelemetryCollector) (v1beta1.OpenTelemetryCollector, error) {
2866
copy := in.DeepCopy()
2967
cfg := &v1beta1.Config{}
3068
if err := yaml.Unmarshal([]byte(copy.Spec.Config), cfg); err != nil {
@@ -120,6 +158,7 @@ func tov1beta1TA(in OpenTelemetryTargetAllocator) v1beta1.TargetAllocatorEmbedde
120158
PrometheusCR: v1beta1.TargetAllocatorPrometheusCR{
121159
Enabled: in.PrometheusCR.Enabled,
122160
ScrapeInterval: in.PrometheusCR.ScrapeInterval,
161+
// prometheus_cr.pod_monitor_selector shouldn't be nil when selector is empty
123162
PodMonitorSelector: &metav1.LabelSelector{
124163
MatchLabels: in.PrometheusCR.PodMonitorSelector,
125164
},
@@ -236,7 +275,7 @@ func tov1alpha1(in v1beta1.OpenTelemetryCollector) (*OpenTelemetryCollector, err
236275
SecurityContext: copy.Spec.SecurityContext,
237276
PodSecurityContext: copy.Spec.PodSecurityContext,
238277
PodAnnotations: copy.Spec.PodAnnotations,
239-
TargetAllocator: tov1alpha1TA(in.Spec.TargetAllocator),
278+
TargetAllocator: tov1alpha1TA(copy.Spec.TargetAllocator),
240279
Mode: Mode(copy.Spec.Mode),
241280
ServiceAccount: copy.Spec.ServiceAccount,
242281
Image: copy.Spec.Image,

‎apis/v1alpha1/convert_test.go

+71-3
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ func Test_tov1beta1_config(t *testing.T) {
6262
},
6363
}
6464

65-
cfgV2, err := Tov1beta1(cfgV1)
65+
cfgV2, err := tov1beta1(cfgV1)
6666
assert.Nil(t, err)
6767
assert.NotNil(t, cfgV2)
6868
assert.Equal(t, cfgV1.Spec.Args, cfgV2.Spec.Args)
@@ -79,7 +79,7 @@ func Test_tov1beta1_config(t *testing.T) {
7979
},
8080
}
8181

82-
_, err := Tov1beta1(cfgV1)
82+
_, err := tov1beta1(cfgV1)
8383
assert.ErrorContains(t, err, "could not convert config json to v1beta1.Config")
8484
})
8585
}
@@ -310,7 +310,7 @@ func Test_tov1beta1AndBack(t *testing.T) {
310310
},
311311
}
312312

313-
colbeta1, err := Tov1beta1(*colalpha1)
313+
colbeta1, err := tov1beta1(*colalpha1)
314314
require.NoError(t, err)
315315
colalpha1Converted, err := tov1alpha1(colbeta1)
316316
require.NoError(t, err)
@@ -421,3 +421,71 @@ func createTA() OpenTelemetryTargetAllocator {
421421
},
422422
}
423423
}
424+
425+
func TestConvertTo(t *testing.T) {
426+
col := OpenTelemetryCollector{
427+
ObjectMeta: metav1.ObjectMeta{
428+
Name: "otel",
429+
},
430+
Spec: OpenTelemetryCollectorSpec{
431+
ServiceAccount: "otelcol",
432+
},
433+
Status: OpenTelemetryCollectorStatus{
434+
Image: "otel/col",
435+
},
436+
}
437+
colbeta1 := v1beta1.OpenTelemetryCollector{}
438+
err := col.ConvertTo(&colbeta1)
439+
require.NoError(t, err)
440+
assert.Equal(t, v1beta1.OpenTelemetryCollector{
441+
ObjectMeta: metav1.ObjectMeta{
442+
Name: "otel",
443+
},
444+
Spec: v1beta1.OpenTelemetryCollectorSpec{
445+
OpenTelemetryCommonFields: v1beta1.OpenTelemetryCommonFields{
446+
ServiceAccount: "otelcol",
447+
},
448+
TargetAllocator: v1beta1.TargetAllocatorEmbedded{
449+
PrometheusCR: v1beta1.TargetAllocatorPrometheusCR{
450+
PodMonitorSelector: &metav1.LabelSelector{},
451+
ServiceMonitorSelector: &metav1.LabelSelector{},
452+
},
453+
},
454+
},
455+
Status: v1beta1.OpenTelemetryCollectorStatus{
456+
Image: "otel/col",
457+
},
458+
}, colbeta1)
459+
}
460+
461+
func TestConvertFrom(t *testing.T) {
462+
colbeta1 := v1beta1.OpenTelemetryCollector{
463+
ObjectMeta: metav1.ObjectMeta{
464+
Name: "otel",
465+
},
466+
Spec: v1beta1.OpenTelemetryCollectorSpec{
467+
OpenTelemetryCommonFields: v1beta1.OpenTelemetryCommonFields{
468+
ServiceAccount: "otelcol",
469+
},
470+
},
471+
Status: v1beta1.OpenTelemetryCollectorStatus{
472+
Image: "otel/col",
473+
},
474+
}
475+
col := OpenTelemetryCollector{}
476+
err := col.ConvertFrom(&colbeta1)
477+
require.NoError(t, err)
478+
// set config to empty. The v1beta1 marshals config with empty receivers, exporters..
479+
col.Spec.Config = ""
480+
assert.Equal(t, OpenTelemetryCollector{
481+
ObjectMeta: metav1.ObjectMeta{
482+
Name: "otel",
483+
},
484+
Spec: OpenTelemetryCollectorSpec{
485+
ServiceAccount: "otelcol",
486+
},
487+
Status: OpenTelemetryCollectorStatus{
488+
Image: "otel/col",
489+
},
490+
}, col)
491+
}

‎apis/v1beta1/opentelemetrycollector_types.go

+2
Original file line numberDiff line numberDiff line change
@@ -334,6 +334,8 @@ type OpenTelemetryCollector struct {
334334
Status OpenTelemetryCollectorStatus `json:"status,omitempty"`
335335
}
336336

337+
func (*OpenTelemetryCollector) Hub() {}
338+
337339
//+kubebuilder:object:root=true
338340

339341
// OpenTelemetryCollectorList contains a list of OpenTelemetryCollector.

‎controllers/opentelemetrycollector_controller.go

+3-1
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ import (
3737
"sigs.k8s.io/controller-runtime/pkg/client"
3838

3939
"github.com/open-telemetry/opentelemetry-operator/apis/v1alpha1"
40+
"github.com/open-telemetry/opentelemetry-operator/apis/v1beta1"
4041
"github.com/open-telemetry/opentelemetry-operator/internal/autodetect/openshift"
4142
"github.com/open-telemetry/opentelemetry-operator/internal/config"
4243
"github.com/open-telemetry/opentelemetry-operator/internal/manifests"
@@ -130,7 +131,8 @@ func (r *OpenTelemetryCollectorReconciler) findOtelOwnedObjects(ctx context.Cont
130131
}
131132

132133
func (r *OpenTelemetryCollectorReconciler) getParams(instance v1alpha1.OpenTelemetryCollector) (manifests.Params, error) {
133-
otelCol, err := v1alpha1.Tov1beta1(instance)
134+
otelCol := v1beta1.OpenTelemetryCollector{}
135+
err := instance.ConvertTo(&otelCol)
134136
if err != nil {
135137
return manifests.Params{}, err
136138
}

‎pkg/sidecar/pod_test.go

+22-20
Original file line numberDiff line numberDiff line change
@@ -47,33 +47,35 @@ func TestAddSidecarWhenNoSidecarExists(t *testing.T) {
4747
Volumes: []corev1.Volume{{}},
4848
},
4949
}
50-
otelcol, err := v1alpha1.Tov1beta1(
51-
v1alpha1.OpenTelemetryCollector{
52-
ObjectMeta: metav1.ObjectMeta{
53-
Name: "otelcol-sample-with-a-name-that-is-longer-than-sixty-three-characters",
54-
Namespace: "some-app",
55-
},
56-
Spec: v1alpha1.OpenTelemetryCollectorSpec{
57-
Ports: []corev1.ServicePort{
58-
{
59-
Name: "metrics",
60-
Port: 8888,
61-
Protocol: corev1.ProtocolTCP,
62-
},
50+
51+
v1alpha1Col := v1alpha1.OpenTelemetryCollector{
52+
ObjectMeta: metav1.ObjectMeta{
53+
Name: "otelcol-sample-with-a-name-that-is-longer-than-sixty-three-characters",
54+
Namespace: "some-app",
55+
},
56+
Spec: v1alpha1.OpenTelemetryCollectorSpec{
57+
Ports: []corev1.ServicePort{
58+
{
59+
Name: "metrics",
60+
Port: 8888,
61+
Protocol: corev1.ProtocolTCP,
6362
},
64-
InitContainers: []corev1.Container{
65-
{
66-
Name: "test",
67-
},
63+
},
64+
InitContainers: []corev1.Container{
65+
{
66+
Name: "test",
6867
},
69-
Config: `
68+
},
69+
Config: `
7070
receivers:
7171
exporters:
7272
processors:
7373
`,
74-
},
7574
},
76-
)
75+
}
76+
77+
otelcol := v1beta1.OpenTelemetryCollector{}
78+
err := v1alpha1Col.ConvertTo(&otelcol)
7779
require.NoError(t, err)
7880
otelcolYaml, err := otelcol.Spec.Config.Yaml()
7981
require.NoError(t, err)

‎pkg/sidecar/podmutator.go

+3-1
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import (
2727
"sigs.k8s.io/controller-runtime/pkg/client"
2828

2929
"github.com/open-telemetry/opentelemetry-operator/apis/v1alpha1"
30+
"github.com/open-telemetry/opentelemetry-operator/apis/v1beta1"
3031
"github.com/open-telemetry/opentelemetry-operator/internal/config"
3132
"github.com/open-telemetry/opentelemetry-operator/internal/webhook/podmutation"
3233
)
@@ -97,7 +98,8 @@ func (p *sidecarPodMutator) Mutate(ctx context.Context, ns corev1.Namespace, pod
9798
// we should add the sidecar.
9899
logger.V(1).Info("injecting sidecar into pod", "otelcol-namespace", otelcol.Namespace, "otelcol-name", otelcol.Name)
99100

100-
otc, err := v1alpha1.Tov1beta1(otelcol)
101+
otc := v1beta1.OpenTelemetryCollector{}
102+
err = otelcol.ConvertTo(&otc)
101103
if err != nil {
102104
return corev1.Pod{}, err
103105
}

0 commit comments

Comments
 (0)
Please sign in to comment.