Documentation
¶
Overview ¶
Package validation implements tools to validate data objects.
These might be used from the CLI and/or the controller.
This package shoul not, under any circumtance, include specific validation logic. Only the tools to operate that logic should live here.
Index ¶
Examples ¶
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
func IsRemediable ¶
IsRemediable checks if an error has a remediation.
func NewRemediableErr ¶
NewRemediableErr returns a new Remediable error.
func Remediation ¶
Remediation returns the Remediation message for an error if it has it. Otherwise it returns an empty string.
func WithRemediation ¶
WithRemediation makes an error Remediable.
Types ¶
type Remediable ¶
type Remediable interface {
Remediation() string
}
Remediable is an error that provides a possible remediation.
type Runner ¶
type Runner[O Validatable[O]] struct { // contains filtered or unexported fields }
Runner allows to compose and run validations.
func NewRunner ¶
func NewRunner[O Validatable[O]](opts ...RunnerOpt) *Runner[O]
NewRunner constructs a new Runner.
func (*Runner[O]) Register ¶
func (r *Runner[O]) Register(validations ...Validation[O])
Register adds validations to the Runner.
func (*Runner[O]) RunAll ¶
RunAll runs all validations concurrently and waits until they all finish, aggregating the errors if present. obj must not be modified. If it is, this indicates a programming error and the method will panic.
Example (Validations) ¶
package main
import (
"context"
"errors"
"fmt"
"github.com/go-logr/logr"
"github.com/aws/eks-anywhere/internal/test"
anywherev1 "github.com/aws/eks-anywhere/pkg/api/v1alpha1"
"github.com/aws/eks-anywhere/pkg/cli"
"github.com/aws/eks-anywhere/pkg/cluster"
eksaerrors "github.com/aws/eks-anywhere/pkg/errors"
"github.com/aws/eks-anywhere/pkg/validation"
)
func main() {
log := test.NewNullLogger()
r := validation.NewRunner[*cluster.Spec](validation.WithMaxJobs(10))
cpValidator := newControlPlaneValidator(log)
r.Register(
func(ctx context.Context, spec *cluster.Spec) error {
if spec.Cluster.Spec.KubernetesVersion == "" {
return errors.New("kubernetesVersion can't be empty")
}
return nil
},
validation.Sequentially(
func(ctx context.Context, spec *cluster.Spec) error {
if spec.Cluster.Name == "" {
return validation.WithRemediation(
errors.New("cluster name is empty"),
"set a name for your cluster",
)
}
return nil
},
cpValidator.validateCount,
),
)
ctx := context.Background()
spec := test.NewClusterSpec(func(s *cluster.Spec) {
s.Cluster.Name = ""
s.Cluster.Spec.KubernetesVersion = anywherev1.Kube124
s.Cluster.Spec.ControlPlaneConfiguration.Count = 0
})
agg := r.RunAll(ctx, spec)
if agg != nil {
printErrors(agg)
return
}
fmt.Println("Cluster config is valid")
}
func printErrors(agg eksaerrors.Aggregate) {
fmt.Println("Invalid cluster config")
for _, err := range agg.Errors() {
msg := "- " + err.Error()
if validation.IsRemediable(err) {
msg += ". Try to " + validation.Remediation(err)
}
fmt.Println(msg)
}
}
type controlPlaneValidator struct {
log logr.Logger
}
func newControlPlaneValidator(log logr.Logger) *controlPlaneValidator {
return &controlPlaneValidator{log: log}
}
func (v *controlPlaneValidator) validateCount(ctx context.Context, spec *cluster.Spec) error {
if spec.Cluster.Spec.ControlPlaneConfiguration.Count == 0 {
cli.ValidationFailed(v.log, "Control plane invalid")
return errors.New("control plane node count can't be 0")
}
cli.ValidationPassed(v.log, "Control plane valid")
return nil
}
Output: Invalid cluster config - cluster name is empty. Try to set a name for your cluster - control plane node count can't be 0
type RunnerConfig ¶
type RunnerConfig struct {
// contains filtered or unexported fields
}
RunnerConfig contains the configuration for a Runner.
type RunnerOpt ¶
type RunnerOpt func(*RunnerConfig)
RunnerOpt allows to configure a Runner with optional parameters.
func WithMaxJobs ¶
WithMaxJobs sets the maximun number of concurrent routines the runner will use.
type Validatable ¶
type Validatable[O any] interface { DeepCopy() O }
Validatable is anything that can be validated.
type Validation ¶
type Validation[O Validatable[O]] func(ctx context.Context, obj O) error
Validation is the logic for a validation of a type O.
func Sequentially ¶
func Sequentially[O Validatable[O]](validations ...Validation[O]) Validation[O]
Sequentially composes a set of validations into one which will run them sequentially and in order.