Skip to content

Commit

Permalink
make label functions generic (open-telemetry#2254)
Browse files Browse the repository at this point in the history
  • Loading branch information
avadhut123pisal authored Oct 20, 2023
1 parent 6d02535 commit 4ec4fe5
Show file tree
Hide file tree
Showing 14 changed files with 57 additions and 38 deletions.
4 changes: 4 additions & 0 deletions internal/manifests/collector/collector.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
3 changes: 2 additions & 1 deletion internal/manifests/collector/configmap.go
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
5 changes: 3 additions & 2 deletions internal/manifests/collector/daemonset.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -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{
Expand Down
5 changes: 3 additions & 2 deletions internal/manifests/collector/deployment.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -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{
Expand Down
3 changes: 2 additions & 1 deletion internal/manifests/collector/horizontalpodautoscaler.go
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
3 changes: 2 additions & 1 deletion internal/manifests/collector/poddisruptionbudget.go
Original file line number Diff line number Diff line change
Expand Up @@ -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"
)

Expand All @@ -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{
Expand Down
9 changes: 5 additions & 4 deletions internal/manifests/collector/service.go
Original file line number Diff line number Diff line change
Expand Up @@ -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"
)

Expand Down Expand Up @@ -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
Expand All @@ -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",
Expand All @@ -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 {
Expand Down Expand Up @@ -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,
},
Expand Down
5 changes: 3 additions & 2 deletions internal/manifests/collector/service_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -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{
Expand All @@ -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,
},
Expand Down
3 changes: 2 additions & 1 deletion internal/manifests/collector/serviceaccount.go
Original file line number Diff line number Diff line change
Expand Up @@ -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"
)

Expand All @@ -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{
Expand Down
5 changes: 3 additions & 2 deletions internal/manifests/collector/statefulset.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -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{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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"
)

Expand All @@ -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{}
Expand All @@ -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")
Expand All @@ -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,
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand All @@ -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 (
Expand All @@ -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"])
Expand All @@ -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"])
Expand All @@ -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"])
Expand All @@ -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"])
Expand All @@ -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)
Expand All @@ -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)
Expand All @@ -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)
Expand Down
3 changes: 2 additions & 1 deletion internal/manifests/targetallocator/configmap.go
Original file line number Diff line number Diff line change
Expand Up @@ -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"
)
Expand Down Expand Up @@ -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
Expand Down
Loading

0 comments on commit 4ec4fe5

Please sign in to comment.