Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 18 additions & 0 deletions .chloggen/fix-labels-version-reflects-image-tag.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# One of 'breaking', 'deprecation', 'new_component', 'enhancement', 'bug_fix'
change_type: bug_fix

# The name of the component, or a single word describing the area of concern, (e.g. collector, target allocator, auto-instrumentation, opamp, github action)
component: collector, targetallocator, opamp

# A brief description of the change. Surround your text with quotes ("") if it needs to start with a backtick (`).
note: "fix labels: ensure app.kubernetes.io/version reflects image tag on workloads"

# One or more tracking issues related to the change
issues: [4175]

# (Optional) One or more lines of additional information to render under the primary note.
# These lines will be padded with 2 spaces and then inserted directly into the document.
# Use pipe (|) for multiline entries.
subtext: |
Fixed the app.kubernetes.io/version label to correctly show the actual image version
instead of 'latest' when using global collector image configuration.
7 changes: 6 additions & 1 deletion internal/manifests/collector/daemonset.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,12 @@ import (
// DaemonSet builds the deployment for the given instance.
func DaemonSet(params manifests.Params) (*appsv1.DaemonSet, error) {
name := naming.Collector(params.OtelCol.Name)
labels := manifestutils.Labels(params.OtelCol.ObjectMeta, name, params.OtelCol.Spec.Image, ComponentOpenTelemetryCollector, params.Config.LabelsFilter)

image := params.OtelCol.Spec.Image
if image == "" {
image = params.Config.CollectorImage
}
labels := manifestutils.Labels(params.OtelCol.ObjectMeta, name, image, ComponentOpenTelemetryCollector, params.Config.LabelsFilter)

annotations, err := manifestutils.Annotations(params.OtelCol, params.Config.AnnotationsFilter)
if err != nil {
Expand Down
88 changes: 87 additions & 1 deletion internal/manifests/collector/daemonset_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ func TestDaemonSetNewDefault(t *testing.T) {
"app.kubernetes.io/managed-by": "opentelemetry-operator",
"app.kubernetes.io/name": "my-instance-collector",
"app.kubernetes.io/part-of": "opentelemetry",
"app.kubernetes.io/version": "latest",
"app.kubernetes.io/version": "0.0.0",
}
assert.Equal(t, expectedLabels, d.Spec.Template.Labels)

Expand Down Expand Up @@ -120,6 +120,92 @@ func TestDaemonsetHostNetwork(t *testing.T) {
assert.Equal(t, d2.Spec.Template.Spec.DNSPolicy, v1.DNSClusterFirstWithHostNet)
}

func TestDaemonSetVersionLabelFromSpec(t *testing.T) {
// prepare
otelcol := v1beta1.OpenTelemetryCollector{
ObjectMeta: metav1.ObjectMeta{
Name: "my-instance",
Namespace: "my-namespace",
},
Spec: v1beta1.OpenTelemetryCollectorSpec{
OpenTelemetryCommonFields: v1beta1.OpenTelemetryCommonFields{
Image: "ghcr.io/open-telemetry/opentelemetry-collector-releases/opentelemetry-collector-contrib:0.129.1",
},
},
}
cfg := config.New()

params := manifests.Params{
Config: cfg,
OtelCol: otelcol,
Log: testLogger,
}

// test
d, err := DaemonSet(params)
require.NoError(t, err)

// verify
assert.Equal(t, "my-instance-collector", d.Name)
assert.Equal(t, "0.129.1", d.Spec.Template.Labels["app.kubernetes.io/version"])
assert.Equal(t, "0.129.1", d.Labels["app.kubernetes.io/version"])
}

func TestDaemonSetVersionLabelFromConfig(t *testing.T) {
// prepare
otelcol := v1beta1.OpenTelemetryCollector{
ObjectMeta: metav1.ObjectMeta{
Name: "my-instance",
Namespace: "my-namespace",
},
Spec: v1beta1.OpenTelemetryCollectorSpec{},
}
cfg := config.New()
cfg.CollectorImage = "ghcr.io/open-telemetry/opentelemetry-collector-releases/opentelemetry-collector-contrib:0.130.0"

params := manifests.Params{
Config: cfg,
OtelCol: otelcol,
Log: testLogger,
}

// test
d, err := DaemonSet(params)
require.NoError(t, err)

// verify
assert.Equal(t, "my-instance-collector", d.Name)
assert.Equal(t, "0.130.0", d.Spec.Template.Labels["app.kubernetes.io/version"])
assert.Equal(t, "0.130.0", d.Labels["app.kubernetes.io/version"])
}

func TestDaemonSetVersionLabelLatest(t *testing.T) {
// prepare
otelcol := v1beta1.OpenTelemetryCollector{
ObjectMeta: metav1.ObjectMeta{
Name: "my-instance",
Namespace: "my-namespace",
},
Spec: v1beta1.OpenTelemetryCollectorSpec{},
}
cfg := config.Config{}

params := manifests.Params{
Config: cfg,
OtelCol: otelcol,
Log: testLogger,
}

// test
d, err := DaemonSet(params)
require.NoError(t, err)

// verify
assert.Equal(t, "my-instance-collector", d.Name)
assert.Equal(t, "latest", d.Spec.Template.Labels["app.kubernetes.io/version"])
assert.Equal(t, "latest", d.Labels["app.kubernetes.io/version"])
}

func TestDaemonsetPodAnnotations(t *testing.T) {
// prepare
testPodAnnotationValues := map[string]string{"annotation-key": "annotation-value"}
Expand Down
7 changes: 6 additions & 1 deletion internal/manifests/collector/deployment.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,12 @@ import (
// Deployment builds the deployment for the given instance.
func Deployment(params manifests.Params) (*appsv1.Deployment, error) {
name := naming.Collector(params.OtelCol.Name)
labels := manifestutils.Labels(params.OtelCol.ObjectMeta, name, params.OtelCol.Spec.Image, ComponentOpenTelemetryCollector, params.Config.LabelsFilter)

image := params.OtelCol.Spec.Image
if image == "" {
image = params.Config.CollectorImage
}
labels := manifestutils.Labels(params.OtelCol.ObjectMeta, name, image, ComponentOpenTelemetryCollector, params.Config.LabelsFilter)
annotations, err := manifestutils.Annotations(params.OtelCol, params.Config.AnnotationsFilter)
if err != nil {
return nil, err
Expand Down
88 changes: 87 additions & 1 deletion internal/manifests/collector/deployment_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,7 @@ func TestDeploymentNewDefault(t *testing.T) {
"app.kubernetes.io/managed-by": "opentelemetry-operator",
"app.kubernetes.io/name": "my-instance-collector",
"app.kubernetes.io/part-of": "opentelemetry",
"app.kubernetes.io/version": "latest",
"app.kubernetes.io/version": "0.0.0",
}
assert.Equal(t, expectedLabels, d.Spec.Template.Labels)

Expand All @@ -123,6 +123,92 @@ func TestDeploymentNewDefault(t *testing.T) {
}
}

func TestDeploymentVersionLabelFromSpec(t *testing.T) {
// prepare
otelcol := v1beta1.OpenTelemetryCollector{
ObjectMeta: metav1.ObjectMeta{
Name: "my-instance",
Namespace: "my-namespace",
},
Spec: v1beta1.OpenTelemetryCollectorSpec{
OpenTelemetryCommonFields: v1beta1.OpenTelemetryCommonFields{
Image: "ghcr.io/open-telemetry/opentelemetry-collector-releases/opentelemetry-collector-contrib:0.129.1",
},
},
}
cfg := config.New()

params := manifests.Params{
Config: cfg,
OtelCol: otelcol,
Log: testLogger,
}

// test
d, err := Deployment(params)
require.NoError(t, err)

// verify
assert.Equal(t, "my-instance-collector", d.Name)
assert.Equal(t, "0.129.1", d.Spec.Template.Labels["app.kubernetes.io/version"])
assert.Equal(t, "0.129.1", d.Labels["app.kubernetes.io/version"])
}

func TestDeploymentVersionLabelFromConfig(t *testing.T) {
// prepare
otelcol := v1beta1.OpenTelemetryCollector{
ObjectMeta: metav1.ObjectMeta{
Name: "my-instance",
Namespace: "my-namespace",
},
Spec: v1beta1.OpenTelemetryCollectorSpec{},
}
cfg := config.New()
cfg.CollectorImage = "ghcr.io/open-telemetry/opentelemetry-collector-releases/opentelemetry-collector-contrib:0.130.0"

params := manifests.Params{
Config: cfg,
OtelCol: otelcol,
Log: testLogger,
}

// test
d, err := Deployment(params)
require.NoError(t, err)

// verify
assert.Equal(t, "my-instance-collector", d.Name)
assert.Equal(t, "0.130.0", d.Spec.Template.Labels["app.kubernetes.io/version"])
assert.Equal(t, "0.130.0", d.Labels["app.kubernetes.io/version"])
}

func TestDeploymentVersionLabelLatest(t *testing.T) {
// prepare
otelcol := v1beta1.OpenTelemetryCollector{
ObjectMeta: metav1.ObjectMeta{
Name: "my-instance",
Namespace: "my-namespace",
},
Spec: v1beta1.OpenTelemetryCollectorSpec{},
}
cfg := config.Config{}

params := manifests.Params{
Config: cfg,
OtelCol: otelcol,
Log: testLogger,
}

// test
d, err := Deployment(params)
require.NoError(t, err)

// verify
assert.Equal(t, "my-instance-collector", d.Name)
assert.Equal(t, "latest", d.Spec.Template.Labels["app.kubernetes.io/version"])
assert.Equal(t, "latest", d.Labels["app.kubernetes.io/version"])
}

func TestDeploymentPodAnnotations(t *testing.T) {
// prepare
testPodAnnotationValues := map[string]string{"annotation-key": "annotation-value"}
Expand Down
7 changes: 6 additions & 1 deletion internal/manifests/collector/statefulset.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,12 @@ import (
// StatefulSet builds the statefulset for the given instance.
func StatefulSet(params manifests.Params) (*appsv1.StatefulSet, error) {
name := naming.Collector(params.OtelCol.Name)
labels := manifestutils.Labels(params.OtelCol.ObjectMeta, name, params.OtelCol.Spec.Image, ComponentOpenTelemetryCollector, params.Config.LabelsFilter)

image := params.OtelCol.Spec.Image
if image == "" {
image = params.Config.CollectorImage
}
labels := manifestutils.Labels(params.OtelCol.ObjectMeta, name, image, ComponentOpenTelemetryCollector, params.Config.LabelsFilter)

annotations, err := manifestutils.Annotations(params.OtelCol, params.Config.AnnotationsFilter)
if err != nil {
Expand Down
93 changes: 92 additions & 1 deletion internal/manifests/collector/statefulset_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ func TestStatefulSetNewDefault(t *testing.T) {
"app.kubernetes.io/managed-by": "opentelemetry-operator",
"app.kubernetes.io/name": "my-instance-collector",
"app.kubernetes.io/part-of": "opentelemetry",
"app.kubernetes.io/version": "latest",
"app.kubernetes.io/version": "0.0.0",
}
assert.Equal(t, expectedLabels, ss.Spec.Template.Labels)

Expand Down Expand Up @@ -204,6 +204,97 @@ func TestStatefulSetPeristentVolumeRetentionPolicy(t *testing.T) {

}

func TestStatefulSetVersionLabelFromSpec(t *testing.T) {
// prepare
otelcol := v1beta1.OpenTelemetryCollector{
ObjectMeta: metav1.ObjectMeta{
Name: "my-instance",
Namespace: "my-namespace",
},
Spec: v1beta1.OpenTelemetryCollectorSpec{
Mode: v1beta1.ModeStatefulSet,
OpenTelemetryCommonFields: v1beta1.OpenTelemetryCommonFields{
Image: "ghcr.io/open-telemetry/opentelemetry-collector-releases/opentelemetry-collector-contrib:0.129.1",
},
},
}
cfg := config.New()

params := manifests.Params{
Config: cfg,
OtelCol: otelcol,
Log: testLogger,
}

// test
s, err := StatefulSet(params)
require.NoError(t, err)

// verify
assert.Equal(t, "my-instance-collector", s.Name)
assert.Equal(t, "0.129.1", s.Spec.Template.Labels["app.kubernetes.io/version"])
assert.Equal(t, "0.129.1", s.Labels["app.kubernetes.io/version"])
}

func TestStatefulSetVersionLabelFromConfig(t *testing.T) {
// prepare
otelcol := v1beta1.OpenTelemetryCollector{
ObjectMeta: metav1.ObjectMeta{
Name: "my-instance",
Namespace: "my-namespace",
},
Spec: v1beta1.OpenTelemetryCollectorSpec{
Mode: v1beta1.ModeStatefulSet,
},
}
cfg := config.New()
cfg.CollectorImage = "ghcr.io/open-telemetry/opentelemetry-collector-releases/opentelemetry-collector-contrib:0.130.0"

params := manifests.Params{
Config: cfg,
OtelCol: otelcol,
Log: testLogger,
}

// test
s, err := StatefulSet(params)
require.NoError(t, err)

// verify
assert.Equal(t, "my-instance-collector", s.Name)
assert.Equal(t, "0.130.0", s.Spec.Template.Labels["app.kubernetes.io/version"])
assert.Equal(t, "0.130.0", s.Labels["app.kubernetes.io/version"])
}

func TestStatefulSetVersionLabelLatest(t *testing.T) {
// prepare
otelcol := v1beta1.OpenTelemetryCollector{
ObjectMeta: metav1.ObjectMeta{
Name: "my-instance",
Namespace: "my-namespace",
},
Spec: v1beta1.OpenTelemetryCollectorSpec{
Mode: v1beta1.ModeStatefulSet,
},
}
cfg := config.Config{}

params := manifests.Params{
Config: cfg,
OtelCol: otelcol,
Log: testLogger,
}

// test
s, err := StatefulSet(params)
require.NoError(t, err)

// verify
assert.Equal(t, "my-instance-collector", s.Name)
assert.Equal(t, "latest", s.Spec.Template.Labels["app.kubernetes.io/version"])
assert.Equal(t, "latest", s.Labels["app.kubernetes.io/version"])
}

func TestStatefulSetPodAnnotations(t *testing.T) {
// prepare
testPodAnnotationValues := map[string]string{"annotation-key": "annotation-value"}
Expand Down
7 changes: 6 additions & 1 deletion internal/manifests/opampbridge/deployment.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,12 @@ import (
// Deployment builds the deployment for the given instance.
func Deployment(params manifests.Params) *appsv1.Deployment {
name := naming.OpAMPBridge(params.OpAMPBridge.Name)
labels := manifestutils.Labels(params.OpAMPBridge.ObjectMeta, name, params.OpAMPBridge.Spec.Image, ComponentOpAMPBridge, params.Config.LabelsFilter)

image := params.OpAMPBridge.Spec.Image
if image == "" {
image = params.Config.OperatorOpAMPBridgeImage
}
labels := manifestutils.Labels(params.OpAMPBridge.ObjectMeta, name, image, ComponentOpAMPBridge, params.Config.LabelsFilter)
configMap, err := ConfigMap(params)
if err != nil {
params.Log.Info("failed to construct OpAMPBridge ConfigMap for annotations")
Expand Down
Loading
Loading