Skip to content

Commit 4499392

Browse files
committed
internal/manifests/collector: switch internally to v1alphav2
Signed-off-by: Benedikt Bongartz <[email protected]>
1 parent 46a54c2 commit 4499392

23 files changed

+563
-317
lines changed

internal/api/convert/v1alpha.go

+118
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,118 @@
1+
package convert
2+
3+
import (
4+
"encoding/json"
5+
"fmt"
6+
7+
appsv1 "k8s.io/api/apps/v1"
8+
"sigs.k8s.io/yaml"
9+
10+
"github.com/open-telemetry/opentelemetry-operator/apis/v1alpha1"
11+
"github.com/open-telemetry/opentelemetry-operator/apis/v1alpha2"
12+
)
13+
14+
func V1Alpha1to2(in v1alpha1.OpenTelemetryCollector) v1alpha2.OpenTelemetryCollector {
15+
copy := in.DeepCopy()
16+
out := v1alpha2.OpenTelemetryCollector{
17+
TypeMeta: copy.TypeMeta,
18+
ObjectMeta: copy.ObjectMeta,
19+
}
20+
21+
collectorJson, err := yaml.YAMLToJSON([]byte(in.Spec.Config))
22+
if err != nil {
23+
panic(fmt.Sprintf("could not convert v1alpha1 yaml config to json, err: %s", err))
24+
}
25+
26+
cfg := v1alpha2.Config{}
27+
if err := json.Unmarshal(collectorJson, &cfg); err != nil {
28+
panic(fmt.Sprintf("could not convert v1alpha1 config to v1alpha2, err: %s", err))
29+
}
30+
out.Spec.Config = cfg
31+
32+
out.Spec.OpenTelemetryCommonFields.ManagementState = v1alpha2.ManagementStateType(copy.Spec.ManagementState)
33+
out.Spec.OpenTelemetryCommonFields.Resources = copy.Spec.Resources
34+
out.Spec.OpenTelemetryCommonFields.NodeSelector = copy.Spec.NodeSelector
35+
out.Spec.OpenTelemetryCommonFields.Args = copy.Spec.NodeSelector
36+
out.Spec.OpenTelemetryCommonFields.Replicas = copy.Spec.Replicas
37+
38+
if copy.Spec.Autoscaler != nil {
39+
metrics := make([]v1alpha2.MetricSpec, len(copy.Spec.Autoscaler.Metrics))
40+
for i, m := range copy.Spec.Autoscaler.Metrics {
41+
metrics[i] = v1alpha2.MetricSpec{
42+
Type: m.Type,
43+
Pods: m.Pods,
44+
}
45+
}
46+
out.Spec.OpenTelemetryCommonFields.Autoscaler = &v1alpha2.AutoscalerSpec{
47+
MinReplicas: copy.Spec.Autoscaler.MinReplicas,
48+
MaxReplicas: copy.Spec.Autoscaler.MaxReplicas,
49+
Behavior: copy.Spec.Autoscaler.Behavior,
50+
Metrics: metrics,
51+
TargetCPUUtilization: copy.Spec.Autoscaler.TargetCPUUtilization,
52+
TargetMemoryUtilization: copy.Spec.Autoscaler.TargetMemoryUtilization,
53+
}
54+
}
55+
56+
if copy.Spec.PodDisruptionBudget != nil {
57+
out.Spec.OpenTelemetryCommonFields.PodDisruptionBudget = &v1alpha2.PodDisruptionBudgetSpec{
58+
MinAvailable: copy.Spec.PodDisruptionBudget.MinAvailable,
59+
MaxUnavailable: copy.Spec.PodDisruptionBudget.MaxUnavailable,
60+
}
61+
}
62+
if copy.Spec.SecurityContext != nil {
63+
out.Spec.OpenTelemetryCommonFields.SecurityContext = copy.Spec.SecurityContext
64+
}
65+
if copy.Spec.PodSecurityContext != nil {
66+
out.Spec.OpenTelemetryCommonFields.PodSecurityContext = copy.Spec.PodSecurityContext
67+
}
68+
out.Spec.OpenTelemetryCommonFields.PodAnnotations = copy.Spec.PodAnnotations
69+
out.Spec.OpenTelemetryCommonFields.ServiceAccount = copy.Spec.ServiceAccount
70+
out.Spec.OpenTelemetryCommonFields.Image = copy.Spec.Image
71+
out.Spec.OpenTelemetryCommonFields.ImagePullPolicy = copy.Spec.ImagePullPolicy
72+
out.Spec.OpenTelemetryCommonFields.VolumeMounts = copy.Spec.VolumeMounts
73+
out.Spec.OpenTelemetryCommonFields.Ports = copy.Spec.Ports
74+
out.Spec.OpenTelemetryCommonFields.Env = copy.Spec.Env
75+
out.Spec.OpenTelemetryCommonFields.EnvFrom = copy.Spec.EnvFrom
76+
out.Spec.OpenTelemetryCommonFields.VolumeClaimTemplates = copy.Spec.VolumeClaimTemplates
77+
out.Spec.OpenTelemetryCommonFields.Tolerations = copy.Spec.Tolerations
78+
out.Spec.OpenTelemetryCommonFields.Volumes = copy.Spec.Volumes
79+
out.Spec.OpenTelemetryCommonFields.Affinity = copy.Spec.Affinity
80+
out.Spec.OpenTelemetryCommonFields.Lifecycle = copy.Spec.Lifecycle
81+
out.Spec.OpenTelemetryCommonFields.TerminationGracePeriodSeconds = copy.Spec.TerminationGracePeriodSeconds
82+
out.Spec.OpenTelemetryCommonFields.TopologySpreadConstraints = copy.Spec.TopologySpreadConstraints
83+
out.Spec.OpenTelemetryCommonFields.HostNetwork = copy.Spec.HostNetwork
84+
out.Spec.OpenTelemetryCommonFields.PriorityClassName = copy.Spec.PriorityClassName
85+
out.Spec.OpenTelemetryCommonFields.InitContainers = copy.Spec.InitContainers
86+
out.Spec.OpenTelemetryCommonFields.AdditionalContainers = copy.Spec.AdditionalContainers
87+
88+
// TODO: migrate Target Allocator fields
89+
// out.Spec.TargetAllocator = ...
90+
91+
out.Spec.Mode = v1alpha2.Mode(copy.Spec.Mode)
92+
out.Spec.UpgradeStrategy = v1alpha2.UpgradeStrategy(copy.Spec.UpgradeStrategy)
93+
out.Spec.Ingress.Type = v1alpha2.IngressType(copy.Spec.Ingress.Type)
94+
out.Spec.Ingress.Annotations = copy.Spec.Ingress.Annotations
95+
out.Spec.Ingress.TLS = copy.Spec.Ingress.TLS
96+
out.Spec.Ingress.IngressClassName = copy.Spec.Ingress.IngressClassName
97+
out.Spec.Ingress.Route.Termination = v1alpha2.TLSRouteTerminationType(copy.Spec.Ingress.Route.Termination)
98+
99+
if copy.Spec.LivenessProbe != nil {
100+
out.Spec.LivenessProbe = &v1alpha2.Probe{
101+
InitialDelaySeconds: copy.Spec.LivenessProbe.InitialDelaySeconds,
102+
TimeoutSeconds: copy.Spec.LivenessProbe.TimeoutSeconds,
103+
PeriodSeconds: copy.Spec.LivenessProbe.PeriodSeconds,
104+
SuccessThreshold: copy.Spec.LivenessProbe.SuccessThreshold,
105+
FailureThreshold: copy.Spec.LivenessProbe.FailureThreshold,
106+
TerminationGracePeriodSeconds: copy.Spec.LivenessProbe.TerminationGracePeriodSeconds,
107+
}
108+
}
109+
110+
out.Spec.Observability.Metrics.EnableMetrics = copy.Spec.Observability.Metrics.EnableMetrics
111+
112+
out.Spec.ConfigMaps = copy.Spec.ConfigMaps
113+
out.Spec.DaemonSetUpdateStrategy = appsv1.DaemonSetUpdateStrategy{} // NOTE: N/A in v1alpha1
114+
out.Spec.DeploymentUpdateStrategy.Type = copy.Spec.DeploymentUpdateStrategy.Type
115+
out.Spec.DeploymentUpdateStrategy.RollingUpdate = copy.Spec.DeploymentUpdateStrategy.RollingUpdate
116+
117+
return out
118+
}

internal/manifests/collector/annotations.go

+12-5
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,14 @@ package collector
1616

1717
import (
1818
"crypto/sha256"
19+
"encoding/json"
1920
"fmt"
2021

21-
"github.com/open-telemetry/opentelemetry-operator/apis/v1alpha1"
22+
"github.com/open-telemetry/opentelemetry-operator/apis/v1alpha2"
2223
)
2324

2425
// Annotations return the annotations for OpenTelemetryCollector pod.
25-
func Annotations(instance v1alpha1.OpenTelemetryCollector) map[string]string {
26+
func Annotations(instance v1alpha2.OpenTelemetryCollector) map[string]string {
2627
// new map every time, so that we don't touch the instance's annotations
2728
annotations := map[string]string{}
2829

@@ -37,14 +38,15 @@ func Annotations(instance v1alpha1.OpenTelemetryCollector) map[string]string {
3738
annotations[k] = v
3839
}
3940
}
41+
4042
// make sure sha256 for configMap is always calculated
4143
annotations["opentelemetry-operator-config/sha256"] = getConfigMapSHA(instance.Spec.Config)
4244

4345
return annotations
4446
}
4547

4648
// PodAnnotations return the spec annotations for OpenTelemetryCollector pod.
47-
func PodAnnotations(instance v1alpha1.OpenTelemetryCollector) map[string]string {
49+
func PodAnnotations(instance v1alpha2.OpenTelemetryCollector) map[string]string {
4850
// new map every time, so that we don't touch the instance's annotations
4951
podAnnotations := map[string]string{}
5052

@@ -66,7 +68,12 @@ func PodAnnotations(instance v1alpha1.OpenTelemetryCollector) map[string]string
6668
return podAnnotations
6769
}
6870

69-
func getConfigMapSHA(config string) string {
70-
h := sha256.Sum256([]byte(config))
71+
func getConfigMapSHA(config v1alpha2.Config) string {
72+
cfg := v1alpha2.Config{}
73+
b, err := json.Marshal(&cfg)
74+
if err != nil {
75+
return "invalid"
76+
}
77+
h := sha256.Sum256(b)
7178
return fmt.Sprintf("%x", h)
7279
}

internal/manifests/collector/annotations_test.go

+30-14
Original file line numberDiff line numberDiff line change
@@ -20,18 +20,25 @@ import (
2020
"github.com/stretchr/testify/assert"
2121
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2222

23-
"github.com/open-telemetry/opentelemetry-operator/apis/v1alpha1"
23+
"github.com/open-telemetry/opentelemetry-operator/apis/v1alpha2"
2424
)
2525

2626
func TestDefaultAnnotations(t *testing.T) {
2727
// prepare
28-
otelcol := v1alpha1.OpenTelemetryCollector{
28+
otelcol := v1alpha2.OpenTelemetryCollector{
2929
ObjectMeta: metav1.ObjectMeta{
3030
Name: "my-instance",
3131
Namespace: "my-ns",
3232
},
33-
Spec: v1alpha1.OpenTelemetryCollectorSpec{
34-
Config: "test",
33+
Spec: v1alpha2.OpenTelemetryCollectorSpec{
34+
Config: v1alpha2.Config{
35+
Service: v1alpha2.Service{
36+
Extensions: func() *[]string {
37+
res := []string{"test"}
38+
return &res
39+
}(),
40+
},
41+
},
3542
},
3643
}
3744

@@ -43,17 +50,17 @@ func TestDefaultAnnotations(t *testing.T) {
4350
assert.Equal(t, "true", annotations["prometheus.io/scrape"])
4451
assert.Equal(t, "8888", annotations["prometheus.io/port"])
4552
assert.Equal(t, "/metrics", annotations["prometheus.io/path"])
46-
assert.Equal(t, "9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08", annotations["opentelemetry-operator-config/sha256"])
53+
assert.Equal(t, "fbcdae6a02b2115cd5ca4f34298202ab041d1dfe62edebfaadb48b1ee178231d", annotations["opentelemetry-operator-config/sha256"])
4754
//verify propagation from metadata.annotations to spec.template.spec.metadata.annotations
4855
assert.Equal(t, "true", podAnnotations["prometheus.io/scrape"])
4956
assert.Equal(t, "8888", podAnnotations["prometheus.io/port"])
5057
assert.Equal(t, "/metrics", podAnnotations["prometheus.io/path"])
51-
assert.Equal(t, "9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08", podAnnotations["opentelemetry-operator-config/sha256"])
58+
assert.Equal(t, "fbcdae6a02b2115cd5ca4f34298202ab041d1dfe62edebfaadb48b1ee178231d", podAnnotations["opentelemetry-operator-config/sha256"])
5259
}
5360

5461
func TestUserAnnotations(t *testing.T) {
5562
// prepare
56-
otelcol := v1alpha1.OpenTelemetryCollector{
63+
otelcol := v1alpha2.OpenTelemetryCollector{
5764
ObjectMeta: metav1.ObjectMeta{
5865
Name: "my-instance",
5966
Namespace: "my-ns",
@@ -63,8 +70,15 @@ func TestUserAnnotations(t *testing.T) {
6370
"opentelemetry-operator-config/sha256": "shouldBeOverwritten",
6471
},
6572
},
66-
Spec: v1alpha1.OpenTelemetryCollectorSpec{
67-
Config: "test",
73+
Spec: v1alpha2.OpenTelemetryCollectorSpec{
74+
Config: v1alpha2.Config{
75+
Service: v1alpha2.Service{
76+
Extensions: func() *[]string {
77+
res := []string{"test"}
78+
return &res
79+
}(),
80+
},
81+
},
6882
},
6983
}
7084

@@ -76,18 +90,20 @@ func TestUserAnnotations(t *testing.T) {
7690
assert.Equal(t, "false", annotations["prometheus.io/scrape"])
7791
assert.Equal(t, "1234", annotations["prometheus.io/port"])
7892
assert.Equal(t, "/test", annotations["prometheus.io/path"])
79-
assert.Equal(t, "9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08", annotations["opentelemetry-operator-config/sha256"])
80-
assert.Equal(t, "9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08", podAnnotations["opentelemetry-operator-config/sha256"])
93+
assert.Equal(t, "fbcdae6a02b2115cd5ca4f34298202ab041d1dfe62edebfaadb48b1ee178231d", annotations["opentelemetry-operator-config/sha256"])
94+
assert.Equal(t, "fbcdae6a02b2115cd5ca4f34298202ab041d1dfe62edebfaadb48b1ee178231d", podAnnotations["opentelemetry-operator-config/sha256"])
8195
}
8296

8397
func TestAnnotationsPropagateDown(t *testing.T) {
8498
// prepare
85-
otelcol := v1alpha1.OpenTelemetryCollector{
99+
otelcol := v1alpha2.OpenTelemetryCollector{
86100
ObjectMeta: metav1.ObjectMeta{
87101
Annotations: map[string]string{"myapp": "mycomponent"},
88102
},
89-
Spec: v1alpha1.OpenTelemetryCollectorSpec{
90-
PodAnnotations: map[string]string{"pod_annotation": "pod_annotation_value"},
103+
Spec: v1alpha2.OpenTelemetryCollectorSpec{
104+
OpenTelemetryCommonFields: v1alpha2.OpenTelemetryCommonFields{
105+
PodAnnotations: map[string]string{"pod_annotation": "pod_annotation_value"},
106+
},
91107
},
92108
}
93109

internal/manifests/collector/container.go

+19-5
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
package collector
1616

1717
import (
18+
"encoding/json"
1819
"errors"
1920
"fmt"
2021
"path"
@@ -24,8 +25,9 @@ import (
2425
"github.com/operator-framework/operator-lib/proxy"
2526
corev1 "k8s.io/api/core/v1"
2627
"k8s.io/apimachinery/pkg/util/validation"
28+
"sigs.k8s.io/yaml"
2729

28-
"github.com/open-telemetry/opentelemetry-operator/apis/v1alpha1"
30+
"github.com/open-telemetry/opentelemetry-operator/apis/v1alpha2"
2931
"github.com/open-telemetry/opentelemetry-operator/internal/config"
3032
"github.com/open-telemetry/opentelemetry-operator/internal/manifests/collector/adapters"
3133
"github.com/open-telemetry/opentelemetry-operator/internal/naming"
@@ -36,14 +38,26 @@ import (
3638
const maxPortLen = 15
3739

3840
// Container builds a container for the given collector.
39-
func Container(cfg config.Config, logger logr.Logger, otelcol v1alpha1.OpenTelemetryCollector, addConfig bool) corev1.Container {
41+
func Container(cfg config.Config, logger logr.Logger, otelcol v1alpha2.OpenTelemetryCollector, addConfig bool) corev1.Container {
4042
image := otelcol.Spec.Image
4143
if len(image) == 0 {
4244
image = cfg.CollectorImage()
4345
}
4446

47+
configJson, err := json.Marshal(otelcol.Spec.Config)
48+
if err != nil {
49+
logger.Error(err, "could not marshal config to json")
50+
return corev1.Container{}
51+
}
52+
53+
configYaml, err := yaml.JSONToYAML(configJson)
54+
if err != nil {
55+
logger.Error(err, "could not convert json to yaml")
56+
return corev1.Container{}
57+
}
58+
4559
// build container ports from service ports
46-
ports, err := getConfigContainerPorts(logger, otelcol.Spec.Config)
60+
ports, err := getConfigContainerPorts(logger, string(configYaml))
4761
if err != nil {
4862
logger.Error(err, "container ports config")
4963
}
@@ -133,7 +147,7 @@ func Container(cfg config.Config, logger logr.Logger, otelcol v1alpha1.OpenTelem
133147
}
134148

135149
var livenessProbe *corev1.Probe
136-
if configFromString, err := adapters.ConfigFromString(otelcol.Spec.Config); err == nil {
150+
if configFromString, err := adapters.ConfigFromString(string(configYaml)); err == nil {
137151
if probe, err := getLivenessProbe(configFromString, otelcol.Spec.LivenessProbe); err == nil {
138152
livenessProbe = probe
139153
} else if errors.Is(err, adapters.ErrNoServiceExtensions) {
@@ -220,7 +234,7 @@ func portMapToList(portMap map[string]corev1.ContainerPort) []corev1.ContainerPo
220234
return ports
221235
}
222236

223-
func getLivenessProbe(config map[interface{}]interface{}, probeConfig *v1alpha1.Probe) (*corev1.Probe, error) {
237+
func getLivenessProbe(config map[interface{}]interface{}, probeConfig *v1alpha2.Probe) (*corev1.Probe, error) {
224238
probe, err := adapters.ConfigToContainerProbe(config)
225239
if err != nil {
226240
return nil, err

0 commit comments

Comments
 (0)