diff --git a/.testcoverage.yml b/.testcoverage.yml index c9109de6c4..de96241f36 100644 --- a/.testcoverage.yml +++ b/.testcoverage.yml @@ -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 diff --git a/webhook/logpipeline/v1alpha1/validator.go b/webhook/logpipeline/v1alpha1/validator.go index a7402d5ab6..da7361b5cc 100644 --- a/webhook/logpipeline/v1alpha1/validator.go +++ b/webhook/logpipeline/v1alpha1/validator.go @@ -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 @@ -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 } @@ -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 @@ -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 } @@ -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()) } diff --git a/webhook/logpipeline/v1beta1/validator.go b/webhook/logpipeline/v1beta1/validator.go index 6565d34c54..b8aceb9eb8 100644 --- a/webhook/logpipeline/v1beta1/validator.go +++ b/webhook/logpipeline/v1beta1/validator.go @@ -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 @@ -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 } @@ -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 @@ -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 } @@ -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()) } diff --git a/webhook/metricpipeline/v1alpha1/validator.go b/webhook/metricpipeline/v1alpha1/validator.go index 06ec1cb399..5a4e5f059f 100644 --- a/webhook/metricpipeline/v1alpha1/validator.go +++ b/webhook/metricpipeline/v1alpha1/validator.go @@ -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 { @@ -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 { @@ -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()) } diff --git a/webhook/metricpipeline/v1beta1/validator.go b/webhook/metricpipeline/v1beta1/validator.go index bbc59c94ff..09b18064c2 100644 --- a/webhook/metricpipeline/v1beta1/validator.go +++ b/webhook/metricpipeline/v1beta1/validator.go @@ -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()) } diff --git a/webhook/tracepipeline/v1alpha1/validator.go b/webhook/tracepipeline/v1alpha1/validator.go index e1fcd81bc5..3d50e02167 100644 --- a/webhook/tracepipeline/v1alpha1/validator.go +++ b/webhook/tracepipeline/v1alpha1/validator.go @@ -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 { @@ -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 { @@ -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()) } diff --git a/webhook/tracepipeline/v1beta1/validator.go b/webhook/tracepipeline/v1beta1/validator.go index 9f43c47b29..e0b985ce86 100644 --- a/webhook/tracepipeline/v1beta1/validator.go +++ b/webhook/tracepipeline/v1beta1/validator.go @@ -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()) } diff --git a/webhook/utils/transformfilter.go b/webhook/utils/transformfilter.go index 63f03df217..7575f82cf2 100644 --- a/webhook/utils/transformfilter.go +++ b/webhook/utils/transformfilter.go @@ -1,7 +1,10 @@ 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" @@ -9,10 +12,13 @@ import ( "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 { @@ -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 { diff --git a/webhook/utils/transformfilter_test.go b/webhook/utils/transformfilter_test.go index 2dfa8df604..5e9d7f821d 100644 --- a/webhook/utils/transformfilter_test.go +++ b/webhook/utils/transformfilter_test.go @@ -12,6 +12,7 @@ import ( func TestValidateFilterTransform(t *testing.T) { err := ValidateFilterTransform( + t.Context(), ottl.SignalTypeLog, []telemetryv1beta1.FilterSpec{}, []telemetryv1beta1.TransformSpec{}, @@ -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`}}, @@ -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`}}, @@ -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`}},