Skip to content
2 changes: 2 additions & 0 deletions .testcoverage.yml
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,8 @@ override:
path: ^webhook/logpipeline/v1alpha1$
- threshold: 84
path: ^webhook/logpipeline/v1beta1$
- threshold: 88
path: ^webhook/utils$
- threshold: 80
path: ^internal/utils/logpipeline$
- threshold: 75
Expand Down
12 changes: 6 additions & 6 deletions webhook/logpipeline/v1alpha1/validator.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ type LogPipelineValidator struct {

var _ webhook.CustomValidator = &LogPipelineValidator{}

func (v *LogPipelineValidator) ValidateCreate(_ context.Context, obj runtime.Object) (admission.Warnings, error) {
func (v *LogPipelineValidator) ValidateCreate(ctx context.Context, obj runtime.Object) (admission.Warnings, error) {
logPipeline, ok := obj.(*telemetryv1alpha1.LogPipeline)

var warnings admission.Warnings
Expand All @@ -32,7 +32,7 @@ func (v *LogPipelineValidator) ValidateCreate(_ context.Context, obj runtime.Obj

filterSpec, transformSpec := webhookutils.ConvertFilterTransformToBeta(logPipeline.Spec.Filters, logPipeline.Spec.Transforms)

if err := validateFilterTransform(filterSpec, transformSpec); err != nil {
if err := validateFilterTransform(ctx, filterSpec, transformSpec); err != nil {
return nil, err
}

Expand All @@ -47,7 +47,7 @@ func (v *LogPipelineValidator) ValidateCreate(_ context.Context, obj runtime.Obj
return nil, nil
}

func (v *LogPipelineValidator) ValidateUpdate(_ context.Context, oldObj, newObj runtime.Object) (admission.Warnings, error) {
func (v *LogPipelineValidator) ValidateUpdate(ctx context.Context, oldObj, newObj runtime.Object) (admission.Warnings, error) {
logPipeline, ok := newObj.(*telemetryv1alpha1.LogPipeline)

var warnings admission.Warnings
Expand All @@ -58,7 +58,7 @@ func (v *LogPipelineValidator) ValidateUpdate(_ context.Context, oldObj, newObj

filterSpec, transformSpec := webhookutils.ConvertFilterTransformToBeta(logPipeline.Spec.Filters, logPipeline.Spec.Transforms)

if err := validateFilterTransform(filterSpec, transformSpec); err != nil {
if err := validateFilterTransform(ctx, filterSpec, transformSpec); err != nil {
return nil, err
}

Expand All @@ -77,8 +77,8 @@ func (v *LogPipelineValidator) ValidateDelete(_ context.Context, obj runtime.Obj
return nil, nil
}

func validateFilterTransform(filterSpec []telemetryv1beta1.FilterSpec, transformSpec []telemetryv1beta1.TransformSpec) error {
err := webhookutils.ValidateFilterTransform(ottl.SignalTypeLog, filterSpec, transformSpec)
func validateFilterTransform(ctx context.Context, filterSpec []telemetryv1beta1.FilterSpec, transformSpec []telemetryv1beta1.TransformSpec) error {
err := webhookutils.ValidateFilterTransform(ctx, ottl.SignalTypeLog, filterSpec, transformSpec)
if err != nil {
return fmt.Errorf(conditions.MessageForOtelLogPipeline(conditions.ReasonOTTLSpecInvalid), err.Error())
}
Expand Down
12 changes: 6 additions & 6 deletions webhook/logpipeline/v1beta1/validator.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ type LogPipelineValidator struct {

var _ webhook.CustomValidator = &LogPipelineValidator{}

func (v *LogPipelineValidator) ValidateCreate(_ context.Context, obj runtime.Object) (admission.Warnings, error) {
func (v *LogPipelineValidator) ValidateCreate(ctx context.Context, obj runtime.Object) (admission.Warnings, error) {
logPipeline, ok := obj.(*telemetryv1beta1.LogPipeline)

var warnings admission.Warnings
Expand All @@ -28,7 +28,7 @@ func (v *LogPipelineValidator) ValidateCreate(_ context.Context, obj runtime.Obj
return nil, fmt.Errorf("expected a LogPipeline but got %T", obj)
}

if err := validateFilterTransform(logPipeline.Spec.Filters, logPipeline.Spec.Transforms); err != nil {
if err := validateFilterTransform(ctx, logPipeline.Spec.Filters, logPipeline.Spec.Transforms); err != nil {
return nil, err
}

Expand All @@ -43,7 +43,7 @@ func (v *LogPipelineValidator) ValidateCreate(_ context.Context, obj runtime.Obj
return nil, nil
}

func (v *LogPipelineValidator) ValidateUpdate(_ context.Context, oldObj, newObj runtime.Object) (admission.Warnings, error) {
func (v *LogPipelineValidator) ValidateUpdate(ctx context.Context, oldObj, newObj runtime.Object) (admission.Warnings, error) {
logPipeline, ok := newObj.(*telemetryv1beta1.LogPipeline)

var warnings admission.Warnings
Expand All @@ -52,7 +52,7 @@ func (v *LogPipelineValidator) ValidateUpdate(_ context.Context, oldObj, newObj
return nil, fmt.Errorf("expected a LogPipeline but got %T", newObj)
}

if err := validateFilterTransform(logPipeline.Spec.Filters, logPipeline.Spec.Transforms); err != nil {
if err := validateFilterTransform(ctx, logPipeline.Spec.Filters, logPipeline.Spec.Transforms); err != nil {
return nil, err
}

Expand Down Expand Up @@ -82,8 +82,8 @@ func containsCustomPlugin(lp *telemetryv1beta1.LogPipeline) bool {
return lp.Spec.Output.Custom != ""
}

func validateFilterTransform(filterSpec []telemetryv1beta1.FilterSpec, transformSpec []telemetryv1beta1.TransformSpec) error {
err := webhookutils.ValidateFilterTransform(ottl.SignalTypeLog, filterSpec, transformSpec)
func validateFilterTransform(ctx context.Context, filterSpec []telemetryv1beta1.FilterSpec, transformSpec []telemetryv1beta1.TransformSpec) error {
err := webhookutils.ValidateFilterTransform(ctx, ottl.SignalTypeLog, filterSpec, transformSpec)
if err != nil {
return fmt.Errorf(conditions.MessageForOtelLogPipeline(conditions.ReasonOTTLSpecInvalid), err.Error())
}
Expand Down
12 changes: 6 additions & 6 deletions webhook/metricpipeline/v1alpha1/validator.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ type MetricPipelineValidator struct {

var _ webhook.CustomValidator = &MetricPipelineValidator{}

func (v *MetricPipelineValidator) ValidateCreate(_ context.Context, obj runtime.Object) (admission.Warnings, error) {
func (v *MetricPipelineValidator) ValidateCreate(ctx context.Context, obj runtime.Object) (admission.Warnings, error) {
metricPipeline, ok := obj.(*telemetryv1alpha1.MetricPipeline)

if !ok {
Expand All @@ -29,10 +29,10 @@ func (v *MetricPipelineValidator) ValidateCreate(_ context.Context, obj runtime.

filterSpec, transformSpec := webhookutils.ConvertFilterTransformToBeta(metricPipeline.Spec.Filters, metricPipeline.Spec.Transforms)

return nil, validateFilterTransform(filterSpec, transformSpec)
return nil, validateFilterTransform(ctx, filterSpec, transformSpec)
}

func (v *MetricPipelineValidator) ValidateUpdate(_ context.Context, oldObj, newObj runtime.Object) (admission.Warnings, error) {
func (v *MetricPipelineValidator) ValidateUpdate(ctx context.Context, oldObj, newObj runtime.Object) (admission.Warnings, error) {
metricPipeline, ok := newObj.(*telemetryv1alpha1.MetricPipeline)

if !ok {
Expand All @@ -41,15 +41,15 @@ func (v *MetricPipelineValidator) ValidateUpdate(_ context.Context, oldObj, newO

filterSpec, transformSpec := webhookutils.ConvertFilterTransformToBeta(metricPipeline.Spec.Filters, metricPipeline.Spec.Transforms)

return nil, validateFilterTransform(filterSpec, transformSpec)
return nil, validateFilterTransform(ctx, filterSpec, transformSpec)
}

func (v *MetricPipelineValidator) ValidateDelete(_ context.Context, obj runtime.Object) (admission.Warnings, error) {
return nil, nil
}

func validateFilterTransform(filterSpec []telemetryv1beta1.FilterSpec, transformSpec []telemetryv1beta1.TransformSpec) error {
err := webhookutils.ValidateFilterTransform(ottl.SignalTypeMetric, filterSpec, transformSpec)
func validateFilterTransform(ctx context.Context, filterSpec []telemetryv1beta1.FilterSpec, transformSpec []telemetryv1beta1.TransformSpec) error {
err := webhookutils.ValidateFilterTransform(ctx, ottl.SignalTypeMetric, filterSpec, transformSpec)
if err != nil {
return fmt.Errorf(conditions.MessageForMetricPipeline(conditions.ReasonOTTLSpecInvalid), err.Error())
}
Expand Down
12 changes: 6 additions & 6 deletions webhook/metricpipeline/v1beta1/validator.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,32 +19,32 @@ type MetricPipelineValidator struct {

var _ webhook.CustomValidator = &MetricPipelineValidator{}

func (v *MetricPipelineValidator) ValidateCreate(_ context.Context, obj runtime.Object) (admission.Warnings, error) {
func (v *MetricPipelineValidator) ValidateCreate(ctx context.Context, obj runtime.Object) (admission.Warnings, error) {
metricPipeline, ok := obj.(*telemetryv1beta1.MetricPipeline)

if !ok {
return nil, fmt.Errorf("expected a MetricPipeline but got %T", obj)
}

return nil, validateFilterTransform(metricPipeline.Spec.Filters, metricPipeline.Spec.Transforms)
return nil, validateFilterTransform(ctx, metricPipeline.Spec.Filters, metricPipeline.Spec.Transforms)
}

func (v *MetricPipelineValidator) ValidateUpdate(_ context.Context, oldObj, newObj runtime.Object) (admission.Warnings, error) {
func (v *MetricPipelineValidator) ValidateUpdate(ctx context.Context, oldObj, newObj runtime.Object) (admission.Warnings, error) {
metricPipeline, ok := newObj.(*telemetryv1beta1.MetricPipeline)

if !ok {
return nil, fmt.Errorf("expected a MetricPipeline but got %T", newObj)
}

return nil, validateFilterTransform(metricPipeline.Spec.Filters, metricPipeline.Spec.Transforms)
return nil, validateFilterTransform(ctx, metricPipeline.Spec.Filters, metricPipeline.Spec.Transforms)
}

func (v *MetricPipelineValidator) ValidateDelete(_ context.Context, obj runtime.Object) (admission.Warnings, error) {
return nil, nil
}

func validateFilterTransform(filterSpec []telemetryv1beta1.FilterSpec, transformSpec []telemetryv1beta1.TransformSpec) error {
err := webhookutils.ValidateFilterTransform(ottl.SignalTypeMetric, filterSpec, transformSpec)
func validateFilterTransform(ctx context.Context, filterSpec []telemetryv1beta1.FilterSpec, transformSpec []telemetryv1beta1.TransformSpec) error {
err := webhookutils.ValidateFilterTransform(ctx, ottl.SignalTypeMetric, filterSpec, transformSpec)
if err != nil {
return fmt.Errorf(conditions.MessageForMetricPipeline(conditions.ReasonOTTLSpecInvalid), err.Error())
}
Expand Down
12 changes: 6 additions & 6 deletions webhook/tracepipeline/v1alpha1/validator.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ type TracePipelineValidator struct {

var _ webhook.CustomValidator = &TracePipelineValidator{}

func (v *TracePipelineValidator) ValidateCreate(_ context.Context, obj runtime.Object) (admission.Warnings, error) {
func (v *TracePipelineValidator) ValidateCreate(ctx context.Context, obj runtime.Object) (admission.Warnings, error) {
tracePipeline, ok := obj.(*telemetryv1alpha1.TracePipeline)

if !ok {
Expand All @@ -29,10 +29,10 @@ func (v *TracePipelineValidator) ValidateCreate(_ context.Context, obj runtime.O

filterSpec, transformSpec := webhookutils.ConvertFilterTransformToBeta(tracePipeline.Spec.Filters, tracePipeline.Spec.Transforms)

return nil, validateFilterTransform(filterSpec, transformSpec)
return nil, validateFilterTransform(ctx, filterSpec, transformSpec)
}

func (v *TracePipelineValidator) ValidateUpdate(_ context.Context, oldObj, newObj runtime.Object) (admission.Warnings, error) {
func (v *TracePipelineValidator) ValidateUpdate(ctx context.Context, oldObj, newObj runtime.Object) (admission.Warnings, error) {
tracePipeline, ok := newObj.(*telemetryv1alpha1.TracePipeline)

if !ok {
Expand All @@ -41,15 +41,15 @@ func (v *TracePipelineValidator) ValidateUpdate(_ context.Context, oldObj, newOb

filterSpec, transformSpec := webhookutils.ConvertFilterTransformToBeta(tracePipeline.Spec.Filters, tracePipeline.Spec.Transforms)

return nil, validateFilterTransform(filterSpec, transformSpec)
return nil, validateFilterTransform(ctx, filterSpec, transformSpec)
}

func (v *TracePipelineValidator) ValidateDelete(_ context.Context, obj runtime.Object) (admission.Warnings, error) {
return nil, nil
}

func validateFilterTransform(filterSpec []telemetryv1beta1.FilterSpec, transformSpec []telemetryv1beta1.TransformSpec) error {
err := webhookutils.ValidateFilterTransform(ottl.SignalTypeTrace, filterSpec, transformSpec)
func validateFilterTransform(ctx context.Context, filterSpec []telemetryv1beta1.FilterSpec, transformSpec []telemetryv1beta1.TransformSpec) error {
err := webhookutils.ValidateFilterTransform(ctx, ottl.SignalTypeTrace, filterSpec, transformSpec)
if err != nil {
return fmt.Errorf(conditions.MessageForTracePipeline(conditions.ReasonOTTLSpecInvalid), err.Error())
}
Expand Down
12 changes: 6 additions & 6 deletions webhook/tracepipeline/v1beta1/validator.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,32 +19,32 @@ type TracePipelineValidator struct {

var _ webhook.CustomValidator = &TracePipelineValidator{}

func (v *TracePipelineValidator) ValidateCreate(_ context.Context, obj runtime.Object) (admission.Warnings, error) {
func (v *TracePipelineValidator) ValidateCreate(ctx context.Context, obj runtime.Object) (admission.Warnings, error) {
tracePipeline, ok := obj.(*telemetryv1beta1.TracePipeline)

if !ok {
return nil, fmt.Errorf("expected a TracePipeline but got %T", obj)
}

return nil, validateFilterTransform(tracePipeline.Spec.Filters, tracePipeline.Spec.Transforms)
return nil, validateFilterTransform(ctx, tracePipeline.Spec.Filters, tracePipeline.Spec.Transforms)
}

func (v *TracePipelineValidator) ValidateUpdate(_ context.Context, oldObj, newObj runtime.Object) (admission.Warnings, error) {
func (v *TracePipelineValidator) ValidateUpdate(ctx context.Context, oldObj, newObj runtime.Object) (admission.Warnings, error) {
tracePipeline, ok := newObj.(*telemetryv1beta1.TracePipeline)

if !ok {
return nil, fmt.Errorf("expected a TracePipeline but got %T", newObj)
}

return nil, validateFilterTransform(tracePipeline.Spec.Filters, tracePipeline.Spec.Transforms)
return nil, validateFilterTransform(ctx, tracePipeline.Spec.Filters, tracePipeline.Spec.Transforms)
}

func (v *TracePipelineValidator) ValidateDelete(_ context.Context, obj runtime.Object) (admission.Warnings, error) {
return nil, nil
}

func validateFilterTransform(filterSpec []telemetryv1beta1.FilterSpec, transformSpec []telemetryv1beta1.TransformSpec) error {
err := webhookutils.ValidateFilterTransform(ottl.SignalTypeTrace, filterSpec, transformSpec)
func validateFilterTransform(ctx context.Context, filterSpec []telemetryv1beta1.FilterSpec, transformSpec []telemetryv1beta1.TransformSpec) error {
err := webhookutils.ValidateFilterTransform(ctx, ottl.SignalTypeTrace, filterSpec, transformSpec)
if err != nil {
return fmt.Errorf(conditions.MessageForTracePipeline(conditions.ReasonOTTLSpecInvalid), err.Error())
}
Expand Down
15 changes: 11 additions & 4 deletions webhook/utils/transformfilter.go
Original file line number Diff line number Diff line change
@@ -1,18 +1,24 @@
package utils

import (
"fmt"
"context"
"errors"

logf "sigs.k8s.io/controller-runtime/pkg/log"

telemetryv1alpha1 "github.com/kyma-project/telemetry-manager/apis/telemetry/v1alpha1"
telemetryv1beta1 "github.com/kyma-project/telemetry-manager/apis/telemetry/v1beta1"
slicesutils "github.com/kyma-project/telemetry-manager/internal/utils/slices"
"github.com/kyma-project/telemetry-manager/internal/validators/ottl"
)

func ValidateFilterTransform(signalType ottl.SignalType, filterSpec []telemetryv1beta1.FilterSpec, transformSpec []telemetryv1beta1.TransformSpec) error {
var errFailedToCreatePipeline = errors.New("failed to create pipeline")

func ValidateFilterTransform(ctx context.Context, signalType ottl.SignalType, filterSpec []telemetryv1beta1.FilterSpec, transformSpec []telemetryv1beta1.TransformSpec) error {
filterValidator, err := ottl.NewFilterSpecValidator(signalType)
if err != nil {
return fmt.Errorf("failed to instantiate FilterSpecValidator %w", err)
logf.FromContext(ctx).V(1).Error(err, "Failed to instantiate FilterSpec validator")
return errFailedToCreatePipeline
}

for _, filter := range filterSpec {
Expand All @@ -24,7 +30,8 @@ func ValidateFilterTransform(signalType ottl.SignalType, filterSpec []telemetryv

transformValidator, err := ottl.NewTransformSpecValidator(signalType)
if err != nil {
return fmt.Errorf("failed to instantiate TransformSpecValidator %w", err)
logf.Log.V(1).Error(err, "Failed to instantiate TransformSpec validator")
return errFailedToCreatePipeline
}

for _, transform := range transformSpec {
Expand Down
7 changes: 6 additions & 1 deletion webhook/utils/transformfilter_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import (

func TestValidateFilterTransform(t *testing.T) {
err := ValidateFilterTransform(
t.Context(),
ottl.SignalTypeLog,
[]telemetryv1beta1.FilterSpec{},
[]telemetryv1beta1.TransformSpec{},
Expand All @@ -21,15 +22,17 @@ func TestValidateFilterTransform(t *testing.T) {

func TestInvalidSignalType(t *testing.T) {
err := ValidateFilterTransform(
t.Context(),
"invalid",
[]telemetryv1beta1.FilterSpec{},
[]telemetryv1beta1.TransformSpec{},
)
assert.ErrorContains(t, err, "failed to instantiate")
assert.ErrorContains(t, err, "failed to create pipeline")
}

func TestWithValidFilterTransform(t *testing.T) {
err := ValidateFilterTransform(
t.Context(),
ottl.SignalTypeLog,
[]telemetryv1beta1.FilterSpec{
{Conditions: []string{`log.severity_number < SEVERITY_NUMBER_WARN`}},
Expand All @@ -44,6 +47,7 @@ func TestWithValidFilterTransform(t *testing.T) {

func TestWithInvalidFilter(t *testing.T) {
err := ValidateFilterTransform(
t.Context(),
ottl.SignalTypeLog,
[]telemetryv1beta1.FilterSpec{
{Conditions: []string{`invalid condition`}},
Expand All @@ -58,6 +62,7 @@ func TestWithInvalidFilter(t *testing.T) {

func TestWithInvalidTransform(t *testing.T) {
err := ValidateFilterTransform(
t.Context(),
ottl.SignalTypeLog,
[]telemetryv1beta1.FilterSpec{
{Conditions: []string{`log.severity_number < SEVERITY_NUMBER_WARN`}},
Expand Down
Loading