diff --git a/internal/manifests/collector/collector.go b/internal/manifests/collector/collector.go index 25309db37f..f33f479266 100644 --- a/internal/manifests/collector/collector.go +++ b/internal/manifests/collector/collector.go @@ -22,6 +22,10 @@ import ( "github.com/open-telemetry/opentelemetry-operator/pkg/featuregate" ) +const ( + ComponentOpenTelemetryCollector = "opentelemetry-collector" +) + // Build creates the manifest for the collector resource. func Build(params manifests.Params) ([]client.Object, error) { var resourceManifests []client.Object diff --git a/internal/manifests/collector/configmap.go b/internal/manifests/collector/configmap.go index cdf2bdb7c8..47a5967c4b 100644 --- a/internal/manifests/collector/configmap.go +++ b/internal/manifests/collector/configmap.go @@ -19,12 +19,13 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "github.com/open-telemetry/opentelemetry-operator/internal/manifests" + "github.com/open-telemetry/opentelemetry-operator/internal/manifests/manifestutils" "github.com/open-telemetry/opentelemetry-operator/internal/naming" ) func ConfigMap(params manifests.Params) *corev1.ConfigMap { name := naming.ConfigMap(params.OtelCol.Name) - labels := Labels(params.OtelCol, name, []string{}) + labels := manifestutils.Labels(params.OtelCol.ObjectMeta, name, params.OtelCol.Spec.Image, ComponentOpenTelemetryCollector, []string{}) replacedConf, err := ReplaceConfig(params.OtelCol) if err != nil { diff --git a/internal/manifests/collector/daemonset.go b/internal/manifests/collector/daemonset.go index ab663d8acb..04da2faef0 100644 --- a/internal/manifests/collector/daemonset.go +++ b/internal/manifests/collector/daemonset.go @@ -20,13 +20,14 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "github.com/open-telemetry/opentelemetry-operator/internal/manifests" + "github.com/open-telemetry/opentelemetry-operator/internal/manifests/manifestutils" "github.com/open-telemetry/opentelemetry-operator/internal/naming" ) // DaemonSet builds the deployment for the given instance. func DaemonSet(params manifests.Params) *appsv1.DaemonSet { name := naming.Collector(params.OtelCol.Name) - labels := Labels(params.OtelCol, name, params.Config.LabelsFilter()) + labels := manifestutils.Labels(params.OtelCol.ObjectMeta, name, params.OtelCol.Spec.Image, ComponentOpenTelemetryCollector, params.Config.LabelsFilter()) annotations := Annotations(params.OtelCol) podAnnotations := PodAnnotations(params.OtelCol) @@ -39,7 +40,7 @@ func DaemonSet(params manifests.Params) *appsv1.DaemonSet { }, Spec: appsv1.DaemonSetSpec{ Selector: &metav1.LabelSelector{ - MatchLabels: SelectorLabels(params.OtelCol), + MatchLabels: manifestutils.SelectorLabels(params.OtelCol.ObjectMeta, ComponentOpenTelemetryCollector), }, Template: corev1.PodTemplateSpec{ ObjectMeta: metav1.ObjectMeta{ diff --git a/internal/manifests/collector/deployment.go b/internal/manifests/collector/deployment.go index d186819367..3a1b0abf21 100644 --- a/internal/manifests/collector/deployment.go +++ b/internal/manifests/collector/deployment.go @@ -20,13 +20,14 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "github.com/open-telemetry/opentelemetry-operator/internal/manifests" + "github.com/open-telemetry/opentelemetry-operator/internal/manifests/manifestutils" "github.com/open-telemetry/opentelemetry-operator/internal/naming" ) // Deployment builds the deployment for the given instance. func Deployment(params manifests.Params) *appsv1.Deployment { name := naming.Collector(params.OtelCol.Name) - labels := Labels(params.OtelCol, name, params.Config.LabelsFilter()) + labels := manifestutils.Labels(params.OtelCol.ObjectMeta, name, params.OtelCol.Spec.Image, ComponentOpenTelemetryCollector, params.Config.LabelsFilter()) annotations := Annotations(params.OtelCol) podAnnotations := PodAnnotations(params.OtelCol) @@ -41,7 +42,7 @@ func Deployment(params manifests.Params) *appsv1.Deployment { Spec: appsv1.DeploymentSpec{ Replicas: params.OtelCol.Spec.Replicas, Selector: &metav1.LabelSelector{ - MatchLabels: SelectorLabels(params.OtelCol), + MatchLabels: manifestutils.SelectorLabels(params.OtelCol.ObjectMeta, ComponentOpenTelemetryCollector), }, Template: corev1.PodTemplateSpec{ ObjectMeta: metav1.ObjectMeta{ diff --git a/internal/manifests/collector/horizontalpodautoscaler.go b/internal/manifests/collector/horizontalpodautoscaler.go index d4915b8f44..0a4bdefccd 100644 --- a/internal/manifests/collector/horizontalpodautoscaler.go +++ b/internal/manifests/collector/horizontalpodautoscaler.go @@ -22,12 +22,13 @@ import ( "github.com/open-telemetry/opentelemetry-operator/apis/v1alpha1" "github.com/open-telemetry/opentelemetry-operator/internal/manifests" + "github.com/open-telemetry/opentelemetry-operator/internal/manifests/manifestutils" "github.com/open-telemetry/opentelemetry-operator/internal/naming" ) func HorizontalPodAutoscaler(params manifests.Params) client.Object { name := naming.Collector(params.OtelCol.Name) - labels := Labels(params.OtelCol, name, params.Config.LabelsFilter()) + labels := manifestutils.Labels(params.OtelCol.ObjectMeta, name, params.OtelCol.Spec.Image, ComponentOpenTelemetryCollector, params.Config.LabelsFilter()) annotations := Annotations(params.OtelCol) var result client.Object diff --git a/internal/manifests/collector/poddisruptionbudget.go b/internal/manifests/collector/poddisruptionbudget.go index 8e9e64803d..bbd3ce50a0 100644 --- a/internal/manifests/collector/poddisruptionbudget.go +++ b/internal/manifests/collector/poddisruptionbudget.go @@ -20,6 +20,7 @@ import ( "sigs.k8s.io/controller-runtime/pkg/client" "github.com/open-telemetry/opentelemetry-operator/internal/manifests" + "github.com/open-telemetry/opentelemetry-operator/internal/manifests/manifestutils" "github.com/open-telemetry/opentelemetry-operator/internal/naming" ) @@ -31,7 +32,7 @@ func PodDisruptionBudget(params manifests.Params) client.Object { } name := naming.Collector(params.OtelCol.Name) - labels := Labels(params.OtelCol, name, params.Config.LabelsFilter()) + labels := manifestutils.Labels(params.OtelCol.ObjectMeta, name, params.OtelCol.Spec.Image, ComponentOpenTelemetryCollector, params.Config.LabelsFilter()) annotations := Annotations(params.OtelCol) objectMeta := metav1.ObjectMeta{ diff --git a/internal/manifests/collector/service.go b/internal/manifests/collector/service.go index e26f45ef04..1ddd1ce13e 100644 --- a/internal/manifests/collector/service.go +++ b/internal/manifests/collector/service.go @@ -25,6 +25,7 @@ import ( "github.com/open-telemetry/opentelemetry-operator/apis/v1alpha1" "github.com/open-telemetry/opentelemetry-operator/internal/manifests" "github.com/open-telemetry/opentelemetry-operator/internal/manifests/collector/adapters" + "github.com/open-telemetry/opentelemetry-operator/internal/manifests/manifestutils" "github.com/open-telemetry/opentelemetry-operator/internal/naming" ) @@ -58,7 +59,7 @@ func HeadlessService(params manifests.Params) *corev1.Service { func MonitoringService(params manifests.Params) *corev1.Service { name := naming.MonitoringService(params.OtelCol.Name) - labels := Labels(params.OtelCol, name, []string{}) + labels := manifestutils.Labels(params.OtelCol.ObjectMeta, name, params.OtelCol.Spec.Image, ComponentOpenTelemetryCollector, []string{}) c, err := adapters.ConfigFromString(params.OtelCol.Spec.Config) // TODO: Update this to properly return an error https://github.com/open-telemetry/opentelemetry-operator/issues/1972 @@ -81,7 +82,7 @@ func MonitoringService(params manifests.Params) *corev1.Service { Annotations: params.OtelCol.Annotations, }, Spec: corev1.ServiceSpec{ - Selector: SelectorLabels(params.OtelCol), + Selector: manifestutils.SelectorLabels(params.OtelCol.ObjectMeta, ComponentOpenTelemetryCollector), ClusterIP: "", Ports: []corev1.ServicePort{{ Name: "monitoring", @@ -93,7 +94,7 @@ func MonitoringService(params manifests.Params) *corev1.Service { func Service(params manifests.Params) *corev1.Service { name := naming.Service(params.OtelCol.Name) - labels := Labels(params.OtelCol, name, []string{}) + labels := manifestutils.Labels(params.OtelCol.ObjectMeta, name, params.OtelCol.Spec.Image, ComponentOpenTelemetryCollector, []string{}) configFromString, err := adapters.ConfigFromString(params.OtelCol.Spec.Config) if err != nil { @@ -151,7 +152,7 @@ func Service(params manifests.Params) *corev1.Service { }, Spec: corev1.ServiceSpec{ InternalTrafficPolicy: &trafficPolicy, - Selector: SelectorLabels(params.OtelCol), + Selector: manifestutils.SelectorLabels(params.OtelCol.ObjectMeta, ComponentOpenTelemetryCollector), ClusterIP: "", Ports: ports, }, diff --git a/internal/manifests/collector/service_test.go b/internal/manifests/collector/service_test.go index fc2bcbfbfc..a3a298b6f1 100644 --- a/internal/manifests/collector/service_test.go +++ b/internal/manifests/collector/service_test.go @@ -22,6 +22,7 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "github.com/open-telemetry/opentelemetry-operator/internal/manifests" + "github.com/open-telemetry/opentelemetry-operator/internal/manifests/manifestutils" "github.com/open-telemetry/opentelemetry-operator/apis/v1alpha1" "github.com/open-telemetry/opentelemetry-operator/internal/config" @@ -207,7 +208,7 @@ func service(name string, ports []v1.ServicePort) v1.Service { func serviceWithInternalTrafficPolicy(name string, ports []v1.ServicePort, internalTrafficPolicy v1.ServiceInternalTrafficPolicyType) v1.Service { params := deploymentParams() - labels := Labels(params.OtelCol, name, []string{}) + labels := manifestutils.Labels(params.OtelCol.ObjectMeta, name, params.OtelCol.Spec.Image, ComponentOpenTelemetryCollector, []string{}) return v1.Service{ ObjectMeta: metav1.ObjectMeta{ @@ -218,7 +219,7 @@ func serviceWithInternalTrafficPolicy(name string, ports []v1.ServicePort, inter }, Spec: v1.ServiceSpec{ InternalTrafficPolicy: &internalTrafficPolicy, - Selector: SelectorLabels(params.OtelCol), + Selector: manifestutils.SelectorLabels(params.OtelCol.ObjectMeta, ComponentOpenTelemetryCollector), ClusterIP: "", Ports: ports, }, diff --git a/internal/manifests/collector/serviceaccount.go b/internal/manifests/collector/serviceaccount.go index 243885d7f4..19af012444 100644 --- a/internal/manifests/collector/serviceaccount.go +++ b/internal/manifests/collector/serviceaccount.go @@ -20,6 +20,7 @@ import ( "github.com/open-telemetry/opentelemetry-operator/apis/v1alpha1" "github.com/open-telemetry/opentelemetry-operator/internal/manifests" + "github.com/open-telemetry/opentelemetry-operator/internal/manifests/manifestutils" "github.com/open-telemetry/opentelemetry-operator/internal/naming" ) @@ -35,7 +36,7 @@ func ServiceAccountName(instance v1alpha1.OpenTelemetryCollector) string { // ServiceAccount returns the service account for the given instance. func ServiceAccount(params manifests.Params) *corev1.ServiceAccount { name := naming.ServiceAccount(params.OtelCol.Name) - labels := Labels(params.OtelCol, name, []string{}) + labels := manifestutils.Labels(params.OtelCol.ObjectMeta, name, params.OtelCol.Spec.Image, ComponentOpenTelemetryCollector, []string{}) return &corev1.ServiceAccount{ ObjectMeta: metav1.ObjectMeta{ diff --git a/internal/manifests/collector/statefulset.go b/internal/manifests/collector/statefulset.go index 85afb33cc9..a08304807d 100644 --- a/internal/manifests/collector/statefulset.go +++ b/internal/manifests/collector/statefulset.go @@ -20,13 +20,14 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "github.com/open-telemetry/opentelemetry-operator/internal/manifests" + "github.com/open-telemetry/opentelemetry-operator/internal/manifests/manifestutils" "github.com/open-telemetry/opentelemetry-operator/internal/naming" ) // StatefulSet builds the statefulset for the given instance. func StatefulSet(params manifests.Params) *appsv1.StatefulSet { name := naming.Collector(params.OtelCol.Name) - labels := Labels(params.OtelCol, name, params.Config.LabelsFilter()) + labels := manifestutils.Labels(params.OtelCol.ObjectMeta, name, params.OtelCol.Spec.Image, ComponentOpenTelemetryCollector, params.Config.LabelsFilter()) annotations := Annotations(params.OtelCol) podAnnotations := PodAnnotations(params.OtelCol) @@ -41,7 +42,7 @@ func StatefulSet(params manifests.Params) *appsv1.StatefulSet { Spec: appsv1.StatefulSetSpec{ ServiceName: naming.Service(params.OtelCol.Name), Selector: &metav1.LabelSelector{ - MatchLabels: SelectorLabels(params.OtelCol), + MatchLabels: manifestutils.SelectorLabels(params.OtelCol.ObjectMeta, ComponentOpenTelemetryCollector), }, Template: corev1.PodTemplateSpec{ ObjectMeta: metav1.ObjectMeta{ diff --git a/internal/manifests/collector/labels.go b/internal/manifests/manifestutils/labels.go similarity index 80% rename from internal/manifests/collector/labels.go rename to internal/manifests/manifestutils/labels.go index ca586d8b0c..cfcf3d2430 100644 --- a/internal/manifests/collector/labels.go +++ b/internal/manifests/manifestutils/labels.go @@ -12,13 +12,14 @@ // See the License for the specific language governing permissions and // limitations under the License. -package collector +package manifestutils import ( "regexp" "strings" - "github.com/open-telemetry/opentelemetry-operator/apis/v1alpha1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "github.com/open-telemetry/opentelemetry-operator/internal/naming" ) @@ -27,12 +28,11 @@ func isFilteredLabel(label string, filterLabels []string) bool { match, _ := regexp.MatchString(pattern, label) return match } - return false } -// Labels return the common labels to all objects that are part of a managed OpenTelemetryCollector. -func Labels(instance v1alpha1.OpenTelemetryCollector, name string, filterLabels []string) map[string]string { +// Labels return the common labels to all objects that are part of a managed CR. +func Labels(instance metav1.ObjectMeta, name string, image string, component string, filterLabels []string) map[string]string { var versionLabel string // new map every time, so that we don't touch the instance's label base := map[string]string{} @@ -44,11 +44,11 @@ func Labels(instance v1alpha1.OpenTelemetryCollector, name string, filterLabels } } - for k, v := range SelectorLabels(instance) { + for k, v := range SelectorLabels(instance, component) { base[k] = v } - version := strings.Split(instance.Spec.Image, ":") + version := strings.Split(image, ":") for _, v := range version { if strings.HasSuffix(v, "@sha256") { versionLabel = strings.TrimSuffix(v, "@sha256") @@ -67,18 +67,17 @@ func Labels(instance v1alpha1.OpenTelemetryCollector, name string, filterLabels if _, ok := base["app.kubernetes.io/name"]; !ok { base["app.kubernetes.io/name"] = name } - return base } -// SelectorLabels return the common labels to all objects that are part of a managed OpenTelemetryCollector to use as selector. +// SelectorLabels return the common labels to all objects that are part of a managed CR to use as selector. // Selector labels are immutable for Deployment, StatefulSet and DaemonSet, therefore, no labels in selector should be // expected to be modified for the lifetime of the object. -func SelectorLabels(instance v1alpha1.OpenTelemetryCollector) map[string]string { +func SelectorLabels(instance metav1.ObjectMeta, component string) map[string]string { return map[string]string{ "app.kubernetes.io/managed-by": "opentelemetry-operator", "app.kubernetes.io/instance": naming.Truncate("%s.%s", 63, instance.Namespace, instance.Name), "app.kubernetes.io/part-of": "opentelemetry", - "app.kubernetes.io/component": "opentelemetry-collector", + "app.kubernetes.io/component": component, } } diff --git a/internal/manifests/collector/labels_test.go b/internal/manifests/manifestutils/labels_test.go similarity index 83% rename from internal/manifests/collector/labels_test.go rename to internal/manifests/manifestutils/labels_test.go index a2bb7629cc..4a0bd794de 100644 --- a/internal/manifests/collector/labels_test.go +++ b/internal/manifests/manifestutils/labels_test.go @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -package collector_test +package manifestutils import ( "testing" @@ -21,7 +21,6 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "github.com/open-telemetry/opentelemetry-operator/apis/v1alpha1" - . "github.com/open-telemetry/opentelemetry-operator/internal/manifests/collector" ) const ( @@ -42,7 +41,7 @@ func TestLabelsCommonSet(t *testing.T) { } // test - labels := Labels(otelcol, collectorName, []string{}) + labels := Labels(otelcol.ObjectMeta, collectorName, otelcol.Spec.Image, "opentelemetry-collector", []string{}) assert.Equal(t, "opentelemetry-operator", labels["app.kubernetes.io/managed-by"]) assert.Equal(t, "my-ns.my-instance", labels["app.kubernetes.io/instance"]) assert.Equal(t, "0.47.0", labels["app.kubernetes.io/version"]) @@ -62,7 +61,7 @@ func TestLabelsSha256Set(t *testing.T) { } // test - labels := Labels(otelcol, collectorName, []string{}) + labels := Labels(otelcol.ObjectMeta, collectorName, otelcol.Spec.Image, "opentelemetry-collector", []string{}) assert.Equal(t, "opentelemetry-operator", labels["app.kubernetes.io/managed-by"]) assert.Equal(t, "my-ns.my-instance", labels["app.kubernetes.io/instance"]) assert.Equal(t, "c6671841470b83007e0553cdadbc9d05f6cfe17b3ebe9733728dc4a579a5b53", labels["app.kubernetes.io/version"]) @@ -81,7 +80,7 @@ func TestLabelsSha256Set(t *testing.T) { } // test - labelsTag := Labels(otelcolTag, collectorName, []string{}) + labelsTag := Labels(otelcolTag.ObjectMeta, collectorName, otelcolTag.Spec.Image, "opentelemetry-collector", []string{}) assert.Equal(t, "opentelemetry-operator", labelsTag["app.kubernetes.io/managed-by"]) assert.Equal(t, "my-ns.my-instance", labelsTag["app.kubernetes.io/instance"]) assert.Equal(t, "0.81.0", labelsTag["app.kubernetes.io/version"]) @@ -101,7 +100,7 @@ func TestLabelsTagUnset(t *testing.T) { } // test - labels := Labels(otelcol, collectorName, []string{}) + labels := Labels(otelcol.ObjectMeta, collectorName, otelcol.Spec.Image, "opentelemetry-collector", []string{}) assert.Equal(t, "opentelemetry-operator", labels["app.kubernetes.io/managed-by"]) assert.Equal(t, "my-ns.my-instance", labels["app.kubernetes.io/instance"]) assert.Equal(t, "latest", labels["app.kubernetes.io/version"]) @@ -118,10 +117,13 @@ func TestLabelsPropagateDown(t *testing.T) { "app.kubernetes.io/name": "test", }, }, + Spec: v1alpha1.OpenTelemetryCollectorSpec{ + Image: "ghcr.io/open-telemetry/opentelemetry-operator/opentelemetry-operator", + }, } // test - labels := Labels(otelcol, collectorName, []string{}) + labels := Labels(otelcol.ObjectMeta, collectorName, otelcol.Spec.Image, "opentelemetry-collector", []string{}) // verify assert.Len(t, labels, 7) @@ -134,10 +136,13 @@ func TestLabelsFilter(t *testing.T) { ObjectMeta: metav1.ObjectMeta{ Labels: map[string]string{"test.bar.io": "foo", "test.foo.io": "bar"}, }, + Spec: v1alpha1.OpenTelemetryCollectorSpec{ + Image: "ghcr.io/open-telemetry/opentelemetry-operator/opentelemetry-operator", + }, } // This requires the filter to be in regex match form and not the other simpler wildcard one. - labels := Labels(otelcol, collectorName, []string{".*.bar.io"}) + labels := Labels(otelcol.ObjectMeta, collectorName, otelcol.Spec.Image, "opentelemetry-collector", []string{".*.bar.io"}) // verify assert.Len(t, labels, 7) @@ -158,7 +163,7 @@ func TestSelectorLabels(t *testing.T) { } // test - result := SelectorLabels(otelcol) + result := SelectorLabels(otelcol.ObjectMeta, "opentelemetry-collector") // verify assert.Equal(t, expected, result) diff --git a/internal/manifests/targetallocator/configmap.go b/internal/manifests/targetallocator/configmap.go index 8cf40802a9..5e46209d45 100644 --- a/internal/manifests/targetallocator/configmap.go +++ b/internal/manifests/targetallocator/configmap.go @@ -24,6 +24,7 @@ import ( "github.com/open-telemetry/opentelemetry-operator/apis/v1alpha1" "github.com/open-telemetry/opentelemetry-operator/internal/manifests" "github.com/open-telemetry/opentelemetry-operator/internal/manifests/collector" + "github.com/open-telemetry/opentelemetry-operator/internal/manifests/manifestutils" "github.com/open-telemetry/opentelemetry-operator/internal/manifests/targetallocator/adapters" "github.com/open-telemetry/opentelemetry-operator/internal/naming" ) @@ -51,7 +52,7 @@ func ConfigMap(params manifests.Params) (*corev1.ConfigMap, error) { taConfig := make(map[interface{}]interface{}) prometheusCRConfig := make(map[interface{}]interface{}) - taConfig["label_selector"] = collector.SelectorLabels(params.OtelCol) + taConfig["label_selector"] = manifestutils.SelectorLabels(params.OtelCol.ObjectMeta, collector.ComponentOpenTelemetryCollector) // We only take the "config" from the returned object, if it's present if prometheusConfig, ok := prometheusReceiverConfig["config"]; ok { taConfig["config"] = prometheusConfig diff --git a/internal/status/collector.go b/internal/status/collector.go index 20699bda3f..8e18b08b1a 100644 --- a/internal/status/collector.go +++ b/internal/status/collector.go @@ -25,6 +25,7 @@ import ( "github.com/open-telemetry/opentelemetry-operator/apis/v1alpha1" "github.com/open-telemetry/opentelemetry-operator/internal/manifests/collector" + "github.com/open-telemetry/opentelemetry-operator/internal/manifests/manifestutils" "github.com/open-telemetry/opentelemetry-operator/internal/naming" "github.com/open-telemetry/opentelemetry-operator/internal/version" ) @@ -44,7 +45,7 @@ func UpdateCollectorStatus(ctx context.Context, cli client.Client, changed *v1al name := naming.Collector(changed.Name) // Set the scale selector - labels := collector.Labels(*changed, name, []string{}) + labels := manifestutils.Labels(changed.ObjectMeta, name, changed.Spec.Image, collector.ComponentOpenTelemetryCollector, []string{}) selector, err := metav1.LabelSelectorAsSelector(&metav1.LabelSelector{MatchLabels: labels}) if err != nil { return fmt.Errorf("failed to get selector for labelSelector: %w", err)