Skip to content

Commit 056ee62

Browse files
authored
refactor: expose sinks pkg for direct rule evaluation; add ValidationResult creation & finalization helpers (#366)
## Issue N/A ## Description Expose public helpers for building and finalizing validation results. Required for validator-labs/validatorctl#102 --------- Signed-off-by: Tyler Gillson <[email protected]>
1 parent 7c09687 commit 056ee62

14 files changed

+73
-29
lines changed

cmd/main.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,10 +35,10 @@ import (
3535

3636
validationv1alpha1 "github.com/validator-labs/validator/api/v1alpha1"
3737
"github.com/validator-labs/validator/internal/controller"
38-
"github.com/validator-labs/validator/internal/kube"
39-
"github.com/validator-labs/validator/internal/sinks"
4038
"github.com/validator-labs/validator/pkg/helm"
4139
"github.com/validator-labs/validator/pkg/helm/release"
40+
"github.com/validator-labs/validator/pkg/kube"
41+
"github.com/validator-labs/validator/pkg/sinks"
4242
//+kubebuilder:scaffold:imports
4343
)
4444

internal/controller/suite_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,10 +42,10 @@ import (
4242
"sigs.k8s.io/controller-runtime/pkg/log/zap"
4343

4444
"github.com/validator-labs/validator/api/v1alpha1"
45-
"github.com/validator-labs/validator/internal/kube"
46-
"github.com/validator-labs/validator/internal/sinks"
4745
"github.com/validator-labs/validator/pkg/helm"
4846
"github.com/validator-labs/validator/pkg/helm/release"
47+
"github.com/validator-labs/validator/pkg/kube"
48+
"github.com/validator-labs/validator/pkg/sinks"
4949
"github.com/validator-labs/validator/pkg/util"
5050
//+kubebuilder:scaffold:imports
5151
)

internal/controller/validationresult_controller.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,8 @@ import (
3333
"sigs.k8s.io/controller-runtime/pkg/client"
3434

3535
v1alpha1 "github.com/validator-labs/validator/api/v1alpha1"
36-
"github.com/validator-labs/validator/internal/sinks"
3736
"github.com/validator-labs/validator/pkg/constants"
37+
"github.com/validator-labs/validator/pkg/sinks"
3838
"github.com/validator-labs/validator/pkg/types"
3939
)
4040

internal/controller/validatorconfig_controller_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@ import (
2121
kyaml "sigs.k8s.io/yaml"
2222

2323
"github.com/validator-labs/validator/api/v1alpha1"
24-
"github.com/validator-labs/validator/internal/test"
2524
"github.com/validator-labs/validator/pkg/helm"
25+
"github.com/validator-labs/validator/pkg/test"
2626
//+kubebuilder:scaffold:imports
2727
)
2828

File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.

pkg/validationresult/validation_result.go

Lines changed: 62 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package validationresult
33

44
import (
55
"context"
6+
"fmt"
67
"strings"
78
"time"
89

@@ -25,8 +26,44 @@ type Patcher interface {
2526
Patch(ctx context.Context, obj client.Object, opts ...patch.Option) error
2627
}
2728

28-
// HandleExistingValidationResult processes a preexisting validation result for the active validator.
29-
func HandleExistingValidationResult(vr *v1alpha1.ValidationResult, l logr.Logger) {
29+
// ValidationRule is an interface for validation rules.
30+
type ValidationRule interface {
31+
client.Object
32+
PluginCode() string
33+
ResultCount() int
34+
}
35+
36+
// Build creates a new ValidationResult for a specific ValidationRule.
37+
func Build(r ValidationRule) *v1alpha1.ValidationResult {
38+
return &v1alpha1.ValidationResult{
39+
ObjectMeta: metav1.ObjectMeta{
40+
Name: Name(r),
41+
Namespace: r.GetNamespace(),
42+
OwnerReferences: []metav1.OwnerReference{
43+
{
44+
APIVersion: r.GetObjectKind().GroupVersionKind().Version,
45+
Kind: r.GetObjectKind().GroupVersionKind().Kind,
46+
Name: r.GetName(),
47+
UID: r.GetUID(),
48+
Controller: util.Ptr(true),
49+
},
50+
},
51+
},
52+
Spec: v1alpha1.ValidationResultSpec{
53+
Plugin: r.PluginCode(),
54+
ExpectedResults: r.ResultCount(),
55+
},
56+
}
57+
}
58+
59+
// Name returns the name of a ValidationResult for a specific ValidationRule.
60+
func Name(r ValidationRule) string {
61+
name := fmt.Sprintf("validator-plugin-%s-%s", r.PluginCode(), r.GetName())
62+
return util.Sanitize(name)
63+
}
64+
65+
// HandleExisting processes a preexisting validation result for the active validator.
66+
func HandleExisting(vr *v1alpha1.ValidationResult, l logr.Logger) {
3067
l = l.WithValues("name", vr.Name, "namespace", vr.Namespace, "state", vr.Status.State)
3168

3269
switch vr.Status.State {
@@ -49,8 +86,8 @@ func HandleExistingValidationResult(vr *v1alpha1.ValidationResult, l logr.Logger
4986
}
5087
}
5188

52-
// HandleNewValidationResult creates a new validation result for the active validator.
53-
func HandleNewValidationResult(ctx context.Context, c client.Client, p Patcher, vr *v1alpha1.ValidationResult, l logr.Logger) error {
89+
// HandleNew creates a new validation result for the active validator.
90+
func HandleNew(ctx context.Context, c client.Client, p Patcher, vr *v1alpha1.ValidationResult, l logr.Logger) error {
5491
l = l.WithValues("name", vr.Name, "namespace", vr.Namespace)
5592

5693
// Create the ValidationResult
@@ -75,11 +112,26 @@ func HandleNewValidationResult(ctx context.Context, c client.Client, p Patcher,
75112
return nil
76113
}
77114

78-
// SafeUpdateValidationResult updates a ValidationResult, ensuring
79-
// that the overall validation status remains failed if a single rule fails.
80-
func SafeUpdateValidationResult(ctx context.Context, p Patcher, vr *v1alpha1.ValidationResult, vrr types.ValidationResponse, l logr.Logger) error {
115+
// SafeUpdate processes and patches a ValidationResult with retry logic.
116+
func SafeUpdate(ctx context.Context, p Patcher, vr *v1alpha1.ValidationResult, vrr types.ValidationResponse, l logr.Logger) error {
81117
l = l.WithValues("name", vr.Name, "namespace", vr.Namespace)
82118

119+
if err := Finalize(vr, vrr, l); err != nil {
120+
l.Error(err, "failed to finalize ValidationResult")
121+
return err
122+
}
123+
if err := patchValidationResult(ctx, p, vr); err != nil {
124+
l.Error(err, "failed to patch ValidationResult")
125+
return err
126+
}
127+
128+
l.V(0).Info("Successfully patched ValidationResult", "state", vr.Status.State)
129+
return nil
130+
}
131+
132+
// Finalize finalizes a ValidationResult, ensuring
133+
// that the overall validation status remains failed if a single rule fails.
134+
func Finalize(vr *v1alpha1.ValidationResult, vrr types.ValidationResponse, l logr.Logger) error {
83135
for i, r := range vrr.ValidationRuleResults {
84136
// Handle nil ValidationRuleResult
85137
if r == nil {
@@ -90,21 +142,13 @@ func SafeUpdateValidationResult(ctx context.Context, p Patcher, vr *v1alpha1.Val
90142
}
91143
}
92144
// Update overall ValidationResult status
93-
updateValidationResultStatus(vr, r, vrr.ValidationRuleErrors[i], l)
94-
}
95-
96-
l.V(0).Info("Preparing to patch ValidationResult")
97-
if err := patchValidationResult(ctx, p, vr); err != nil {
98-
l.Error(err, "failed to patch ValidationResult")
99-
return err
145+
updateStatus(vr, r, vrr.ValidationRuleErrors[i], l)
100146
}
101-
102-
l.V(0).Info("Successfully patched ValidationResult", "state", vr.Status.State)
103147
return nil
104148
}
105149

106-
// updateValidationResultStatus updates a ValidationResult's status with the result of a single validation rule.
107-
func updateValidationResultStatus(vr *v1alpha1.ValidationResult, vrr *types.ValidationRuleResult, vrrErr error, l logr.Logger) {
150+
// updateStatus updates a ValidationResult's status with the result of a single validation rule.
151+
func updateStatus(vr *v1alpha1.ValidationResult, vrr *types.ValidationRuleResult, vrrErr error, l logr.Logger) {
108152

109153
// Finalize result State and Condition in the event of an unexpected error
110154
if vrrErr != nil {

pkg/validationresult/validation_result_test.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ import (
1010
corev1 "k8s.io/api/core/v1"
1111

1212
"github.com/validator-labs/validator/api/v1alpha1"
13-
"github.com/validator-labs/validator/internal/test"
1413
"github.com/validator-labs/validator/pkg/constants"
14+
"github.com/validator-labs/validator/pkg/test"
1515
"github.com/validator-labs/validator/pkg/types"
1616
"github.com/validator-labs/validator/pkg/util"
1717
)
@@ -69,7 +69,7 @@ func TestHandleExistingValidationResult(t *testing.T) {
6969
}
7070
for _, c := range cs {
7171
t.Log(c.name)
72-
HandleExistingValidationResult(c.vr, logr.Logger{})
72+
HandleExisting(c.vr, logr.Logger{})
7373
}
7474
}
7575

@@ -133,7 +133,7 @@ func TestHandleNewValidationResult(t *testing.T) {
133133
}
134134
for _, c := range cs {
135135
t.Log(c.name)
136-
err = HandleNewValidationResult(context.Background(), c.client, c.patcher, c.vr, logr.Logger{})
136+
err = HandleNew(context.Background(), c.client, c.patcher, c.vr, logr.Logger{})
137137
if err != nil && !reflect.DeepEqual(c.expected.Error(), err.Error()) {
138138
t.Errorf("expected (%v), got (%v)", c.expected, err)
139139
}
@@ -221,7 +221,7 @@ func TestSafeUpdateValidationResult(t *testing.T) {
221221
}
222222
for _, c := range cs {
223223
t.Log(c.name)
224-
SafeUpdateValidationResult(context.Background(), c.patcher, c.vr, c.vrr, logr.Logger{})
224+
SafeUpdate(context.Background(), c.patcher, c.vr, c.vrr, logr.Logger{})
225225
}
226226
}
227227

@@ -299,7 +299,7 @@ func TestUpdateValidationResultStatus(t *testing.T) {
299299
}
300300
for _, c := range cs {
301301
t.Log(c.name)
302-
updateValidationResultStatus(c.vrCurr, c.vrr, c.vrrErr, logr.Logger{})
302+
updateStatus(c.vrCurr, c.vrr, c.vrrErr, logr.Logger{})
303303
if !reflect.DeepEqual(c.vrCurr.Hash(), c.vrExpected.Hash()) {
304304
t.Errorf("expected (%+v), got (%+v)", c.vrExpected, c.vrCurr)
305305
}

0 commit comments

Comments
 (0)