From 76948c727e8cbed4732db4eb8ba9fecdb7a87245 Mon Sep 17 00:00:00 2001 From: Gerrit Date: Fri, 23 Jan 2026 11:26:48 +0100 Subject: [PATCH 01/11] Dependency updates. --- .github/workflows/docker.yaml | 15 +- Dockerfile | 2 +- Dockerfile.dev | 2 +- api/v2/defaults/defaults.go | 32 +-- api/v2/validation/common.go | 101 ------- api/v2/validation/firewall.go | 59 ++-- api/v2/validation/firewalldeployment.go | 53 ++-- api/v2/validation/firewallset.go | 53 ++-- controllers/deployment/controller.go | 3 +- controllers/firewall/controller.go | 3 +- controllers/set/controller.go | 3 +- go.mod | 149 ++++++----- go.sum | 340 +++++++++++++----------- 13 files changed, 397 insertions(+), 418 deletions(-) diff --git a/.github/workflows/docker.yaml b/.github/workflows/docker.yaml index a577352..07c5a0e 100644 --- a/.github/workflows/docker.yaml +++ b/.github/workflows/docker.yaml @@ -29,16 +29,16 @@ jobs: password: ${{ secrets.GITHUB_TOKEN }} - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v6 - - name: Set up Go 1.24 + - name: Setup Go uses: actions/setup-go@v5 with: - go-version: '1.24' + go-version-file: 'go.mod' cache: false - name: Lint - uses: golangci/golangci-lint-action@v7 + uses: golangci/golangci-lint-action@v9 with: args: --build-tags integration --timeout=10m @@ -65,12 +65,13 @@ jobs: steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 - - name: Set up Go 1.24 + - name: Setup Go uses: actions/setup-go@v5 with: - go-version: '1.24' + go-version-file: 'go.mod' + cache: false - name: Test run: | diff --git a/Dockerfile b/Dockerfile index 5e3ae29..6c338b9 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,5 @@ # Build the firewall-controller-manager binary -FROM golang:1.24 AS builder +FROM golang:1.25 AS builder WORKDIR /work COPY . . diff --git a/Dockerfile.dev b/Dockerfile.dev index a92b1ce..21d8294 100644 --- a/Dockerfile.dev +++ b/Dockerfile.dev @@ -1,4 +1,4 @@ -FROM alpine:3.21 +FROM alpine:3.23 COPY bin/firewall-controller-manager /firewall-controller-manager USER 65534 ENTRYPOINT ["/firewall-controller-manager"] diff --git a/api/v2/defaults/defaults.go b/api/v2/defaults/defaults.go index 7c6320a..1a2ef03 100644 --- a/api/v2/defaults/defaults.go +++ b/api/v2/defaults/defaults.go @@ -10,7 +10,6 @@ import ( "github.com/metal-stack/firewall-controller-manager/api/v2/helper" corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/runtime" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/webhook/admission" ) @@ -26,21 +25,21 @@ type ( } firewallSetDefaulter struct { c *config.ControllerConfig - fd *firewallDefaulter + fd admission.Defaulter[*v2.Firewall] log logr.Logger } firewallDeploymentDefaulter struct { c *config.ControllerConfig - fd *firewallDefaulter + fd admission.Defaulter[*v2.Firewall] log logr.Logger } ) -func NewFirewallDefaulter(log logr.Logger, c *config.ControllerConfig) (*firewallDefaulter, error) { +func NewFirewallDefaulter(log logr.Logger, c *config.ControllerConfig) (admission.Defaulter[*v2.Firewall], error) { return &firewallDefaulter{log: log, c: c}, nil } -func NewFirewallSetDefaulter(log logr.Logger, c *config.ControllerConfig) (admission.CustomDefaulter, error) { +func NewFirewallSetDefaulter(log logr.Logger, c *config.ControllerConfig) (admission.Defaulter[*v2.FirewallSet], error) { fd, err := NewFirewallDefaulter(log, c) if err != nil { return nil, err @@ -49,7 +48,7 @@ func NewFirewallSetDefaulter(log logr.Logger, c *config.ControllerConfig) (admis return &firewallSetDefaulter{log: log, c: c, fd: fd}, nil } -func NewFirewallDeploymentDefaulter(log logr.Logger, c *config.ControllerConfig) (admission.CustomDefaulter, error) { +func NewFirewallDeploymentDefaulter(log logr.Logger, c *config.ControllerConfig) (admission.Defaulter[*v2.FirewallDeployment], error) { fd, err := NewFirewallDefaulter(log, c) if err != nil { return nil, err @@ -58,12 +57,7 @@ func NewFirewallDeploymentDefaulter(log logr.Logger, c *config.ControllerConfig) return &firewallDeploymentDefaulter{log: log, c: c, fd: fd}, nil } -func (r *firewallDefaulter) Default(ctx context.Context, obj runtime.Object) error { - f, ok := obj.(*v2.Firewall) - if !ok { - return fmt.Errorf("mutator received unexpected type: %T", obj) - } - +func (r *firewallDefaulter) Default(ctx context.Context, f *v2.Firewall) error { r.log.Info("defaulting firewall resource", "name", f.GetName(), "namespace", f.GetNamespace()) defaultFirewallSpec(&f.Spec) @@ -71,12 +65,7 @@ func (r *firewallDefaulter) Default(ctx context.Context, obj runtime.Object) err return nil } -func (r *firewallSetDefaulter) Default(ctx context.Context, obj runtime.Object) error { - f, ok := obj.(*v2.FirewallSet) - if !ok { - return fmt.Errorf("mutator received unexpected type: %T", obj) - } - +func (r *firewallSetDefaulter) Default(ctx context.Context, f *v2.FirewallSet) error { r.log.Info("defaulting firewallset resource", "name", f.GetName(), "namespace", f.GetNamespace()) if f.Spec.Selector == nil { @@ -88,12 +77,7 @@ func (r *firewallSetDefaulter) Default(ctx context.Context, obj runtime.Object) return nil } -func (r *firewallDeploymentDefaulter) Default(ctx context.Context, obj runtime.Object) error { - f, ok := obj.(*v2.FirewallDeployment) - if !ok { - return fmt.Errorf("mutator received unexpected type: %T", obj) - } - +func (r *firewallDeploymentDefaulter) Default(ctx context.Context, f *v2.FirewallDeployment) error { r.log.Info("defaulting firewalldeployment resource", "name", f.GetName(), "namespace", f.GetNamespace()) if f.Spec.Strategy == "" { diff --git a/api/v2/validation/common.go b/api/v2/validation/common.go index 1ab5f0f..c26791d 100644 --- a/api/v2/validation/common.go +++ b/api/v2/validation/common.go @@ -1,110 +1,11 @@ package validation import ( - "context" - "fmt" "reflect" - "github.com/go-logr/logr" - apierrors "k8s.io/apimachinery/pkg/api/errors" - "k8s.io/apimachinery/pkg/api/meta" - apivalidation "k8s.io/apimachinery/pkg/api/validation" - "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/util/validation/field" - "sigs.k8s.io/controller-runtime/pkg/client" - "sigs.k8s.io/controller-runtime/pkg/webhook/admission" ) -type genericValidation[O client.Object] interface { - ValidateCreate(log logr.Logger, obj O) field.ErrorList - ValidateUpdate(log logr.Logger, old, new O) field.ErrorList -} - -type genericValidator[O client.Object, V genericValidation[O]] struct { - log logr.Logger -} - -func (g *genericValidator[O, V]) Instance() V { - var v V - return v -} - -func (g *genericValidator[O, V]) ValidateCreate(ctx context.Context, obj runtime.Object) (admission.Warnings, error) { - var ( - v = g.Instance() - o, ok = obj.(O) - allErrs field.ErrorList - ) - - if !ok { - return nil, apierrors.NewBadRequest(fmt.Sprintf("validator received unexpected type: %T", obj)) - } - - accessor, err := meta.Accessor(obj) - if err != nil { - return nil, apierrors.NewBadRequest(fmt.Sprintf("failed to get accessor for object: %s", err)) - } - - g.log.Info("validating resource creation", "name", accessor.GetName(), "namespace", accessor.GetNamespace()) - - allErrs = append(allErrs, apivalidation.ValidateObjectMetaAccessor(accessor, true, apivalidation.NameIsDNSSubdomain, field.NewPath("metadata"))...) - allErrs = append(allErrs, v.ValidateCreate(g.log, o)...) - - if len(allErrs) == 0 { - return nil, nil - } - - return nil, apierrors.NewInvalid( - obj.GetObjectKind().GroupVersionKind().GroupKind(), - accessor.GetName(), - allErrs, - ) -} - -func (g *genericValidator[O, V]) ValidateUpdate(ctx context.Context, oldObj, newObj runtime.Object) (admission.Warnings, error) { - var ( - v = g.Instance() - oldO, oldOk = oldObj.(O) - newO, newOk = newObj.(O) - allErrs field.ErrorList - ) - - if !oldOk { - return nil, apierrors.NewBadRequest(fmt.Sprintf("validator received unexpected type: %T", oldO)) - } - if !newOk { - return nil, apierrors.NewBadRequest(fmt.Sprintf("validator received unexpected type: %T", newO)) - } - - oldAccessor, err := meta.Accessor(oldO) - if err != nil { - return nil, apierrors.NewBadRequest(fmt.Sprintf("failed to get accessor for object: %s", err)) - } - newAccessor, err := meta.Accessor(newO) - if err != nil { - return nil, apierrors.NewBadRequest(fmt.Sprintf("failed to get accessor for object: %s", err)) - } - - g.log.Info("validating resource update", "name", newAccessor.GetName(), "namespace", newAccessor.GetNamespace()) - - allErrs = append(allErrs, apivalidation.ValidateObjectMetaAccessorUpdate(newAccessor, oldAccessor, field.NewPath("metadata"))...) - allErrs = append(allErrs, v.ValidateUpdate(g.log, oldO, newO)...) - - if len(allErrs) == 0 { - return nil, nil - } - - return nil, apierrors.NewInvalid( - newO.GetObjectKind().GroupVersionKind().GroupKind(), - newAccessor.GetName(), - allErrs, - ) -} - -func (_ *genericValidator[O, V]) ValidateDelete(ctx context.Context, obj runtime.Object) (admission.Warnings, error) { - return nil, nil -} - type ( requiredFields []*requiredField requiredField struct { @@ -117,8 +18,6 @@ func (rs requiredFields) check() field.ErrorList { var allErrs field.ErrorList for _, r := range rs { - r := r - if reflect.ValueOf(r.value).IsZero() { allErrs = append(allErrs, field.Required(r.path, "field is required")) } diff --git a/api/v2/validation/firewall.go b/api/v2/validation/firewall.go index 4ac05fc..1a7302f 100644 --- a/api/v2/validation/firewall.go +++ b/api/v2/validation/firewall.go @@ -1,6 +1,7 @@ package validation import ( + "context" "fmt" "net/netip" "net/url" @@ -9,27 +10,57 @@ import ( "github.com/go-logr/logr" v2 "github.com/metal-stack/firewall-controller-manager/api/v2" + apierrors "k8s.io/apimachinery/pkg/api/errors" apivalidation "k8s.io/apimachinery/pkg/api/validation" "k8s.io/apimachinery/pkg/util/validation/field" + "sigs.k8s.io/controller-runtime/pkg/webhook/admission" ) -type firewallValidator struct{} +type firewallValidator struct { + log logr.Logger +} -func NewFirewallValidator(log logr.Logger) *genericValidator[*v2.Firewall, *firewallValidator] { - return &genericValidator[*v2.Firewall, *firewallValidator]{log: log} +func NewFirewallValidator(log logr.Logger) admission.Validator[*v2.Firewall] { + return &firewallValidator{ + log: log, + } } -func (v *firewallValidator) ValidateCreate(log logr.Logger, f *v2.Firewall) field.ErrorList { +func (v *firewallValidator) ValidateCreate(ctx context.Context, f *v2.Firewall) (admission.Warnings, error) { var allErrs field.ErrorList + allErrs = append(allErrs, apivalidation.ValidateObjectMetaAccessor(&f.ObjectMeta, true, apivalidation.NameIsDNSSubdomain, field.NewPath("metadata"))...) allErrs = append(allErrs, validateFirewallAnnotations(f)...) - allErrs = append(allErrs, v.validateSpec(&f.Spec, field.NewPath("spec"))...) + allErrs = append(allErrs, validateFirewallSpec(&f.Spec, field.NewPath("spec"))...) allErrs = append(allErrs, validateDistance(f.Distance, field.NewPath("distance"))...) - return allErrs + return nil, apierrors.NewInvalid( + f.GetObjectKind().GroupVersionKind().GroupKind(), + f.GetName(), + allErrs, + ) +} + +func (v *firewallValidator) ValidateUpdate(ctx context.Context, fOld, fNew *v2.Firewall) (admission.Warnings, error) { + var allErrs field.ErrorList + + allErrs = append(allErrs, apivalidation.ValidateObjectMetaAccessorUpdate(&fNew.ObjectMeta, &fOld.ObjectMeta, field.NewPath("metadata"))...) + allErrs = append(allErrs, validateFirewallAnnotations(fNew)...) + allErrs = append(allErrs, validateFirewallSpecUpdate(&fOld.Spec, &fNew.Spec, field.NewPath("spec"))...) + allErrs = append(allErrs, validateDistance(fNew.Distance, field.NewPath("distance"))...) + + return nil, apierrors.NewInvalid( + fNew.GetObjectKind().GroupVersionKind().GroupKind(), + fNew.GetName(), + allErrs, + ) } -func (*firewallValidator) validateSpec(f *v2.FirewallSpec, fldPath *field.Path) field.ErrorList { +func (v *firewallValidator) ValidateDelete(ctx context.Context, f *v2.Firewall) (admission.Warnings, error) { + return nil, nil +} + +func validateFirewallSpec(f *v2.FirewallSpec, fldPath *field.Path) field.ErrorList { var allErrs field.ErrorList r := requiredFields{ @@ -112,20 +143,10 @@ func (*firewallValidator) validateSpec(f *v2.FirewallSpec, fldPath *field.Path) return allErrs } -func (v *firewallValidator) ValidateUpdate(log logr.Logger, fOld, fNew *v2.Firewall) field.ErrorList { - var allErrs field.ErrorList - - allErrs = append(allErrs, validateFirewallAnnotations(fNew)...) - allErrs = append(allErrs, v.validateSpecUpdate(&fOld.Spec, &fNew.Spec, field.NewPath("spec"))...) - allErrs = append(allErrs, validateDistance(fNew.Distance, field.NewPath("distance"))...) - - return allErrs -} - -func (v *firewallValidator) validateSpecUpdate(fOld, fNew *v2.FirewallSpec, fldPath *field.Path) field.ErrorList { +func validateFirewallSpecUpdate(fOld, fNew *v2.FirewallSpec, fldPath *field.Path) field.ErrorList { var allErrs field.ErrorList - allErrs = append(allErrs, v.validateSpec(fNew, fldPath)...) + allErrs = append(allErrs, validateFirewallSpec(fNew, fldPath)...) allErrs = append(allErrs, apivalidation.ValidateImmutableField(fNew.Project, fOld.Project, fldPath.Child("project"))...) allErrs = append(allErrs, apivalidation.ValidateImmutableField(fNew.Partition, fOld.Partition, fldPath.Child("partition"))...) allErrs = append(allErrs, apivalidation.ValidateImmutableField(fNew.DNSPort, fOld.DNSPort, fldPath.Child("dnsPort"))...) diff --git a/api/v2/validation/firewalldeployment.go b/api/v2/validation/firewalldeployment.go index ab19882..c24f027 100644 --- a/api/v2/validation/firewalldeployment.go +++ b/api/v2/validation/firewalldeployment.go @@ -1,28 +1,57 @@ package validation import ( + "context" "fmt" "github.com/go-logr/logr" v2 "github.com/metal-stack/firewall-controller-manager/api/v2" + apierrors "k8s.io/apimachinery/pkg/api/errors" apivalidation "k8s.io/apimachinery/pkg/api/validation" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/util/validation/field" + "sigs.k8s.io/controller-runtime/pkg/webhook/admission" ) -type firewallDeploymentValidator struct{} +type firewallDeploymentValidator struct { + log logr.Logger +} -func NewFirewallDeploymentValidator(log logr.Logger) *genericValidator[*v2.FirewallDeployment, *firewallDeploymentValidator] { - return &genericValidator[*v2.FirewallDeployment, *firewallDeploymentValidator]{log: log} +func NewFirewallDeploymentValidator(log logr.Logger) admission.Validator[*v2.FirewallDeployment] { + return &firewallDeploymentValidator{ + log: log, + } } -func (v *firewallDeploymentValidator) ValidateCreate(log logr.Logger, f *v2.FirewallDeployment) field.ErrorList { +func (v *firewallDeploymentValidator) ValidateCreate(ctx context.Context, f *v2.FirewallDeployment) (admission.Warnings, error) { var allErrs field.ErrorList - allErrs = append(allErrs, v.validateSpec(log, &f.Spec, field.NewPath("spec"))...) + allErrs = append(allErrs, apivalidation.ValidateObjectMetaAccessor(&f.ObjectMeta, true, apivalidation.NameIsDNSSubdomain, field.NewPath("metadata"))...) + allErrs = append(allErrs, v.validateSpec(v.log, &f.Spec, field.NewPath("spec"))...) - return allErrs + return nil, apierrors.NewInvalid( + f.GetObjectKind().GroupVersionKind().GroupKind(), + f.GetName(), + allErrs, + ) +} + +func (v *firewallDeploymentValidator) ValidateUpdate(ctx context.Context, oldF, newF *v2.FirewallDeployment) (admission.Warnings, error) { + var allErrs field.ErrorList + + allErrs = append(allErrs, apivalidation.ValidateObjectMetaAccessorUpdate(&newF.ObjectMeta, &oldF.ObjectMeta, field.NewPath("metadata"))...) + allErrs = append(allErrs, v.validateSpecUpdate(v.log, &oldF.Spec, &newF.Spec, &newF.Status, field.NewPath("spec"))...) + + return nil, apierrors.NewInvalid( + newF.GetObjectKind().GroupVersionKind().GroupKind(), + newF.GetName(), + allErrs, + ) +} + +func (v *firewallDeploymentValidator) ValidateDelete(ctx context.Context, f *v2.FirewallDeployment) (warnings admission.Warnings, err error) { + return nil, nil } func (*firewallDeploymentValidator) validateSpec(log logr.Logger, f *v2.FirewallDeploymentSpec, fldPath *field.Path) field.ErrorList { @@ -59,15 +88,7 @@ func (*firewallDeploymentValidator) validateSpec(log logr.Logger, f *v2.Firewall } } - allErrs = append(allErrs, NewFirewallValidator(log).Instance().validateSpec(&f.Template.Spec, fldPath.Child("template").Child("spec"))...) - - return allErrs -} - -func (v *firewallDeploymentValidator) ValidateUpdate(log logr.Logger, oldF, newF *v2.FirewallDeployment) field.ErrorList { - var allErrs field.ErrorList - - allErrs = append(allErrs, v.validateSpecUpdate(log, &oldF.Spec, &newF.Spec, &newF.Status, field.NewPath("spec"))...) + allErrs = append(allErrs, validateFirewallSpec(&f.Template.Spec, fldPath.Child("template").Child("spec"))...) return allErrs } @@ -77,7 +98,7 @@ func (v *firewallDeploymentValidator) validateSpecUpdate(log logr.Logger, oldF, allErrs = append(allErrs, v.validateSpec(log, newF, fldPath)...) - allErrs = append(allErrs, NewFirewallValidator(log).Instance().validateSpecUpdate(&oldF.Template.Spec, &newF.Template.Spec, fldPath.Child("template").Child("spec"))...) + allErrs = append(allErrs, validateFirewallSpecUpdate(&oldF.Template.Spec, &newF.Template.Spec, fldPath.Child("template").Child("spec"))...) // TODO: theoretically, the selector or metadata should be changeable, but we need to think it through... let's simplify for now and just not support it. allErrs = append(allErrs, apivalidation.ValidateImmutableField(newF.Selector, oldF.Selector, fldPath.Child("selector"))...) diff --git a/api/v2/validation/firewallset.go b/api/v2/validation/firewallset.go index 821f10b..a5828ef 100644 --- a/api/v2/validation/firewallset.go +++ b/api/v2/validation/firewallset.go @@ -1,28 +1,57 @@ package validation import ( + "context" "fmt" "github.com/go-logr/logr" v2 "github.com/metal-stack/firewall-controller-manager/api/v2" + apierrors "k8s.io/apimachinery/pkg/api/errors" apivalidation "k8s.io/apimachinery/pkg/api/validation" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/util/validation/field" + "sigs.k8s.io/controller-runtime/pkg/webhook/admission" ) -type firewallSetValidator struct{} +type firewallSetValidator struct { + log logr.Logger +} -func NewFirewallSetValidator(log logr.Logger) *genericValidator[*v2.FirewallSet, *firewallSetValidator] { - return &genericValidator[*v2.FirewallSet, *firewallSetValidator]{log: log} +func NewFirewallSetValidator(log logr.Logger) admission.Validator[*v2.FirewallSet] { + return &firewallSetValidator{ + log: log, + } } -func (v *firewallSetValidator) ValidateCreate(log logr.Logger, f *v2.FirewallSet) field.ErrorList { +func (v *firewallSetValidator) ValidateCreate(ctx context.Context, f *v2.FirewallSet) (admission.Warnings, error) { var allErrs field.ErrorList - allErrs = append(allErrs, v.validateSpec(log, &f.Spec, field.NewPath("spec"))...) + allErrs = append(allErrs, apivalidation.ValidateObjectMetaAccessor(&f.ObjectMeta, true, apivalidation.NameIsDNSSubdomain, field.NewPath("metadata"))...) + allErrs = append(allErrs, v.validateSpec(v.log, &f.Spec, field.NewPath("spec"))...) - return allErrs + return nil, apierrors.NewInvalid( + f.GetObjectKind().GroupVersionKind().GroupKind(), + f.GetName(), + allErrs, + ) +} + +func (v *firewallSetValidator) ValidateUpdate(ctx context.Context, oldF, newF *v2.FirewallSet) (admission.Warnings, error) { + var allErrs field.ErrorList + + allErrs = append(allErrs, apivalidation.ValidateObjectMetaAccessorUpdate(&newF.ObjectMeta, &oldF.ObjectMeta, field.NewPath("metadata"))...) + allErrs = append(allErrs, v.validateSpecUpdate(v.log, &oldF.Spec, &newF.Spec, field.NewPath("spec"))...) + + return nil, apierrors.NewInvalid( + newF.GetObjectKind().GroupVersionKind().GroupKind(), + newF.GetName(), + allErrs, + ) +} + +func (v *firewallSetValidator) ValidateDelete(ctx context.Context, f *v2.FirewallSet) (warnings admission.Warnings, err error) { + return nil, nil } func (v *firewallSetValidator) validateSpec(log logr.Logger, f *v2.FirewallSetSpec, fldPath *field.Path) field.ErrorList { @@ -55,15 +84,7 @@ func (v *firewallSetValidator) validateSpec(log logr.Logger, f *v2.FirewallSetSp } } - allErrs = append(allErrs, NewFirewallValidator(log).Instance().validateSpec(&f.Template.Spec, fldPath.Child("template").Child("spec"))...) - - return allErrs -} - -func (v *firewallSetValidator) ValidateUpdate(log logr.Logger, oldF, newF *v2.FirewallSet) field.ErrorList { - var allErrs field.ErrorList - - allErrs = append(allErrs, v.validateSpecUpdate(log, &oldF.Spec, &newF.Spec, field.NewPath("spec"))...) + allErrs = append(allErrs, validateFirewallSpec(&f.Template.Spec, fldPath.Child("template").Child("spec"))...) return allErrs } @@ -73,7 +94,7 @@ func (v *firewallSetValidator) validateSpecUpdate(log logr.Logger, oldF, newF *v allErrs = append(allErrs, v.validateSpec(log, newF, fldPath)...) - allErrs = append(allErrs, NewFirewallValidator(log).Instance().validateSpecUpdate(&oldF.Template.Spec, &newF.Template.Spec, fldPath.Child("template").Child("spec"))...) + allErrs = append(allErrs, validateFirewallSpecUpdate(&oldF.Template.Spec, &newF.Template.Spec, fldPath.Child("template").Child("spec"))...) // TODO: theoretically, the selector or metadata should be changeable, but we need to think it through... let's simplify for now and just not support it. allErrs = append(allErrs, apivalidation.ValidateImmutableField(newF.Selector, oldF.Selector, fldPath.Child("selector"))...) diff --git a/controllers/deployment/controller.go b/controllers/deployment/controller.go index 6366b87..cfc0e04 100644 --- a/controllers/deployment/controller.go +++ b/controllers/deployment/controller.go @@ -68,8 +68,7 @@ func SetupWebhookWithManager(log logr.Logger, mgr ctrl.Manager, c *config.Contro return err } - return ctrl.NewWebhookManagedBy(mgr). - For(&v2.FirewallDeployment{}). + return ctrl.NewWebhookManagedBy(mgr, &v2.FirewallDeployment{}). WithDefaulter(defaulter). WithValidator(validation.NewFirewallDeploymentValidator(log.WithName("validating-webhook"))). Complete() diff --git a/controllers/firewall/controller.go b/controllers/firewall/controller.go index 6c18b9a..ff0d548 100644 --- a/controllers/firewall/controller.go +++ b/controllers/firewall/controller.go @@ -110,8 +110,7 @@ func SetupWebhookWithManager(log logr.Logger, mgr ctrl.Manager, c *config.Contro return err } - return ctrl.NewWebhookManagedBy(mgr). - For(&v2.Firewall{}). + return ctrl.NewWebhookManagedBy(mgr, &v2.Firewall{}). WithDefaulter(defaulter). WithValidator(validation.NewFirewallValidator(log.WithName("validating-webhook"))). Complete() diff --git a/controllers/set/controller.go b/controllers/set/controller.go index 06909c5..126930f 100644 --- a/controllers/set/controller.go +++ b/controllers/set/controller.go @@ -58,8 +58,7 @@ func SetupWebhookWithManager(log logr.Logger, mgr ctrl.Manager, c *config.Contro return err } - return ctrl.NewWebhookManagedBy(mgr). - For(&v2.FirewallSet{}). + return ctrl.NewWebhookManagedBy(mgr, &v2.FirewallSet{}). WithDefaulter(defaulter). WithValidator(validation.NewFirewallSetValidator(log.WithName("validating-webhook"))). Complete() diff --git a/go.mod b/go.mod index 5d97c1a..a2d1e28 100644 --- a/go.mod +++ b/go.mod @@ -1,140 +1,145 @@ module github.com/metal-stack/firewall-controller-manager -go 1.24 - -toolchain go1.24.2 +go 1.25.0 require ( - github.com/Masterminds/semver/v3 v3.3.1 + github.com/Masterminds/semver/v3 v3.4.0 github.com/flatcar/container-linux-config-transpiler v0.9.4 - github.com/go-logr/logr v1.4.2 - github.com/go-openapi/strfmt v0.23.0 + github.com/go-logr/logr v1.4.3 + github.com/go-openapi/strfmt v0.25.0 github.com/google/go-cmp v0.7.0 github.com/google/uuid v1.6.0 - github.com/metal-stack/metal-go v0.41.0 - github.com/metal-stack/metal-lib v0.21.0 + github.com/metal-stack/metal-go v0.42.5 + github.com/metal-stack/metal-lib v0.23.5 github.com/metal-stack/v v1.0.3 - github.com/onsi/ginkgo/v2 v2.23.4 - github.com/onsi/gomega v1.37.0 - github.com/prometheus/client_golang v1.22.0 - github.com/stretchr/testify v1.10.0 - k8s.io/api v0.29.3 - k8s.io/apimachinery v0.32.3 - k8s.io/client-go v0.29.3 - sigs.k8s.io/controller-runtime v0.16.5 + github.com/onsi/ginkgo/v2 v2.27.5 + github.com/onsi/gomega v1.39.0 + github.com/prometheus/client_golang v1.23.2 + github.com/stretchr/testify v1.11.1 + k8s.io/api v0.35.0 + k8s.io/apimachinery v0.35.0 + k8s.io/client-go v0.35.0 + sigs.k8s.io/controller-runtime v0.23.0 ) -replace k8s.io/apimachinery => k8s.io/apimachinery v0.29.3 - require ( github.com/ajeddeloh/go-json v0.0.0-20200220154158-5ae607161559 // indirect github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137 // indirect - github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect - github.com/coreos/go-oidc/v3 v3.13.0 // indirect + github.com/coreos/go-oidc/v3 v3.14.1 // indirect github.com/coreos/go-semver v0.3.1 // indirect github.com/coreos/go-systemd v0.0.0-20191104093116-d3cd4ed1dbcf // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect - github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 // indirect - github.com/emicklei/go-restful/v3 v3.12.2 // indirect + github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.0 // indirect + github.com/emicklei/go-restful/v3 v3.13.0 // indirect github.com/evanphx/json-patch v5.6.0+incompatible // indirect - github.com/evanphx/json-patch/v5 v5.8.0 // indirect + github.com/evanphx/json-patch/v5 v5.9.11 // indirect github.com/fatih/color v1.18.0 // indirect github.com/flatcar/ignition v0.36.2 // indirect - github.com/fsnotify/fsnotify v1.8.0 // indirect - github.com/go-jose/go-jose/v4 v4.0.5 // indirect + github.com/fsnotify/fsnotify v1.9.0 // indirect + github.com/fxamacker/cbor/v2 v2.9.0 // indirect + github.com/go-jose/go-jose/v4 v4.1.0 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-openapi/analysis v0.23.0 // indirect - github.com/go-openapi/errors v0.22.0 // indirect - github.com/go-openapi/jsonpointer v0.21.0 // indirect + github.com/go-openapi/errors v0.22.4 // indirect + github.com/go-openapi/jsonpointer v0.21.1 // indirect github.com/go-openapi/jsonreference v0.21.0 // indirect github.com/go-openapi/loads v0.22.0 // indirect github.com/go-openapi/runtime v0.28.0 // indirect github.com/go-openapi/spec v0.21.0 // indirect - github.com/go-openapi/swag v0.23.0 // indirect + github.com/go-openapi/swag v0.24.1 // indirect + github.com/go-openapi/swag/cmdutils v0.24.0 // indirect + github.com/go-openapi/swag/conv v0.24.0 // indirect + github.com/go-openapi/swag/fileutils v0.24.0 // indirect + github.com/go-openapi/swag/jsonname v0.24.0 // indirect + github.com/go-openapi/swag/jsonutils v0.24.0 // indirect + github.com/go-openapi/swag/loading v0.24.0 // indirect + github.com/go-openapi/swag/mangling v0.24.0 // indirect + github.com/go-openapi/swag/netutils v0.24.0 // indirect + github.com/go-openapi/swag/stringutils v0.24.0 // indirect + github.com/go-openapi/swag/typeutils v0.24.0 // indirect + github.com/go-openapi/swag/yamlutils v0.24.0 // indirect github.com/go-openapi/validate v0.24.0 // indirect github.com/go-task/slim-sprig/v3 v3.0.0 // indirect - github.com/go-viper/mapstructure/v2 v2.2.1 // indirect - github.com/goccy/go-json v0.10.4 // indirect - github.com/goccy/go-yaml v1.16.0 // indirect - github.com/gogo/protobuf v1.3.2 // indirect + github.com/go-viper/mapstructure/v2 v2.4.0 // indirect + github.com/goccy/go-json v0.10.5 // indirect + github.com/goccy/go-yaml v1.18.0 // indirect github.com/golang-jwt/jwt/v5 v5.2.2 // indirect - github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 // indirect - github.com/golang/protobuf v1.5.4 // indirect - github.com/google/gnostic-models v0.6.9 // indirect - github.com/google/gofuzz v1.2.0 // indirect + github.com/google/btree v1.1.3 // indirect + github.com/google/gnostic-models v0.7.0 // indirect github.com/google/pprof v0.0.0-20250403155104-27863c87afa6 // indirect github.com/gorilla/mux v1.8.1 // indirect - github.com/imdario/mergo v0.3.16 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/josharian/intern v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect - github.com/lestrrat-go/blackmagic v1.0.2 // indirect + github.com/lestrrat-go/blackmagic v1.0.3 // indirect github.com/lestrrat-go/httpcc v1.0.1 // indirect github.com/lestrrat-go/httprc v1.0.6 // indirect github.com/lestrrat-go/iter v1.0.2 // indirect - github.com/lestrrat-go/jwx/v2 v2.1.3 // indirect + github.com/lestrrat-go/jwx/v2 v2.1.5 // indirect github.com/lestrrat-go/option v1.0.1 // indirect github.com/mailru/easyjson v0.9.0 // indirect github.com/mattn/go-colorable v0.1.14 // indirect github.com/mattn/go-isatty v0.0.20 // indirect github.com/mattn/go-runewidth v0.0.16 // indirect - github.com/metal-stack/security v0.9.3 // indirect - github.com/mitchellh/mapstructure v1.5.0 // indirect + github.com/metal-stack/security v0.9.4 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect - github.com/modern-go/reflect2 v1.0.2 // indirect + github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/oklog/ulid v1.3.1 // indirect - github.com/olekukonko/tablewriter v0.0.5 // indirect + github.com/olekukonko/errors v1.1.0 // indirect + github.com/olekukonko/ll v0.0.9 // indirect + github.com/olekukonko/tablewriter v1.0.8 // indirect github.com/opentracing/opentracing-go v1.2.0 // indirect github.com/pelletier/go-toml/v2 v2.2.3 // indirect - github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect - github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.62.0 // indirect - github.com/prometheus/procfs v0.15.1 // indirect + github.com/prometheus/client_model v0.6.2 // indirect + github.com/prometheus/common v0.66.1 // indirect + github.com/prometheus/procfs v0.16.1 // indirect github.com/rivo/uniseg v0.4.7 // indirect github.com/sagikazarmark/locafero v0.7.0 // indirect github.com/segmentio/asm v1.2.0 // indirect github.com/sourcegraph/conc v0.3.0 // indirect github.com/spf13/afero v1.14.0 // indirect github.com/spf13/cast v1.7.1 // indirect - github.com/spf13/cobra v1.9.1 // indirect - github.com/spf13/pflag v1.0.6 // indirect + github.com/spf13/cobra v1.10.0 // indirect + github.com/spf13/pflag v1.0.9 // indirect github.com/spf13/viper v1.20.0 // indirect github.com/stretchr/objx v0.5.2 // indirect github.com/subosito/gotenv v1.6.0 // indirect github.com/vincent-petithory/dataurl v1.0.0 // indirect - go.mongodb.org/mongo-driver v1.17.2 // indirect + github.com/x448/float16 v0.8.4 // indirect + go.mongodb.org/mongo-driver v1.17.6 // indirect go.opentelemetry.io/auto/sdk v1.1.0 // indirect - go.opentelemetry.io/otel v1.35.0 // indirect - go.opentelemetry.io/otel/metric v1.35.0 // indirect - go.opentelemetry.io/otel/trace v1.35.0 // indirect - go.uber.org/automaxprocs v1.6.0 // indirect + go.opentelemetry.io/otel v1.36.0 // indirect + go.opentelemetry.io/otel/metric v1.36.0 // indirect + go.opentelemetry.io/otel/trace v1.36.0 // indirect go.uber.org/multierr v1.11.0 // indirect + go.yaml.in/yaml/v2 v2.4.3 // indirect + go.yaml.in/yaml/v3 v3.0.4 // indirect go4.org v0.0.0-20230225012048-214862532bf5 // indirect - golang.org/x/crypto v0.37.0 // indirect - golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 // indirect - golang.org/x/net v0.39.0 // indirect - golang.org/x/oauth2 v0.29.0 // indirect - golang.org/x/sync v0.13.0 // indirect - golang.org/x/sys v0.32.0 // indirect - golang.org/x/term v0.31.0 // indirect - golang.org/x/text v0.24.0 // indirect + golang.org/x/crypto v0.45.0 // indirect + golang.org/x/mod v0.29.0 // indirect + golang.org/x/net v0.47.0 // indirect + golang.org/x/oauth2 v0.30.0 // indirect + golang.org/x/sync v0.18.0 // indirect + golang.org/x/sys v0.38.0 // indirect + golang.org/x/term v0.37.0 // indirect + golang.org/x/text v0.31.0 // indirect golang.org/x/time v0.11.0 // indirect - golang.org/x/tools v0.32.0 // indirect + golang.org/x/tools v0.38.0 // indirect gomodules.xyz/jsonpatch/v2 v2.4.0 // indirect - google.golang.org/protobuf v1.36.6 // indirect + google.golang.org/protobuf v1.36.8 // indirect + gopkg.in/evanphx/json-patch.v4 v4.13.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect - gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - k8s.io/apiextensions-apiserver v0.29.0 // indirect - k8s.io/component-base v0.29.0 // indirect + k8s.io/apiextensions-apiserver v0.35.0 // indirect k8s.io/klog/v2 v2.130.1 // indirect - k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340 // indirect - k8s.io/utils v0.0.0-20240711033017-18e509b52bc8 // indirect - sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3 // indirect - sigs.k8s.io/structured-merge-diff/v4 v4.4.1 // indirect - sigs.k8s.io/yaml v1.4.0 // indirect + k8s.io/kube-openapi v0.0.0-20250910181357-589584f1c912 // indirect + k8s.io/utils v0.0.0-20251002143259-bc988d571ff4 // indirect + sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730 // indirect + sigs.k8s.io/randfill v1.0.0 // indirect + sigs.k8s.io/structured-merge-diff/v6 v6.3.0 // indirect + sigs.k8s.io/yaml v1.6.0 // indirect ) diff --git a/go.sum b/go.sum index 64e65ac..8d82f70 100644 --- a/go.sum +++ b/go.sum @@ -17,16 +17,14 @@ cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0Zeo dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/Masterminds/semver/v3 v3.3.1 h1:QtNSWtVZ3nBfk8mAOu/B6v7FMJ+NHTIgUPi7rj+4nv4= -github.com/Masterminds/semver/v3 v3.3.1/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= +github.com/Masterminds/semver/v3 v3.4.0 h1:Zog+i5UMtVoCU8oKka5P7i9q9HgrJeGzI9SA1Xbatp0= +github.com/Masterminds/semver/v3 v3.4.0/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= github.com/ajeddeloh/go-json v0.0.0-20160803184958-73d058cf8437/go.mod h1:otnto4/Icqn88WCcM4bhIJNSgsh9VLBuspyyCfvof9c= github.com/ajeddeloh/go-json v0.0.0-20200220154158-5ae607161559 h1:4SPQljF/GJ8Q+QlCWMWxRBepub4DresnOm4eI2ebFGc= github.com/ajeddeloh/go-json v0.0.0-20200220154158-5ae607161559/go.mod h1:otnto4/Icqn88WCcM4bhIJNSgsh9VLBuspyyCfvof9c= github.com/alecthomas/units v0.0.0-20210208195552-ff826a37aa15/go.mod h1:OMCwj8VM1Kc9e19TLln2VL61YJF0x1XFtfdL4JdbSyE= github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137 h1:s6gZFSlWYmbqAuRjVTiNNhvNRfY2Wxp9nhfyel4rklc= github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137/go.mod h1:OMCwj8VM1Kc9e19TLln2VL61YJF0x1XFtfdL4JdbSyE= -github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 h1:DklsrG3dyBCFEj5IhUbnKptjxatkF07cF2ak3yi77so= -github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw= github.com/aws/aws-sdk-go v1.8.39/go.mod h1:ZRmQr0FajVIyZ4ZzBYKG5P3ZqPz9IHG41ZoMu1ADI3k= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= @@ -37,8 +35,8 @@ github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWR github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/coreos/go-oidc/v3 v3.13.0 h1:M66zd0pcc5VxvBNM4pB331Wrsanby+QomQYjN8HamW8= -github.com/coreos/go-oidc/v3 v3.13.0/go.mod h1:HaZ3szPaZ0e4r6ebqvsLWlk2Tn+aejfmrfah6hnSYEU= +github.com/coreos/go-oidc/v3 v3.14.1 h1:9ePWwfdwC4QKRlCXsJGou56adA/owXczOzwKdOumLqk= +github.com/coreos/go-oidc/v3 v3.14.1/go.mod h1:HaZ3szPaZ0e4r6ebqvsLWlk2Tn+aejfmrfah6hnSYEU= github.com/coreos/go-semver v0.1.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-semver v0.3.1 h1:yi21YpKnrx1gt5R+la8n5WgS0kCrsPp33dmEyHReZr4= @@ -51,16 +49,16 @@ github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 h1:rpfIENRNNilwHwZeG5+P150SMrnNEcHYvcCuK6dPZSg= -github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0= -github.com/emicklei/go-restful/v3 v3.12.2 h1:DhwDP0vY3k8ZzE0RunuJy8GhNpPL6zqLkDf9B/a0/xU= -github.com/emicklei/go-restful/v3 v3.12.2/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.0 h1:NMZiJj8QnKe1LgsbDayM4UoHwbvwDRwnI3hwNaAHRnc= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.0/go.mod h1:ZXNYxsqcloTdSy/rNShjYzMhyjf0LaoftYK0p+A3h40= +github.com/emicklei/go-restful/v3 v3.13.0 h1:C4Bl2xDndpU6nJ4bc1jXd+uTmYPVUwkD6bFY/oTyCes= +github.com/emicklei/go-restful/v3 v3.13.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/evanphx/json-patch v5.6.0+incompatible h1:jBYDEEiFBPxA0v50tFdvOzQQTCvpL6mnFh5mB2/l16U= github.com/evanphx/json-patch v5.6.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch/v5 v5.8.0 h1:lRj6N9Nci7MvzrXuX6HFzU8XjmhPiXPlsKEy1u0KQro= -github.com/evanphx/json-patch/v5 v5.8.0/go.mod h1:VNkHZ/282BpEyt/tObQO8s5CMPmYYq14uClGH4abBuQ= +github.com/evanphx/json-patch/v5 v5.9.11 h1:/8HVnzMq13/3x9TPvjG08wUGqBTmZBsCWzjTM0wiaDU= +github.com/evanphx/json-patch/v5 v5.9.11/go.mod h1:3j+LviiESTElxA4p3EMKAB9HXj3/XEtnUf6OZxqIQTM= github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM= github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/6HfU= github.com/flatcar/container-linux-config-transpiler v0.9.4 h1:yXQ0NB8PeNrKJPrZvbv5/DV63PNhTqt8vaf8YxmX/RA= @@ -69,26 +67,34 @@ github.com/flatcar/ignition v0.36.2 h1:xGHgScUe0P4Fkprjqv7L2CE58emiQgP833OCCn9z2 github.com/flatcar/ignition v0.36.2/go.mod h1:uk1tpzLFRXus4RrvzgMI+IqmmB8a/RGFSBlI+tMTbbA= github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= -github.com/fsnotify/fsnotify v1.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/8M= -github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= +github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k= +github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= +github.com/fxamacker/cbor/v2 v2.9.0 h1:NpKPmjDBgUfBms6tr6JZkTHtfFGcMKsw3eGcmD/sapM= +github.com/fxamacker/cbor/v2 v2.9.0/go.mod h1:vM4b+DJCtHn+zz7h3FFp/hDAI9WNWCsZj23V5ytsSxQ= +github.com/gkampitakis/ciinfo v0.3.2 h1:JcuOPk8ZU7nZQjdUhctuhQofk7BGHuIy0c9Ez8BNhXs= +github.com/gkampitakis/ciinfo v0.3.2/go.mod h1:1NIwaOcFChN4fa/B0hEBdAb6npDlFL8Bwx4dfRLRqAo= +github.com/gkampitakis/go-diff v1.3.2 h1:Qyn0J9XJSDTgnsgHRdz9Zp24RaJeKMUHg2+PDZZdC4M= +github.com/gkampitakis/go-diff v1.3.2/go.mod h1:LLgOrpqleQe26cte8s36HTWcTmMEur6OPYerdAAS9tk= +github.com/gkampitakis/go-snaps v0.5.15 h1:amyJrvM1D33cPHwVrjo9jQxX8g/7E2wYdZ+01KS3zGE= +github.com/gkampitakis/go-snaps v0.5.15/go.mod h1:HNpx/9GoKisdhw9AFOBT1N7DBs9DiHo/hGheFGBZ+mc= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-ini/ini v1.25.4/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= -github.com/go-jose/go-jose/v4 v4.0.5 h1:M6T8+mKZl/+fNNuFHvGIzDz7BTLQPIounk/b9dw3AaE= -github.com/go-jose/go-jose/v4 v4.0.5/go.mod h1:s3P1lRrkT8igV8D9OjyL4WRyHvjB6a4JSllnOrmmBOA= +github.com/go-jose/go-jose/v4 v4.1.0 h1:cYSYxd3pw5zd2FSXk2vGdn9igQU2PS8MuxrCOCl0FdY= +github.com/go-jose/go-jose/v4 v4.1.0/go.mod h1:GG/vqmYm3Von2nYiB2vGTXzdoNKE5tix5tuc6iAd+sw= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= -github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= +github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-logr/zapr v1.2.4 h1:QHVo+6stLbfJmYGkQ7uGHUCu5hnAFAj6mDe6Ea0SeOo= -github.com/go-logr/zapr v1.2.4/go.mod h1:FyHWQIzQORZ0QVE1BtVHv3cKtNLuXsbNLtpuhNapBOA= +github.com/go-logr/zapr v1.3.0 h1:XGdV8XW8zdwFiwOA2Dryh1gj2KRQyOOoNmBy4EplIcQ= +github.com/go-logr/zapr v1.3.0/go.mod h1:YKepepNBd1u/oyhd/yQmtjVXmm9uML4IXUgMOwR8/Gg= github.com/go-openapi/analysis v0.23.0 h1:aGday7OWupfMs+LbmLZG4k0MYXIANxcuBTYUC03zFCU= github.com/go-openapi/analysis v0.23.0/go.mod h1:9mz9ZWaSlV8TvjQHLl2mUW2PbZtemkE8yA5v22ohupo= -github.com/go-openapi/errors v0.22.0 h1:c4xY/OLxUBSTiepAg3j/MHuAv5mJhnf53LLMWFB+u/w= -github.com/go-openapi/errors v0.22.0/go.mod h1:J3DmZScxCDufmIMsdOuDHxJbdOGC0xtUynjIx092vXE= -github.com/go-openapi/jsonpointer v0.21.0 h1:YgdVicSA9vH5RiHs9TZW5oyafXZFc6+2Vc1rr/O9oNQ= -github.com/go-openapi/jsonpointer v0.21.0/go.mod h1:IUyH9l/+uyhIYQ/PXVA41Rexl+kOkAPDdXEYns6fzUY= +github.com/go-openapi/errors v0.22.4 h1:oi2K9mHTOb5DPW2Zjdzs/NIvwi2N3fARKaTJLdNabaM= +github.com/go-openapi/errors v0.22.4/go.mod h1:z9S8ASTUqx7+CP1Q8dD8ewGH/1JWFFLX/2PmAYNQLgk= +github.com/go-openapi/jsonpointer v0.21.1 h1:whnzv/pNXtK2FbX/W9yJfRmE2gsmkfahjMKB0fZvcic= +github.com/go-openapi/jsonpointer v0.21.1/go.mod h1:50I1STOfbY1ycR8jGz8DaMeLCdXiI6aDteEdRNNzpdk= github.com/go-openapi/jsonreference v0.21.0 h1:Rs+Y7hSXT83Jacb7kFyjn4ijOuVGSvOdF2+tg1TRrwQ= github.com/go-openapi/jsonreference v0.21.0/go.mod h1:LmZmgsrTkVg9LG4EaHeY8cBDslNPMo06cago5JNLkm4= github.com/go-openapi/loads v0.22.0 h1:ECPGd4jX1U6NApCGG1We+uEozOAvXvJSF4nnwHZ8Aco= @@ -97,31 +103,51 @@ github.com/go-openapi/runtime v0.28.0 h1:gpPPmWSNGo214l6n8hzdXYhPuJcGtziTOgUpvsF github.com/go-openapi/runtime v0.28.0/go.mod h1:QN7OzcS+XuYmkQLw05akXk0jRH/eZ3kb18+1KwW9gyc= github.com/go-openapi/spec v0.21.0 h1:LTVzPc3p/RzRnkQqLRndbAzjY0d0BCL72A6j3CdL9ZY= github.com/go-openapi/spec v0.21.0/go.mod h1:78u6VdPw81XU44qEWGhtr982gJ5BWg2c0I5XwVMotYk= -github.com/go-openapi/strfmt v0.23.0 h1:nlUS6BCqcnAk0pyhi9Y+kdDVZdZMHfEKQiS4HaMgO/c= -github.com/go-openapi/strfmt v0.23.0/go.mod h1:NrtIpfKtWIygRkKVsxh7XQMDQW5HKQl6S5ik2elW+K4= -github.com/go-openapi/swag v0.23.0 h1:vsEVJDUo2hPJ2tu0/Xc+4noaxyEffXNIs3cOULZ+GrE= -github.com/go-openapi/swag v0.23.0/go.mod h1:esZ8ITTYEsH1V2trKHjAN8Ai7xHb8RV+YSZ577vPjgQ= +github.com/go-openapi/strfmt v0.25.0 h1:7R0RX7mbKLa9EYCTHRcCuIPcaqlyQiWNPTXwClK0saQ= +github.com/go-openapi/strfmt v0.25.0/go.mod h1:nNXct7OzbwrMY9+5tLX4I21pzcmE6ccMGXl3jFdPfn8= +github.com/go-openapi/swag v0.24.1 h1:DPdYTZKo6AQCRqzwr/kGkxJzHhpKxZ9i/oX0zag+MF8= +github.com/go-openapi/swag v0.24.1/go.mod h1:sm8I3lCPlspsBBwUm1t5oZeWZS0s7m/A+Psg0ooRU0A= +github.com/go-openapi/swag/cmdutils v0.24.0 h1:KlRCffHwXFI6E5MV9n8o8zBRElpY4uK4yWyAMWETo9I= +github.com/go-openapi/swag/cmdutils v0.24.0/go.mod h1:uxib2FAeQMByyHomTlsP8h1TtPd54Msu2ZDU/H5Vuf8= +github.com/go-openapi/swag/conv v0.24.0 h1:ejB9+7yogkWly6pnruRX45D1/6J+ZxRu92YFivx54ik= +github.com/go-openapi/swag/conv v0.24.0/go.mod h1:jbn140mZd7EW2g8a8Y5bwm8/Wy1slLySQQ0ND6DPc2c= +github.com/go-openapi/swag/fileutils v0.24.0 h1:U9pCpqp4RUytnD689Ek/N1d2N/a//XCeqoH508H5oak= +github.com/go-openapi/swag/fileutils v0.24.0/go.mod h1:3SCrCSBHyP1/N+3oErQ1gP+OX1GV2QYFSnrTbzwli90= +github.com/go-openapi/swag/jsonname v0.24.0 h1:2wKS9bgRV/xB8c62Qg16w4AUiIrqqiniJFtZGi3dg5k= +github.com/go-openapi/swag/jsonname v0.24.0/go.mod h1:GXqrPzGJe611P7LG4QB9JKPtUZ7flE4DOVechNaDd7Q= +github.com/go-openapi/swag/jsonutils v0.24.0 h1:F1vE1q4pg1xtO3HTyJYRmEuJ4jmIp2iZ30bzW5XgZts= +github.com/go-openapi/swag/jsonutils v0.24.0/go.mod h1:vBowZtF5Z4DDApIoxcIVfR8v0l9oq5PpYRUuteVu6f0= +github.com/go-openapi/swag/loading v0.24.0 h1:ln/fWTwJp2Zkj5DdaX4JPiddFC5CHQpvaBKycOlceYc= +github.com/go-openapi/swag/loading v0.24.0/go.mod h1:gShCN4woKZYIxPxbfbyHgjXAhO61m88tmjy0lp/LkJk= +github.com/go-openapi/swag/mangling v0.24.0 h1:PGOQpViCOUroIeak/Uj/sjGAq9LADS3mOyjznmHy2pk= +github.com/go-openapi/swag/mangling v0.24.0/go.mod h1:Jm5Go9LHkycsz0wfoaBDkdc4CkpuSnIEf62brzyCbhc= +github.com/go-openapi/swag/netutils v0.24.0 h1:Bz02HRjYv8046Ycg/w80q3g9QCWeIqTvlyOjQPDjD8w= +github.com/go-openapi/swag/netutils v0.24.0/go.mod h1:WRgiHcYTnx+IqfMCtu0hy9oOaPR0HnPbmArSRN1SkZM= +github.com/go-openapi/swag/stringutils v0.24.0 h1:i4Z/Jawf9EvXOLUbT97O0HbPUja18VdBxeadyAqS1FM= +github.com/go-openapi/swag/stringutils v0.24.0/go.mod h1:5nUXB4xA0kw2df5PRipZDslPJgJut+NjL7D25zPZ/4w= +github.com/go-openapi/swag/typeutils v0.24.0 h1:d3szEGzGDf4L2y1gYOSSLeK6h46F+zibnEas2Jm/wIw= +github.com/go-openapi/swag/typeutils v0.24.0/go.mod h1:q8C3Kmk/vh2VhpCLaoR2MVWOGP8y7Jc8l82qCTd1DYI= +github.com/go-openapi/swag/yamlutils v0.24.0 h1:bhw4894A7Iw6ne+639hsBNRHg9iZg/ISrOVr+sJGp4c= +github.com/go-openapi/swag/yamlutils v0.24.0/go.mod h1:DpKv5aYuaGm/sULePoeiG8uwMpZSfReo1HR3Ik0yaG8= +github.com/go-openapi/testify/v2 v2.0.2 h1:X999g3jeLcoY8qctY/c/Z8iBHTbwLz7R2WXd6Ub6wls= +github.com/go-openapi/testify/v2 v2.0.2/go.mod h1:HCPmvFFnheKK2BuwSA0TbbdxJ3I16pjwMkYkP4Ywn54= github.com/go-openapi/validate v0.24.0 h1:LdfDKwNbpB6Vn40xhTdNZAnfLECL81w+VX3BumrGD58= github.com/go-openapi/validate v0.24.0/go.mod h1:iyeX1sEufmv3nPbBdX3ieNviWnOZaJ1+zquzJEf2BAQ= github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI= github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= -github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= -github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= -github.com/goccy/go-json v0.10.4 h1:JSwxQzIqKfmFX1swYPpUThQZp/Ka4wzJdK0LWVytLPM= -github.com/goccy/go-json v0.10.4/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= -github.com/goccy/go-yaml v1.16.0 h1:d7m1G7A0t+logajVtklHfDYJs2Et9g3gHwdBNNFou0w= -github.com/goccy/go-yaml v1.16.0/go.mod h1:XBurs7gK8ATbW4ZPGKgcbrY1Br56PdM69F7LkFRi1kA= +github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs= +github.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/goccy/go-json v0.10.5 h1:Fq85nIqj+gXn/S5ahsiTlK3TmC85qgirsdTP/+DeaC4= +github.com/goccy/go-json v0.10.5/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= +github.com/goccy/go-yaml v1.18.0 h1:8W7wMFS12Pcas7KU+VVkaiCng+kG8QiFeFwzFb+rwuw= +github.com/goccy/go-yaml v1.18.0/go.mod h1:XBurs7gK8ATbW4ZPGKgcbrY1Br56PdM69F7LkFRi1kA= github.com/godbus/dbus v0.0.0-20181025153459-66d97aec3384/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= -github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= -github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang-jwt/jwt/v5 v5.2.2 h1:Rl4B7itRWVtYIHFrSNd7vhTiz9UpLdi6gZhZ3wEeDy8= github.com/golang-jwt/jwt/v5 v5.2.2/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 h1:f+oWsMOmNPc8JmEHVZIycC7hBoQxHH9pNKQORJNozsQ= -github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8/go.mod h1:wcDNUvekVysuuOpQKo3191zZyTpiI6se1N1ULghS0sw= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= @@ -130,17 +156,16 @@ github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5y github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= -github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/gnostic-models v0.6.9 h1:MU/8wDLif2qCXZmzncUQ/BOfxWfthHi63KqpoNbWqVw= -github.com/google/gnostic-models v0.6.9/go.mod h1:CiWsm0s6BSQd1hRn8/QmxqB6BesYcbSZxsz9b0KuDBw= +github.com/google/btree v1.1.3 h1:CVpQJjYgC4VbzxeGVHfvZrv1ctoYCAI8vbl07Fcxlyg= +github.com/google/btree v1.1.3/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= +github.com/google/gnostic-models v0.7.0 h1:qwTtogB15McXDaNqTZdzPJRHvaVJlAl+HVQnLmJEJxo= +github.com/google/gnostic-models v0.7.0/go.mod h1:whL5G0m6dmc5cPxKc5bdKdEN3UjI7OUGxBlw57miDrQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= @@ -163,19 +188,18 @@ github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWS github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/imdario/mergo v0.3.16 h1:wwQJbIsHYGMUyLSPrEq1CT16AhnhNJQ51+4fdHUnCl4= -github.com/imdario/mergo v0.3.16/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+hD27ysY= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= +github.com/joshdk/go-junit v1.0.0 h1:S86cUKIdwBHWwA6xCmFlf3RTLfVXYQfvanM5Uh+K6GE= +github.com/joshdk/go-junit v1.0.0/go.mod h1:TiiV0PqkaNfFXjEiyjWM3XXrhVyCa1K4Zfga6W52ung= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= -github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= @@ -188,52 +212,58 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/lestrrat-go/blackmagic v1.0.2 h1:Cg2gVSc9h7sz9NOByczrbUvLopQmXrfFx//N+AkAr5k= -github.com/lestrrat-go/blackmagic v1.0.2/go.mod h1:UrEqBzIR2U6CnzVyUtfM6oZNMt/7O7Vohk2J0OGSAtU= +github.com/lestrrat-go/blackmagic v1.0.3 h1:94HXkVLxkZO9vJI/w2u1T0DAoprShFd13xtnSINtDWs= +github.com/lestrrat-go/blackmagic v1.0.3/go.mod h1:6AWFyKNNj0zEXQYfTMPfZrAXUWUfTIZ5ECEUEJaijtw= github.com/lestrrat-go/httpcc v1.0.1 h1:ydWCStUeJLkpYyjLDHihupbn2tYmZ7m22BGkcvZZrIE= github.com/lestrrat-go/httpcc v1.0.1/go.mod h1:qiltp3Mt56+55GPVCbTdM9MlqhvzyuL6W/NMDA8vA5E= github.com/lestrrat-go/httprc v1.0.6 h1:qgmgIRhpvBqexMJjA/PmwSvhNk679oqD1RbovdCGW8k= github.com/lestrrat-go/httprc v1.0.6/go.mod h1:mwwz3JMTPBjHUkkDv/IGJ39aALInZLrhBp0X7KGUZlo= github.com/lestrrat-go/iter v1.0.2 h1:gMXo1q4c2pHmC3dn8LzRhJfP1ceCbgSiT9lUydIzltI= github.com/lestrrat-go/iter v1.0.2/go.mod h1:Momfcq3AnRlRjI5b5O8/G5/BvpzrhoFTZcn06fEOPt4= -github.com/lestrrat-go/jwx/v2 v2.1.3 h1:Ud4lb2QuxRClYAmRleF50KrbKIoM1TddXgBrneT5/Jo= -github.com/lestrrat-go/jwx/v2 v2.1.3/go.mod h1:q6uFgbgZfEmQrfJfrCo90QcQOcXFMfbI/fO0NqRtvZo= +github.com/lestrrat-go/jwx/v2 v2.1.5 h1:PQI5gzadLfJ22ckLrejPVX6eGXKM4M4eGi5fW2jjA3o= +github.com/lestrrat-go/jwx/v2 v2.1.5/go.mod h1:Y722kU5r/8mV7fYDifjug0r8FK8mZdw0K0GpJw/l8pU= github.com/lestrrat-go/option v1.0.1 h1:oAzP2fvZGQKWkvHa1/SAcFolBEca1oN+mQ7eooNBEYU= github.com/lestrrat-go/option v1.0.1/go.mod h1:5ZHFbivi4xwXxhxY9XHDe2FHo6/Z7WWmtT7T5nBBp3I= github.com/mailru/easyjson v0.9.0 h1:PrnmzHw7262yW8sTBwxi1PdJA3Iw/EKBa8psRf7d9a4= github.com/mailru/easyjson v0.9.0/go.mod h1:1+xMtQp2MRNVL/V1bOzuP3aP8VNwRW55fQUto+XFtTU= +github.com/maruel/natural v1.1.1 h1:Hja7XhhmvEFhcByqDoHz9QZbkWey+COd9xWfCfn1ioo= +github.com/maruel/natural v1.1.1/go.mod h1:v+Rfd79xlw1AgVBjbO0BEQmptqb5HvL/k9GRHB7ZKEg= github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE= github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= -github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc= github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= -github.com/metal-stack/metal-go v0.41.0 h1:A8G/lmglviKObvGIFglV4RzY2u+g/eSCepX+roH68Uk= -github.com/metal-stack/metal-go v0.41.0/go.mod h1:ltItf/Md/z588c7Dr3X6iemCeOFh3rJ8nDL5Dpb9zFQ= -github.com/metal-stack/metal-lib v0.21.0 h1:oJSexA0czpS4aAUqCgymESWBsqG7BbjSceogsWowbPg= -github.com/metal-stack/metal-lib v0.21.0/go.mod h1:9KdYMPBrTKJFlCmubMgcirUiJHP3MG4FyBny6b/BVII= -github.com/metal-stack/security v0.9.3 h1:ZF5rGeZ4fIFe0DFFQWkXsUDCzODyjdrpvKmeaLOz9lo= -github.com/metal-stack/security v0.9.3/go.mod h1:ENm5kPjqh4uYvn79sAIxd6GZBwtF2GSsGdkLELrB/D4= +github.com/metal-stack/metal-go v0.42.5 h1:G7r+FPOCe9NwhYAUs7zKUELjCIAd7jmati+AHHT/4Pc= +github.com/metal-stack/metal-go v0.42.5/go.mod h1:GSfXrAj55LGsUSMHWGDsmq5n056NG0yb1JM8bgfvKOw= +github.com/metal-stack/metal-lib v0.23.5 h1:ozrkB3DNr3Cqn8nkBvmzc/KKpYqC1j1mv2OVOj8i7Ac= +github.com/metal-stack/metal-lib v0.23.5/go.mod h1:7uyHIrE19dkLwCZyeh2jmd7IEq5pEpzrzUGLoMN1eqY= +github.com/metal-stack/security v0.9.4 h1:qgB4Yx48Wgi57a/ePWE1gdUn4RjilVySQAFRVIoPKBU= +github.com/metal-stack/security v0.9.4/go.mod h1:Qya3sKnaZ+1VmayGcMGgCBsVhzBvWYYx9hcvinfXB1Q= github.com/metal-stack/v v1.0.3 h1:Sh2oBlnxrCUD+mVpzfC8HiqL045YWkxs0gpTvkjppqs= github.com/metal-stack/v v1.0.3/go.mod h1:YTahEu7/ishwpYKnp/VaW/7nf8+PInogkfGwLcGPdXg= -github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= -github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mfridman/tparse v0.18.0 h1:wh6dzOKaIwkUGyKgOntDW4liXSo37qg5AXbIhkMV3vE= +github.com/mfridman/tparse v0.18.0/go.mod h1:gEvqZTuCgEhPbYk/2lS3Kcxg1GmTxxU7kTC8DvP0i/A= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee h1:W5t00kpgFdJifH4BDsTlE89Zl93FEloxaWZfGcifgq8= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/oklog/ulid v1.3.1 h1:EGfNDEx6MqHz8B3uNV6QAib1UR2Lm97sHi3ocA6ESJ4= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= -github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= -github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= -github.com/onsi/ginkgo/v2 v2.23.4 h1:ktYTpKJAVZnDT4VjxSbiBenUjmlL/5QkBEocaWXiQus= -github.com/onsi/ginkgo/v2 v2.23.4/go.mod h1:Bt66ApGPBFzHyR+JO10Zbt0Gsp4uWxu5mIOTusL46e8= -github.com/onsi/gomega v1.37.0 h1:CdEG8g0S133B4OswTDC/5XPSzE1OeP29QOioj2PID2Y= -github.com/onsi/gomega v1.37.0/go.mod h1:8D9+Txp43QWKhM24yyOBEdpkzN8FvJyAwecBgsU4KU0= +github.com/olekukonko/errors v1.1.0 h1:RNuGIh15QdDenh+hNvKrJkmxxjV4hcS50Db478Ou5sM= +github.com/olekukonko/errors v1.1.0/go.mod h1:ppzxA5jBKcO1vIpCXQ9ZqgDh8iwODz6OXIGKU8r5m4Y= +github.com/olekukonko/ll v0.0.9 h1:Y+1YqDfVkqMWuEQMclsF9HUR5+a82+dxJuL1HHSRpxI= +github.com/olekukonko/ll v0.0.9/go.mod h1:En+sEW0JNETl26+K8eZ6/W4UQ7CYSrrgg/EdIYT2H8g= +github.com/olekukonko/tablewriter v1.0.8 h1:f6wJzHg4QUtJdvrVPKco4QTrAylgaU0+b9br/lJxEiQ= +github.com/olekukonko/tablewriter v1.0.8/go.mod h1:H428M+HzoUXC6JU2Abj9IT9ooRmdq9CxuDmKMtrOCMs= +github.com/onsi/ginkgo/v2 v2.27.5 h1:ZeVgZMx2PDMdJm/+w5fE/OyG6ILo1Y3e+QX4zSR0zTE= +github.com/onsi/ginkgo/v2 v2.27.5/go.mod h1:ArE1D/XhNXBXCBkKOLkbsb2c81dQHCRcF5zwn/ykDRo= +github.com/onsi/gomega v1.39.0 h1:y2ROC3hKFmQZJNFeGAMeHZKkjBL65mIZcvrLQBF9k6Q= +github.com/onsi/gomega v1.39.0/go.mod h1:ZCU1pkQcXDO5Sl9/VVEGlDyp+zm0m1cmeG5TOzLgdh4= github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs= github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= github.com/pborman/uuid v0.0.0-20170612153648-e790cca94e6c/go.mod h1:VyrYX9gd7irzKovcSS6BIIEwPRkP2Wm2m9ufcdFSJ34= @@ -245,23 +275,21 @@ github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prashantv/gostub v1.1.0 h1:BTyx3RfQjRHnUWaGF9oQos79AlQ5k8WNktv7VGvVH4g= -github.com/prashantv/gostub v1.1.0/go.mod h1:A5zLQHz7ieHGG7is6LLXLz7I8+3LZzsrV0P1IAHhP5U= -github.com/prometheus/client_golang v1.22.0 h1:rb93p9lokFEsctTys46VnV1kLCDpVZ0a/Y92Vm0Zc6Q= -github.com/prometheus/client_golang v1.22.0/go.mod h1:R7ljNsLXhuQXYZYtw6GAE9AZg8Y7vEW5scdCXrWRXC0= +github.com/prometheus/client_golang v1.23.2 h1:Je96obch5RDVy3FDMndoUsjAhG5Edi49h0RJWRi/o0o= +github.com/prometheus/client_golang v1.23.2/go.mod h1:Tb1a6LWHB3/SPIzCoaDXI4I8UHKeFTEQ1YCr+0Gyqmg= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.62.0 h1:xasJaQlnWAeyHdUBeGjXmutelfJHWMRr+Fg4QszZ2Io= -github.com/prometheus/common v0.62.0/go.mod h1:vyBcEuLSvWos9B1+CyL7JZ2up+uFzXhkqml0W5zIY1I= -github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= -github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= +github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk= +github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE= +github.com/prometheus/common v0.66.1 h1:h5E0h5/Y8niHc5DlaLlWLArTQI7tMrsfQjHV+d9ZoGs= +github.com/prometheus/common v0.66.1/go.mod h1:gcaUsgf3KfRSwHY4dIMXLPV0K/Wg1oZ8+SbZk/HH/dA= +github.com/prometheus/procfs v0.16.1 h1:hZ15bTNuirocR6u0JZ6BAHHmwS1p8B4P6MRqxtzMyRg= +github.com/prometheus/procfs v0.16.1/go.mod h1:teAbpZRB1iIAJYREa1LsoWUXykVXA1KlTmWl8x/U+Is= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= -github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= +github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= +github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/rwcarlsen/goexif v0.0.0-20190401172101-9e8deecbddbd/go.mod h1:hPqNNc0+uJM6H+SuU8sEs5K5IQeKccPqeSjfgcKGgPk= github.com/sagikazarmark/locafero v0.7.0 h1:5MqpDsTGNDhY8sGp0Aowyf0qKsPrhewaLSsFaodPcyo= @@ -278,10 +306,11 @@ github.com/spf13/afero v1.14.0 h1:9tH6MapGnn/j0eb0yIXiLjERO8RB6xIVZRDCX7PtqWA= github.com/spf13/afero v1.14.0/go.mod h1:acJQ8t0ohCGuMN3O+Pv0V0hgMxNYDlvdk+VTfyZmbYo= github.com/spf13/cast v1.7.1 h1:cuNEagBQEHWN1FnbGEjCXL2szYEXqfJPbP2HNUaca9Y= github.com/spf13/cast v1.7.1/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= -github.com/spf13/cobra v1.9.1 h1:CXSaggrXdbHK9CF+8ywj8Amf7PBRmPCOJugH954Nnlo= -github.com/spf13/cobra v1.9.1/go.mod h1:nDyEzZ8ogv936Cinf6g1RU9MRY64Ir93oCnqb9wxYW0= -github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o= -github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/cobra v1.10.0 h1:a5/WeUlSDCvV5a45ljW2ZFtV0bTDpkfSAj3uqB6Sc+0= +github.com/spf13/cobra v1.10.0/go.mod h1:9dhySC7dnTtEiqzmqfkLj47BslqLCUPMXjG2lj/NgoE= +github.com/spf13/pflag v1.0.8/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/pflag v1.0.9 h1:9exaQaMOCwffKiiiYk6/BndUBv+iRViNW+4lEMi0PvY= +github.com/spf13/pflag v1.0.9/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/viper v1.20.0 h1:zrxIyR3RQIOsarIrgL8+sAvALXul9jeEPa06Y0Ph6vY= github.com/spf13/viper v1.20.0/go.mod h1:P9Mdzt1zoHIG8m2eZQinpiBjo6kCmZSKBClNNqjJvu4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= @@ -292,41 +321,51 @@ github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81P github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= -github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= +github.com/tidwall/gjson v1.18.0 h1:FIDeeyB800efLX89e5a8Y0BNH+LOngJyGrIWxG2FKQY= +github.com/tidwall/gjson v1.18.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= +github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= +github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= +github.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4= +github.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= +github.com/tidwall/sjson v1.2.5 h1:kLy8mja+1c9jlljvWTlSazM7cKDRfJuR/bOJhcY5NcY= +github.com/tidwall/sjson v1.2.5/go.mod h1:Fvgq9kS/6ociJEDnK0Fk1cpYF4FIW6ZF7LAe+6jwd28= github.com/vincent-petithory/dataurl v1.0.0 h1:cXw+kPto8NLuJtlMsI152irrVw9fRDX8AbShPRpg2CI= github.com/vincent-petithory/dataurl v1.0.0/go.mod h1:FHafX5vmDzyP+1CQATJn7WFKc9CvnvxyvZy6I1MrG/U= github.com/vmware/vmw-guestinfo v0.0.0-20170707015358-25eff159a728/go.mod h1:x9oS4Wk2s2u4tS29nEaDLdzvuHdB19CvSGJjPgkZJNk= github.com/vmware/vmw-ovflib v0.0.0-20170608004843-1f217b9dc714/go.mod h1:jiPk45kn7klhByRvUq5i2vo1RtHKBHj+iWGFpxbXuuI= -github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM= +github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -go.mongodb.org/mongo-driver v1.17.2 h1:gvZyk8352qSfzyZ2UMWcpDpMSGEr1eqE4T793SqyhzM= -go.mongodb.org/mongo-driver v1.17.2/go.mod h1:Hy04i7O2kC4RS06ZrhPRqj/u4DTYkFDAAccj+rVKqgQ= +go.mongodb.org/mongo-driver v1.17.6 h1:87JUG1wZfWsr6rIz3ZmpH90rL5tea7O3IHuSwHUpsss= +go.mongodb.org/mongo-driver v1.17.6/go.mod h1:Hy04i7O2kC4RS06ZrhPRqj/u4DTYkFDAAccj+rVKqgQ= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= -go.opentelemetry.io/otel v1.35.0 h1:xKWKPxrxB6OtMCbmMY021CqC45J+3Onta9MqjhnusiQ= -go.opentelemetry.io/otel v1.35.0/go.mod h1:UEqy8Zp11hpkUrL73gSlELM0DupHoiq72dR+Zqel/+Y= -go.opentelemetry.io/otel/metric v1.35.0 h1:0znxYu2SNyuMSQT4Y9WDWej0VpcsxkuklLa4/siN90M= -go.opentelemetry.io/otel/metric v1.35.0/go.mod h1:nKVFgxBZ2fReX6IlyW28MgZojkoAkJGaE8CpgeAU3oE= -go.opentelemetry.io/otel/sdk v1.24.0 h1:YMPPDNymmQN3ZgczicBY3B6sf9n62Dlj9pWD3ucgoDw= -go.opentelemetry.io/otel/sdk v1.24.0/go.mod h1:KVrIYw6tEubO9E96HQpcmpTKDVn9gdv35HoYiQWGDFg= -go.opentelemetry.io/otel/trace v1.35.0 h1:dPpEfJu1sDIqruz7BHFG3c7528f6ddfSWfFDVt/xgMs= -go.opentelemetry.io/otel/trace v1.35.0/go.mod h1:WUk7DtFp1Aw2MkvqGdwiXYDZZNvA/1J8o6xRXLrIkyc= -go.uber.org/automaxprocs v1.6.0 h1:O3y2/QNTOdbF+e/dpXNNW7Rx2hZ4sTIPyybbxyNqTUs= -go.uber.org/automaxprocs v1.6.0/go.mod h1:ifeIMSnPZuznNm6jmdzmU3/bfk01Fe2fotchwEFJ8r8= -go.uber.org/goleak v1.2.1 h1:NBol2c7O1ZokfZ0LEU9K6Whx/KnwvepVetCUhtKja4A= -go.uber.org/goleak v1.2.1/go.mod h1:qlT2yGI9QafXHhZZLxlSuNsMw3FFLxBr+tBRlmO1xH4= +go.opentelemetry.io/otel v1.36.0 h1:UumtzIklRBY6cI/lllNZlALOF5nNIzJVb16APdvgTXg= +go.opentelemetry.io/otel v1.36.0/go.mod h1:/TcFMXYjyRNh8khOAO9ybYkqaDBb/70aVwkNML4pP8E= +go.opentelemetry.io/otel/metric v1.36.0 h1:MoWPKVhQvJ+eeXWHFBOPoBOi20jh6Iq2CcCREuTYufE= +go.opentelemetry.io/otel/metric v1.36.0/go.mod h1:zC7Ks+yeyJt4xig9DEw9kuUFe5C3zLbVjV2PzT6qzbs= +go.opentelemetry.io/otel/sdk v1.36.0 h1:b6SYIuLRs88ztox4EyrvRti80uXIFy+Sqzoh9kFULbs= +go.opentelemetry.io/otel/sdk v1.36.0/go.mod h1:+lC+mTgD+MUWfjJubi2vvXWcVxyr9rmlshZni72pXeY= +go.opentelemetry.io/otel/trace v1.36.0 h1:ahxWNuqZjpdiFAyrIoQ4GIiAIhxAunQR6MUoKrsNd4w= +go.opentelemetry.io/otel/trace v1.36.0/go.mod h1:gQ+OnDZzrybY4k4seLzPAWNwVBBVlF2szhehOBB/tGA= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= -go.uber.org/zap v1.25.0 h1:4Hvk6GtkucQ790dqmj7l1eEnRdKm3k3ZUrUMS2d5+5c= -go.uber.org/zap v1.25.0/go.mod h1:JIAUzQIH94IC4fOJQm7gMmBJP5k7wQfdcnYdPoEXJYk= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +go.yaml.in/yaml/v2 v2.4.3 h1:6gvOSjQoTB3vt1l+CU+tSyi/HOjfOjRLJ4YwYZGwRO0= +go.yaml.in/yaml/v2 v2.4.3/go.mod h1:zSxWcmIDjOzPXpjlTTbAsKokqkDNAVtZO0WOMiT90s8= +go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= +go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= go4.org v0.0.0-20160314031811-03efcb870d84/go.mod h1:MkTOUMDaeVYJUOUsaDXIhWPZYa1yOyC1qaOBpL57BhE= go4.org v0.0.0-20201209231011-d4a079459e60/go.mod h1:CIiUVy99QCPfoE13bO4EZaz5GZMZXMSBGhxRdsvzbkg= go4.org v0.0.0-20230225012048-214862532bf5 h1:nifaUDeh+rPaBCMPMQHZmvJf+QdpLFnuQPwx+LxVmtc= @@ -335,10 +374,9 @@ golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACk golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.37.0 h1:kJNSjF/Xp7kU0iB2Z+9viTPMW4EqqsrywMXLJOOsXSE= -golang.org/x/crypto v0.37.0/go.mod h1:vg+k43peMZ0pUMhYmVAWysMK35e6ioLh3wB8ZCAfbVc= +golang.org/x/crypto v0.45.0 h1:jMBrvKuj23MTlT0bQEOBcAE0mjg8mK9RXFhRH6nyF3Q= +golang.org/x/crypto v0.45.0/go.mod h1:XTGrrkGJve7CYK7J8PEww4aY7gM3qMCElcJQ8n8JdX4= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -347,8 +385,6 @@ golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= -golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 h1:R84qjqJb5nVJMxqWYb3np9L5ZsaDtB+a39EqjV0JSUM= -golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0/go.mod h1:S9Xr4PYopiDyqSyp5NjCrhFrqg6A5zA2E/iPHPhqnS8= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -366,8 +402,9 @@ golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKG golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.29.0 h1:HV8lRxZC4l2cr3Zq1LvtOsi/ThTgWnUk/y64QSs8GwA= +golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -383,30 +420,27 @@ golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.39.0 h1:ZCu7HMWDxpXpaiKdhzIfaltL9Lp31x/3fCP11bc6/fY= -golang.org/x/net v0.39.0/go.mod h1:X7NRbYVEA+ewNkCNyJ513WmMdQ3BineSwVtN2zD/d+E= +golang.org/x/net v0.47.0 h1:Mx+4dIFzqraBXUugkia1OOvlD6LemFo1ALMHjrXDOhY= +golang.org/x/net v0.47.0/go.mod h1:/jNxtkgq5yWUGYkaZGqo27cfGZ1c5Nen03aYrrKpVRU= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.29.0 h1:WdYw2tdTK1S8olAzWHdgeqfy+Mtm9XNhv/xJsY65d98= -golang.org/x/oauth2 v0.29.0/go.mod h1:onh5ek6nERTohokkhCD/y2cV4Do3fxFHFuAejCkRWT8= +golang.org/x/oauth2 v0.30.0 h1:dnDm7JmhM45NNpd8FDDeLhK6FwqbOf4MLCM9zb1BOHI= +golang.org/x/oauth2 v0.30.0/go.mod h1:B++QgG3ZKulg6sRPGD/mqlHQs5rB3Ml9erfeDY7xKlU= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.13.0 h1:AauUjRAJ9OSnvULf/ARrrVywoJDy0YS2AwQ98I37610= -golang.org/x/sync v0.13.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= +golang.org/x/sync v0.18.0 h1:kr88TuHDroi+UVf+0hZnirlk8o8T+4MrK6mr60WkH/I= +golang.org/x/sync v0.18.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -420,20 +454,19 @@ golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.32.0 h1:s77OFDvIQeibCmezSnk/q6iAfkdiQaJi4VzroCFrN20= -golang.org/x/sys v0.32.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +golang.org/x/sys v0.38.0 h1:3yZWxaJjBmCWXqhN1qh02AkOnCQ1poK6oF+a7xWL6Gc= +golang.org/x/sys v0.38.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= -golang.org/x/term v0.31.0 h1:erwDkOK1Msy6offm1mOgvspSkslFnIGsFnxOKoufg3o= -golang.org/x/term v0.31.0/go.mod h1:R4BeIy7D95HzImkxGkTW1UQTtP54tio2RyHz7PwK0aw= +golang.org/x/term v0.37.0 h1:8EGAD0qCmHYZg6J17DvsMy9/wJ7/D/4pV/wfnld5lTU= +golang.org/x/term v0.37.0/go.mod h1:5pB4lxRNYYVZuTLmy8oR2BH8dflOR+IbTYFD8fi3254= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -441,8 +474,8 @@ golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.24.0 h1:dd5Bzh4yt5KYA8f9CJHCP4FB4D51c2c6JvN37xJJkJ0= -golang.org/x/text v0.24.0/go.mod h1:L8rBsPeo2pSS+xqN0d5u2ikmjtmoJbDBT1b7nHvFCdU= +golang.org/x/text v0.31.0 h1:aC8ghyu4JhP8VojJ2lEHBnochRno1sgL6nEi9WGFGMM= +golang.org/x/text v0.31.0/go.mod h1:tKRAlv61yKIjGGHX/4tP1LTbc13YSec1pxVEWXzfoeM= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.11.0 h1:/bpjEDfN9tkoN/ryeYHnv5hcMlc8ncjMcM4XBk5NWV0= @@ -472,15 +505,12 @@ golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapK golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.32.0 h1:Q7N1vhpkQv7ybVzLFtTjvQya2ewbwNDZzUgfXGqtMWU= -golang.org/x/tools v0.32.0/go.mod h1:ZxrU41P/wAbZD8EDa6dDCa6XfpkhJ7HFMjHJXfBDu8s= +golang.org/x/tools v0.38.0 h1:Hx2Xv8hISq8Lm16jvBZ2VQf+RLmbd7wVUsALibYI/IQ= +golang.org/x/tools v0.38.0/go.mod h1:yEsQ/d/YK8cjh0L6rZlY8tgtlKiBNTL14pGDJPJpYQs= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= gomodules.xyz/jsonpatch/v2 v2.4.0 h1:Ci3iUJyx9UeRx7CeFN8ARgGbkESwJK+KB9lLcWxY/Zw= gomodules.xyz/jsonpatch/v2 v2.4.0/go.mod h1:AH3dM2RI6uoBZxn3LVrfvJ3E0/9dG4cSrbuBJT4moAY= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= @@ -516,18 +546,18 @@ google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyac google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY= -google.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= +google.golang.org/protobuf v1.36.8 h1:xHScyCOEuuwZEc6UtSOvPbAT4zRh0xcNRYekJwfqyMc= +google.golang.org/protobuf v1.36.8/go.mod h1:fuxRtAxBytpl4zzqUh6/eyUujkJdNiuEkXntxiD/uRU= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/evanphx/json-patch.v4 v4.13.0 h1:czT3CmqEaQ1aanPc5SdlgQrrEIb8w/wwCvWWnfEbYzo= +gopkg.in/evanphx/json-patch.v4 v4.13.0/go.mod h1:p8EYWUEYMpynmqDbY58zCKCFZw8pRWMG4EsWvDvM72M= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= @@ -538,30 +568,30 @@ honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -k8s.io/api v0.29.3 h1:2ORfZ7+bGC3YJqGpV0KSDDEVf8hdGQ6A03/50vj8pmw= -k8s.io/api v0.29.3/go.mod h1:y2yg2NTyHUUkIoTC+phinTnEa3KFM6RZ3szxt014a80= -k8s.io/apiextensions-apiserver v0.29.0 h1:0VuspFG7Hj+SxyF/Z/2T0uFbI5gb5LRgEyUVE3Q4lV0= -k8s.io/apiextensions-apiserver v0.29.0/go.mod h1:TKmpy3bTS0mr9pylH0nOt/QzQRrW7/h7yLdRForMZwc= -k8s.io/apimachinery v0.29.3 h1:2tbx+5L7RNvqJjn7RIuIKu9XTsIZ9Z5wX2G22XAa5EU= -k8s.io/apimachinery v0.29.3/go.mod h1:hx/S4V2PNW4OMg3WizRrHutyB5la0iCUbZym+W0EQIU= -k8s.io/client-go v0.29.3 h1:R/zaZbEAxqComZ9FHeQwOh3Y1ZUs7FaHKZdQtIc2WZg= -k8s.io/client-go v0.29.3/go.mod h1:tkDisCvgPfiRpxGnOORfkljmS+UrW+WtXAy2fTvXJB0= -k8s.io/component-base v0.29.0 h1:T7rjd5wvLnPBV1vC4zWd/iWRbV8Mdxs+nGaoaFzGw3s= -k8s.io/component-base v0.29.0/go.mod h1:sADonFTQ9Zc9yFLghpDpmNXEdHyQmFIGbiuZbqAXQ1M= +k8s.io/api v0.35.0 h1:iBAU5LTyBI9vw3L5glmat1njFK34srdLmktWwLTprlY= +k8s.io/api v0.35.0/go.mod h1:AQ0SNTzm4ZAczM03QH42c7l3bih1TbAXYo0DkF8ktnA= +k8s.io/apiextensions-apiserver v0.35.0 h1:3xHk2rTOdWXXJM+RDQZJvdx0yEOgC0FgQ1PlJatA5T4= +k8s.io/apiextensions-apiserver v0.35.0/go.mod h1:E1Ahk9SADaLQ4qtzYFkwUqusXTcaV2uw3l14aqpL2LU= +k8s.io/apimachinery v0.35.0 h1:Z2L3IHvPVv/MJ7xRxHEtk6GoJElaAqDCCU0S6ncYok8= +k8s.io/apimachinery v0.35.0/go.mod h1:jQCgFZFR1F4Ik7hvr2g84RTJSZegBc8yHgFWKn//hns= +k8s.io/client-go v0.35.0 h1:IAW0ifFbfQQwQmga0UdoH0yvdqrbwMdq9vIFEhRpxBE= +k8s.io/client-go v0.35.0/go.mod h1:q2E5AAyqcbeLGPdoRB+Nxe3KYTfPce1Dnu1myQdqz9o= k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk= k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= -k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340 h1:BZqlfIlq5YbRMFko6/PM7FjZpUb45WallggurYhKGag= -k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340/go.mod h1:yD4MZYeKMBwQKVht279WycxKyM84kkAx2DPrTXaeb98= -k8s.io/utils v0.0.0-20240711033017-18e509b52bc8 h1:pUdcCO1Lk/tbT5ztQWOBi5HBgbBP1J8+AsQnQCKsi8A= -k8s.io/utils v0.0.0-20240711033017-18e509b52bc8/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +k8s.io/kube-openapi v0.0.0-20250910181357-589584f1c912 h1:Y3gxNAuB0OBLImH611+UDZcmKS3g6CthxToOb37KgwE= +k8s.io/kube-openapi v0.0.0-20250910181357-589584f1c912/go.mod h1:kdmbQkyfwUagLfXIad1y2TdrjPFWp2Q89B3qkRwf/pQ= +k8s.io/utils v0.0.0-20251002143259-bc988d571ff4 h1:SjGebBtkBqHFOli+05xYbK8YF1Dzkbzn+gDM4X9T4Ck= +k8s.io/utils v0.0.0-20251002143259-bc988d571ff4/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= -sigs.k8s.io/controller-runtime v0.16.5 h1:yr1cEJbX08xsTW6XEIzT13KHHmIyX8Umvme2cULvFZw= -sigs.k8s.io/controller-runtime v0.16.5/go.mod h1:j7bialYoSn142nv9sCOJmQgDXQXxnroFU4VnX/brVJ0= -sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3 h1:/Rv+M11QRah1itp8VhT6HoVx1Ray9eB4DBr+K+/sCJ8= -sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3/go.mod h1:18nIHnGi6636UCz6m8i4DhaJ65T6EruyzmoQqI2BVDo= -sigs.k8s.io/structured-merge-diff/v4 v4.4.1 h1:150L+0vs/8DA78h1u02ooW1/fFq/Lwr+sGiqlzvrtq4= -sigs.k8s.io/structured-merge-diff/v4 v4.4.1/go.mod h1:N8hJocpFajUSSeSJ9bOZ77VzejKZaXsTtZo4/u7Io08= -sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E= -sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY= +sigs.k8s.io/controller-runtime v0.23.0 h1:Ubi7klJWiwEWqDY+odSVZiFA0aDSevOCXpa38yCSYu8= +sigs.k8s.io/controller-runtime v0.23.0/go.mod h1:DBOIr9NsprUqCZ1ZhsuJ0wAnQSIxY/C6VjZbmLgw0j0= +sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730 h1:IpInykpT6ceI+QxKBbEflcR5EXP7sU1kvOlxwZh5txg= +sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730/go.mod h1:mdzfpAEoE6DHQEN0uh9ZbOCuHbLK5wOm7dK4ctXE9Tg= +sigs.k8s.io/randfill v1.0.0 h1:JfjMILfT8A6RbawdsK2JXGBR5AQVfd+9TbzrlneTyrU= +sigs.k8s.io/randfill v1.0.0/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY= +sigs.k8s.io/structured-merge-diff/v6 v6.3.0 h1:jTijUJbW353oVOd9oTlifJqOGEkUw2jB/fXCbTiQEco= +sigs.k8s.io/structured-merge-diff/v6 v6.3.0/go.mod h1:M3W8sfWvn2HhQDIbGWj3S099YozAsymCo/wrT5ohRUE= +sigs.k8s.io/yaml v1.6.0 h1:G8fkbMSAFqgEFgh4b1wmtzDnioxFCUgTZhlbj5P9QYs= +sigs.k8s.io/yaml v1.6.0/go.mod h1:796bPqUfzR/0jLAl6XjHl3Ck7MiyVv8dbTdyT3/pMf4= From c80a36aea5a83552349a1272521ceb541031258c Mon Sep 17 00:00:00 2001 From: Gerrit Date: Fri, 23 Jan 2026 11:27:55 +0100 Subject: [PATCH 02/11] Typos. --- README.md | 2 +- controllers/firewall/reconcile.go | 2 +- controllers/revision_test.go | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 27c45bc..9d8e513 100644 --- a/README.md +++ b/README.md @@ -43,7 +43,7 @@ kubectl annotate fwmon firewall.metal-stack.io/roll-set=true ## Development -Most of the functionality is developed with the help of the [intgration](integration) test suite. +Most of the functionality is developed with the help of the [integration](integration) test suite. To play with the FCM, you can also run this controller inside the [mini-lab](https://github.com/metal-stack/mini-lab) and without a running Gardener installation: diff --git a/controllers/firewall/reconcile.go b/controllers/firewall/reconcile.go index 89c07bc..5550438 100644 --- a/controllers/firewall/reconcile.go +++ b/controllers/firewall/reconcile.go @@ -46,7 +46,7 @@ func (c *controller) Reconcile(r *controllers.Ctx[*v2.Firewall]) error { return err } - // requeueing in order to continue checking progression + // requeuing in order to continue checking progression return controllers.RequeueAfter(10*time.Second, "firewall creation is progressing") case 1: f = fws[0] diff --git a/controllers/revision_test.go b/controllers/revision_test.go index 3238188..f775809 100644 --- a/controllers/revision_test.go +++ b/controllers/revision_test.go @@ -188,7 +188,7 @@ func TestExcept(t *testing.T) { want []*v2.FirewallSet }{ { - name: "exlclude middle", + name: "exclude middle", sets: []*v2.FirewallSet{ {ObjectMeta: v1.ObjectMeta{UID: types.UID("1")}}, {ObjectMeta: v1.ObjectMeta{UID: types.UID("2")}}, @@ -203,7 +203,7 @@ func TestExcept(t *testing.T) { }, }, { - name: "exlclude two resources", + name: "exclude two resources", sets: []*v2.FirewallSet{ {ObjectMeta: v1.ObjectMeta{UID: types.UID("1")}}, {ObjectMeta: v1.ObjectMeta{UID: types.UID("2")}}, From 52da96f4e333158a07689abce3121cd32b72e639 Mon Sep 17 00:00:00 2001 From: Gerrit Date: Fri, 23 Jan 2026 11:28:34 +0100 Subject: [PATCH 03/11] Checkout. --- .github/workflows/docker.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/docker.yaml b/.github/workflows/docker.yaml index 07c5a0e..6b42cde 100644 --- a/.github/workflows/docker.yaml +++ b/.github/workflows/docker.yaml @@ -65,7 +65,7 @@ jobs: steps: - name: Checkout - uses: actions/checkout@v5 + uses: actions/checkout@v6 - name: Setup Go uses: actions/setup-go@v5 From 3c556b8dc10df56923b3668bf614dcc92cf2b121 Mon Sep 17 00:00:00 2001 From: Gerrit Date: Fri, 23 Jan 2026 11:43:57 +0100 Subject: [PATCH 04/11] Linter. --- controllers/deployment/controller.go | 6 +++--- controllers/deployment/delete.go | 2 +- controllers/deployment/reconcile.go | 2 +- controllers/deployment/recreate.go | 2 +- controllers/deployment/rolling.go | 2 +- controllers/firewall/controller.go | 6 +++--- controllers/firewall/delete.go | 2 +- controllers/firewall/reconcile.go | 2 +- controllers/set/controller.go | 6 +++--- controllers/set/delete.go | 2 +- controllers/set/reconcile.go | 2 +- controllers/set/suite_test.go | 2 +- controllers/update/controller.go | 6 +++--- integration/suite_test.go | 8 ++++---- main.go | 8 ++++---- 15 files changed, 29 insertions(+), 29 deletions(-) diff --git a/controllers/deployment/controller.go b/controllers/deployment/controller.go index cfc0e04..2730670 100644 --- a/controllers/deployment/controller.go +++ b/controllers/deployment/controller.go @@ -4,7 +4,7 @@ import ( "time" "github.com/go-logr/logr" - "k8s.io/client-go/tools/record" + "k8s.io/client-go/tools/events" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/builder" "sigs.k8s.io/controller-runtime/pkg/predicate" @@ -20,10 +20,10 @@ type controller struct { c *config.ControllerConfig log logr.Logger lastSetCreation map[string]time.Time - recorder record.EventRecorder + recorder events.EventRecorder } -func SetupWithManager(log logr.Logger, recorder record.EventRecorder, mgr ctrl.Manager, c *config.ControllerConfig) error { +func SetupWithManager(log logr.Logger, recorder events.EventRecorder, mgr ctrl.Manager, c *config.ControllerConfig) error { g := controllers.NewGenericController(log, c.GetSeedClient(), c.GetSeedNamespace(), &controller{ c: c, log: log, diff --git a/controllers/deployment/delete.go b/controllers/deployment/delete.go index 646ffcf..7ddbcc3 100644 --- a/controllers/deployment/delete.go +++ b/controllers/deployment/delete.go @@ -35,7 +35,7 @@ func (c *controller) deleteFirewallSets(r *controllers.Ctx[*v2.FirewallDeploymen r.Log.Info("set deletion timestamp on firewall set", "set-name", set.Name) - c.recorder.Eventf(set, "Normal", "Delete", "deleted firewallset %s", set.Name) + c.recorder.Eventf(set, nil, "Normal", "Delete", "deleted firewallset %s", set.Name) } if len(sets) > 0 { diff --git a/controllers/deployment/reconcile.go b/controllers/deployment/reconcile.go index fa6adaa..ef9c981 100644 --- a/controllers/deployment/reconcile.go +++ b/controllers/deployment/reconcile.go @@ -217,7 +217,7 @@ func (c *controller) syncFirewallSet(r *controllers.Ctx[*v2.FirewallDeployment], cond := v2.NewCondition(v2.FirewallDeplomentProgressing, v2.ConditionTrue, "FirewallSetUpdated", fmt.Sprintf("Updated firewall set %q.", set.Name)) r.Target.Status.Conditions.Set(cond) - c.recorder.Eventf(set, "Normal", "Update", "updated firewallset %s", set.Name) + c.recorder.Eventf(set, nil, "Normal", "Update", "updated firewallset %s", set.Name) return nil } diff --git a/controllers/deployment/recreate.go b/controllers/deployment/recreate.go index b7b5322..bc52149 100644 --- a/controllers/deployment/recreate.go +++ b/controllers/deployment/recreate.go @@ -21,7 +21,7 @@ func (c *controller) recreateStrategy(r *controllers.Ctx[*v2.FirewallDeployment] return err } - c.recorder.Eventf(set, "Normal", "Recreate", "recreated firewallset old: %s new: %s", latestSet.Name, set.Name) + c.recorder.Eventf(set, nil, "Normal", "Recreate", "recreated firewallset old: %s new: %s", latestSet.Name, set.Name) latestSet = set } diff --git a/controllers/deployment/rolling.go b/controllers/deployment/rolling.go index 5a5e08a..07de9f6 100644 --- a/controllers/deployment/rolling.go +++ b/controllers/deployment/rolling.go @@ -20,7 +20,7 @@ func (c *controller) rollingUpdateStrategy(r *controllers.Ctx[*v2.FirewallDeploy return err } - c.recorder.Eventf(newSet, "Normal", "Create", "created firewallset %s", newSet.Name) + c.recorder.Eventf(newSet, nil, "Normal", "Create", "created firewallset %s", newSet.Name) ownedSets = append(ownedSets, newSet) diff --git a/controllers/firewall/controller.go b/controllers/firewall/controller.go index ff0d548..1d1879a 100644 --- a/controllers/firewall/controller.go +++ b/controllers/firewall/controller.go @@ -8,7 +8,7 @@ import ( "time" "github.com/go-logr/logr" - "k8s.io/client-go/tools/record" + "k8s.io/client-go/tools/events" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/builder" "sigs.k8s.io/controller-runtime/pkg/predicate" @@ -27,12 +27,12 @@ import ( type controller struct { c *config.ControllerConfig log logr.Logger - recorder record.EventRecorder + recorder events.EventRecorder networkCache *cache.Cache[string, *models.V1NetworkResponse] firewallCache *cache.Cache[*v2.Firewall, []*models.V1FirewallResponse] } -func SetupWithManager(log logr.Logger, recorder record.EventRecorder, mgr ctrl.Manager, c *config.ControllerConfig) error { +func SetupWithManager(log logr.Logger, recorder events.EventRecorder, mgr ctrl.Manager, c *config.ControllerConfig) error { g := controllers.NewGenericController(log, c.GetSeedClient(), c.GetSeedNamespace(), &controller{ log: log, recorder: recorder, diff --git a/controllers/firewall/delete.go b/controllers/firewall/delete.go index eeac8a0..e1b3493 100644 --- a/controllers/firewall/delete.go +++ b/controllers/firewall/delete.go @@ -48,7 +48,7 @@ func (c *controller) Delete(r *controllers.Ctx[*v2.Firewall]) error { r.Log.Info("deleted firewall", "firewall-name", f.Name, "id", *resp.Payload.ID) - c.recorder.Eventf(r.Target, "Normal", "Delete", "deleted firewall %s id %s", r.Target.Name, *resp.Payload.ID) + c.recorder.Eventf(r.Target, nil, "Normal", "Delete", "deleted firewall %s id %s", r.Target.Name, *resp.Payload.ID) } return nil diff --git a/controllers/firewall/reconcile.go b/controllers/firewall/reconcile.go index 5550438..6b03f1a 100644 --- a/controllers/firewall/reconcile.go +++ b/controllers/firewall/reconcile.go @@ -171,7 +171,7 @@ func (c *controller) createFirewall(r *controllers.Ctx[*v2.Firewall]) (*models.V cond := v2.NewCondition(v2.FirewallCreated, v2.ConditionTrue, "Created", fmt.Sprintf("Firewall %q created successfully.", pointer.SafeDeref(pointer.SafeDeref(resp.Payload.Allocation).Name))) r.Target.Status.Conditions.Set(cond) - c.recorder.Eventf(r.Target, "Normal", "Create", "created firewall %s id %s", r.Target.Name, pointer.SafeDeref(resp.Payload.ID)) + c.recorder.Eventf(r.Target, nil, "Normal", "Create", "created firewall %s id %s", r.Target.Name, pointer.SafeDeref(resp.Payload.ID)) return resp.Payload, nil } diff --git a/controllers/set/controller.go b/controllers/set/controller.go index 126930f..c0d9086 100644 --- a/controllers/set/controller.go +++ b/controllers/set/controller.go @@ -7,7 +7,7 @@ import ( "github.com/metal-stack/firewall-controller-manager/api/v2/defaults" "github.com/metal-stack/firewall-controller-manager/api/v2/validation" "github.com/metal-stack/firewall-controller-manager/controllers" - "k8s.io/client-go/tools/record" + "k8s.io/client-go/tools/events" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/builder" "sigs.k8s.io/controller-runtime/pkg/predicate" @@ -15,11 +15,11 @@ import ( type controller struct { log logr.Logger - recorder record.EventRecorder + recorder events.EventRecorder c *config.ControllerConfig } -func SetupWithManager(log logr.Logger, recorder record.EventRecorder, mgr ctrl.Manager, c *config.ControllerConfig) error { +func SetupWithManager(log logr.Logger, recorder events.EventRecorder, mgr ctrl.Manager, c *config.ControllerConfig) error { g := controllers.NewGenericController(log, c.GetSeedClient(), c.GetSeedNamespace(), &controller{ log: log, recorder: recorder, diff --git a/controllers/set/delete.go b/controllers/set/delete.go index 8843ff4..30cac7e 100644 --- a/controllers/set/delete.go +++ b/controllers/set/delete.go @@ -36,7 +36,7 @@ func (c *controller) deleteFirewalls(r *controllers.Ctx[*v2.FirewallSet], fws .. r.Log.Info("set deletion timestamp on firewall", "firewall-name", fw.Name) - c.recorder.Eventf(fw, "Normal", "Delete", "deleted firewall %s", fw.Name) + c.recorder.Eventf(fw, nil, "Normal", "Delete", "deleted firewall %s", fw.Name) } if len(fws) > 0 { diff --git a/controllers/set/reconcile.go b/controllers/set/reconcile.go index c48d958..17e6a27 100644 --- a/controllers/set/reconcile.go +++ b/controllers/set/reconcile.go @@ -89,7 +89,7 @@ func (c *controller) Reconcile(r *controllers.Ctx[*v2.FirewallSet]) error { r.Log.Info("firewall created", "firewall-name", fw.Name) - c.recorder.Eventf(r.Target, "Normal", "Create", "created firewall %s", fw.Name) + c.recorder.Eventf(r.Target, nil, "Normal", "Create", "created firewall %s", fw.Name) ownedFirewalls = append(ownedFirewalls, fw) } diff --git a/controllers/set/suite_test.go b/controllers/set/suite_test.go index 7804107..85971fe 100644 --- a/controllers/set/suite_test.go +++ b/controllers/set/suite_test.go @@ -123,7 +123,7 @@ var _ = BeforeSuite(func() { err = set.SetupWithManager( ctrl.Log.WithName("controllers").WithName("set"), - mgr.GetEventRecorderFor("firewall-set-controller"), + mgr.GetEventRecorder("firewall-set-controller"), mgr, cc, ) diff --git a/controllers/update/controller.go b/controllers/update/controller.go index 991adde..44fa59c 100644 --- a/controllers/update/controller.go +++ b/controllers/update/controller.go @@ -5,7 +5,7 @@ import ( "time" "github.com/go-logr/logr" - "k8s.io/client-go/tools/record" + "k8s.io/client-go/tools/events" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/builder" "sigs.k8s.io/controller-runtime/pkg/predicate" @@ -22,11 +22,11 @@ import ( type controller struct { c *config.ControllerConfig log logr.Logger - recorder record.EventRecorder + recorder events.EventRecorder imageCache *cache.Cache[string, *models.V1ImageResponse] } -func SetupWithManager(log logr.Logger, recorder record.EventRecorder, mgr ctrl.Manager, c *config.ControllerConfig) error { +func SetupWithManager(log logr.Logger, recorder events.EventRecorder, mgr ctrl.Manager, c *config.ControllerConfig) error { g := controllers.NewGenericController(log, c.GetSeedClient(), c.GetSeedNamespace(), &controller{ c: c, log: log, diff --git a/integration/suite_test.go b/integration/suite_test.go index 608e49f..46dcf94 100644 --- a/integration/suite_test.go +++ b/integration/suite_test.go @@ -137,7 +137,7 @@ var _ = BeforeSuite(func() { err = deployment.SetupWithManager( ctrl.Log.WithName("controllers").WithName("deployment"), - mgr.GetEventRecorderFor("firewall-deployment-controller"), + mgr.GetEventRecorder("firewall-deployment-controller"), mgr, cc, ) @@ -145,7 +145,7 @@ var _ = BeforeSuite(func() { err = set.SetupWithManager( ctrl.Log.WithName("controllers").WithName("set"), - mgr.GetEventRecorderFor("firewall-set-controller"), + mgr.GetEventRecorder("firewall-set-controller"), mgr, cc, ) @@ -153,7 +153,7 @@ var _ = BeforeSuite(func() { err = firewall.SetupWithManager( ctrl.Log.WithName("controllers").WithName("firewall"), - mgr.GetEventRecorderFor("firewall-controller"), + mgr.GetEventRecorder("firewall-controller"), mgr, cc, ) @@ -161,7 +161,7 @@ var _ = BeforeSuite(func() { err = update.SetupWithManager( ctrl.Log.WithName("controllers").WithName("update"), - mgr.GetEventRecorderFor("update-controller"), + mgr.GetEventRecorder("update-controller"), mgr, cc, ) diff --git a/main.go b/main.go index 89655ed..e68aad6 100644 --- a/main.go +++ b/main.go @@ -267,19 +267,19 @@ func main() { log.Fatalf("unable to create controller config %v", err) } - if err := deployment.SetupWithManager(ctrl.Log.WithName("controllers").WithName("deployment"), seedMgr.GetEventRecorderFor("firewall-deployment-controller"), seedMgr, cc); err != nil { + if err := deployment.SetupWithManager(ctrl.Log.WithName("controllers").WithName("deployment"), seedMgr.GetEventRecorder("firewall-deployment-controller"), seedMgr, cc); err != nil { log.Fatalf("unable to setup deployment controller: %v", err) } - if err := set.SetupWithManager(ctrl.Log.WithName("controllers").WithName("set"), seedMgr.GetEventRecorderFor("firewall-set-controller"), seedMgr, cc); err != nil { + if err := set.SetupWithManager(ctrl.Log.WithName("controllers").WithName("set"), seedMgr.GetEventRecorder("firewall-set-controller"), seedMgr, cc); err != nil { log.Fatalf("unable to setup set controller: %v", err) } - if err := firewall.SetupWithManager(ctrl.Log.WithName("controllers").WithName("firewall"), seedMgr.GetEventRecorderFor("firewall-controller"), seedMgr, cc); err != nil { + if err := firewall.SetupWithManager(ctrl.Log.WithName("controllers").WithName("firewall"), seedMgr.GetEventRecorder("firewall-controller"), seedMgr, cc); err != nil { log.Fatalf("unable to setup firewall controller: %v", err) } if err := monitor.SetupWithManager(ctrl.Log.WithName("controllers").WithName("firewall-monitor"), shootMgr, cc); err != nil { log.Fatalf("unable to setup monitor controller: %v", err) } - if err := update.SetupWithManager(ctrl.Log.WithName("controllers").WithName("update"), seedMgr.GetEventRecorderFor("update-controller"), seedMgr, cc); err != nil { + if err := update.SetupWithManager(ctrl.Log.WithName("controllers").WithName("update"), seedMgr.GetEventRecorder("update-controller"), seedMgr, cc); err != nil { log.Fatalf("unable to setup update controller: %v", err) } From e95e9cc21df5179af23b375738ed2de971a4302d Mon Sep 17 00:00:00 2001 From: Gerrit Date: Fri, 23 Jan 2026 11:52:04 +0100 Subject: [PATCH 05/11] Update tools. --- Makefile | 2 +- api/v2/types_firewall.go | 4 ++-- api/v2/types_firewalldeployment.go | 8 ++++---- api/v2/types_firewallmonitor.go | 8 ++++---- api/v2/types_firewallset.go | 8 ++++---- go.mod | 16 +++++++-------- go.sum | 32 +++++++++++++++--------------- 7 files changed, 39 insertions(+), 39 deletions(-) diff --git a/Makefile b/Makefile index 3863ccb..ff083ea 100644 --- a/Makefile +++ b/Makefile @@ -8,7 +8,7 @@ GITVERSION := $(shell git describe --long --all) BUILDDATE := $(shell date -Iseconds) VERSION := $(or ${VERSION},$(shell git describe --tags --exact-match 2> /dev/null || git symbolic-ref -q --short HEAD || git rev-parse --short HEAD)) -CONTROLLER_TOOLS_VERSION ?= v0.14.0 +CONTROLLER_TOOLS_VERSION ?= v0.20.0 LOCALBIN ?= $(shell pwd)/bin CONTROLLER_GEN ?= $(LOCALBIN)/controller-gen ENVTEST ?= $(LOCALBIN)/setup-envtest diff --git a/api/v2/types_firewall.go b/api/v2/types_firewall.go index 34b18e8..88c77df 100644 --- a/api/v2/types_firewall.go +++ b/api/v2/types_firewall.go @@ -30,12 +30,12 @@ const ( // +kubebuilder:printcolumn:name="Age",type="date",JSONPath=".status.machineStatus.allocationTimestamp" type Firewall struct { metav1.TypeMeta `json:",inline"` - metav1.ObjectMeta `json:"metadata,omitempty"` + metav1.ObjectMeta `json:"metadata"` // Spec contains the firewall specification. Spec FirewallSpec `json:"spec"` // Status contains current status information on the firewall. - Status FirewallStatus `json:"status,omitempty"` + Status FirewallStatus `json:"status"` // Distance defines the as-path length of a firewall. // This field is typically orchestrated by the deployment controller. diff --git a/api/v2/types_firewalldeployment.go b/api/v2/types_firewalldeployment.go index 69e01fa..9379b60 100644 --- a/api/v2/types_firewalldeployment.go +++ b/api/v2/types_firewalldeployment.go @@ -20,12 +20,12 @@ import ( // +kubebuilder:printcolumn:name="Age",type="date",JSONPath=".metadata.creationTimestamp" type FirewallDeployment struct { metav1.TypeMeta `json:",inline"` - metav1.ObjectMeta `json:"metadata,omitempty"` + metav1.ObjectMeta `json:"metadata"` // Spec contains the firewall deployment specification. - Spec FirewallDeploymentSpec `json:"spec,omitempty"` + Spec FirewallDeploymentSpec `json:"spec"` // Status contains current status information on the firewall deployment. - Status FirewallDeploymentStatus `json:"status,omitempty"` + Status FirewallDeploymentStatus `json:"status"` } // FirewallUpdateStrategy describes the strategy how firewalls are updated in case the update requires a physical recreation of the firewalls. @@ -93,7 +93,7 @@ const ( // +kubebuilder:object:root=true type FirewallDeploymentList struct { metav1.TypeMeta `json:",inline"` - metav1.ListMeta `json:"metadata,omitempty"` + metav1.ListMeta `json:"metadata"` // Items contains the list items. Items []FirewallDeployment `json:"items"` diff --git a/api/v2/types_firewallmonitor.go b/api/v2/types_firewallmonitor.go index d9bddc6..25f302e 100644 --- a/api/v2/types_firewallmonitor.go +++ b/api/v2/types_firewallmonitor.go @@ -24,7 +24,7 @@ const ( // which are deployed into the seed cluster's shoot namespace. type FirewallMonitor struct { metav1.TypeMeta `json:",inline"` - metav1.ObjectMeta `json:"metadata,omitempty"` + metav1.ObjectMeta `json:"metadata"` // Size is the machine size of the firewall. Size string `json:"size"` @@ -57,8 +57,8 @@ type ControllerStatus struct { FirewallStats *FirewallStats `json:"stats,omitempty"` ControllerVersion string `json:"controllerVersion,omitempty"` NftablesExporterVersion string `json:"nftablesExporterVersion,omitempty"` - Updated metav1.Time `json:"lastRun,omitempty"` - SeedUpdated metav1.Time `json:"lastRunAgainstSeed,omitempty"` + Updated metav1.Time `json:"lastRun"` + SeedUpdated metav1.Time `json:"lastRunAgainstSeed"` Distance FirewallDistance `json:"distance,omitempty"` DistanceSupported bool `json:"distanceSupported,omitempty"` } @@ -107,7 +107,7 @@ type InterfaceStat struct { // +kubebuilder:object:root=true type FirewallMonitorList struct { metav1.TypeMeta `json:",inline"` - metav1.ListMeta `json:"metadata,omitempty"` + metav1.ListMeta `json:"metadata"` Items []FirewallMonitor `json:"items"` } diff --git a/api/v2/types_firewallset.go b/api/v2/types_firewallset.go index cfd58fa..10f954d 100644 --- a/api/v2/types_firewallset.go +++ b/api/v2/types_firewallset.go @@ -45,12 +45,12 @@ func (f FirewallDistance) Pointer() *FirewallDistance { // +kubebuilder:printcolumn:name="Age",type="date",JSONPath=".metadata.creationTimestamp" type FirewallSet struct { metav1.TypeMeta `json:",inline"` - metav1.ObjectMeta `json:"metadata,omitempty"` + metav1.ObjectMeta `json:"metadata"` // Spec contains the firewall set specification. - Spec FirewallSetSpec `json:"spec,omitempty"` + Spec FirewallSetSpec `json:"spec"` // Status contains current status information on the firewall set. - Status FirewallSetStatus `json:"status,omitempty"` + Status FirewallSetStatus `json:"status"` } // FirewallSetSpec specifies the firewall set. @@ -100,7 +100,7 @@ type FirewallSetStatus struct { // +kubebuilder:object:root=true type FirewallSetList struct { metav1.TypeMeta `json:",inline"` - metav1.ListMeta `json:"metadata,omitempty"` + metav1.ListMeta `json:"metadata"` // Items contains the list items. Items []FirewallSet `json:"items"` diff --git a/go.mod b/go.mod index a2d1e28..a05f894 100644 --- a/go.mod +++ b/go.mod @@ -119,16 +119,16 @@ require ( go.yaml.in/yaml/v2 v2.4.3 // indirect go.yaml.in/yaml/v3 v3.0.4 // indirect go4.org v0.0.0-20230225012048-214862532bf5 // indirect - golang.org/x/crypto v0.45.0 // indirect - golang.org/x/mod v0.29.0 // indirect - golang.org/x/net v0.47.0 // indirect + golang.org/x/crypto v0.47.0 // indirect + golang.org/x/mod v0.32.0 // indirect + golang.org/x/net v0.49.0 // indirect golang.org/x/oauth2 v0.30.0 // indirect - golang.org/x/sync v0.18.0 // indirect - golang.org/x/sys v0.38.0 // indirect - golang.org/x/term v0.37.0 // indirect - golang.org/x/text v0.31.0 // indirect + golang.org/x/sync v0.19.0 // indirect + golang.org/x/sys v0.40.0 // indirect + golang.org/x/term v0.39.0 // indirect + golang.org/x/text v0.33.0 // indirect golang.org/x/time v0.11.0 // indirect - golang.org/x/tools v0.38.0 // indirect + golang.org/x/tools v0.41.0 // indirect gomodules.xyz/jsonpatch/v2 v2.4.0 // indirect google.golang.org/protobuf v1.36.8 // indirect gopkg.in/evanphx/json-patch.v4 v4.13.0 // indirect diff --git a/go.sum b/go.sum index 8d82f70..9f43d72 100644 --- a/go.sum +++ b/go.sum @@ -375,8 +375,8 @@ golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.45.0 h1:jMBrvKuj23MTlT0bQEOBcAE0mjg8mK9RXFhRH6nyF3Q= -golang.org/x/crypto v0.45.0/go.mod h1:XTGrrkGJve7CYK7J8PEww4aY7gM3qMCElcJQ8n8JdX4= +golang.org/x/crypto v0.47.0 h1:V6e3FRj+n4dbpw86FJ8Fv7XVOql7TEwpHapKoMJ/GO8= +golang.org/x/crypto v0.47.0/go.mod h1:ff3Y9VzzKbwSSEzWqJsJVBnWmRwRSHt/6Op5n9bQc4A= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -403,8 +403,8 @@ golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.29.0 h1:HV8lRxZC4l2cr3Zq1LvtOsi/ThTgWnUk/y64QSs8GwA= -golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w= +golang.org/x/mod v0.32.0 h1:9F4d3PHLljb6x//jOyokMv3eX+YDeepZSEo3mFJy93c= +golang.org/x/mod v0.32.0/go.mod h1:SgipZ/3h2Ci89DlEtEXWUk/HteuRin+HHhN+WbNhguU= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -423,8 +423,8 @@ golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.47.0 h1:Mx+4dIFzqraBXUugkia1OOvlD6LemFo1ALMHjrXDOhY= -golang.org/x/net v0.47.0/go.mod h1:/jNxtkgq5yWUGYkaZGqo27cfGZ1c5Nen03aYrrKpVRU= +golang.org/x/net v0.49.0 h1:eeHFmOGUTtaaPSGNmjBKpbng9MulQsJURQUAfUwY++o= +golang.org/x/net v0.49.0/go.mod h1:/ysNB2EvaqvesRkuLAyjI1ycPZlQHM3q01F02UY/MV8= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -439,8 +439,8 @@ golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.18.0 h1:kr88TuHDroi+UVf+0hZnirlk8o8T+4MrK6mr60WkH/I= -golang.org/x/sync v0.18.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= +golang.org/x/sync v0.19.0 h1:vV+1eWNmZ5geRlYjzm2adRgW2/mcpevXNg50YZtPCE4= +golang.org/x/sync v0.19.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -460,13 +460,13 @@ golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.38.0 h1:3yZWxaJjBmCWXqhN1qh02AkOnCQ1poK6oF+a7xWL6Gc= -golang.org/x/sys v0.38.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/sys v0.40.0 h1:DBZZqJ2Rkml6QMQsZywtnjnnGvHza6BTfYFWY9kjEWQ= +golang.org/x/sys v0.40.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= -golang.org/x/term v0.37.0 h1:8EGAD0qCmHYZg6J17DvsMy9/wJ7/D/4pV/wfnld5lTU= -golang.org/x/term v0.37.0/go.mod h1:5pB4lxRNYYVZuTLmy8oR2BH8dflOR+IbTYFD8fi3254= +golang.org/x/term v0.39.0 h1:RclSuaJf32jOqZz74CkPA9qFuVTX7vhLlpfj/IGWlqY= +golang.org/x/term v0.39.0/go.mod h1:yxzUCTP/U+FzoxfdKmLaA0RV1WgE0VY7hXBwKtY/4ww= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -474,8 +474,8 @@ golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.31.0 h1:aC8ghyu4JhP8VojJ2lEHBnochRno1sgL6nEi9WGFGMM= -golang.org/x/text v0.31.0/go.mod h1:tKRAlv61yKIjGGHX/4tP1LTbc13YSec1pxVEWXzfoeM= +golang.org/x/text v0.33.0 h1:B3njUFyqtHDUI5jMn1YIr5B0IE2U0qck04r6d4KPAxE= +golang.org/x/text v0.33.0/go.mod h1:LuMebE6+rBincTi9+xWTY8TztLzKHc/9C1uBCG27+q8= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.11.0 h1:/bpjEDfN9tkoN/ryeYHnv5hcMlc8ncjMcM4XBk5NWV0= @@ -506,8 +506,8 @@ golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapK golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.38.0 h1:Hx2Xv8hISq8Lm16jvBZ2VQf+RLmbd7wVUsALibYI/IQ= -golang.org/x/tools v0.38.0/go.mod h1:yEsQ/d/YK8cjh0L6rZlY8tgtlKiBNTL14pGDJPJpYQs= +golang.org/x/tools v0.41.0 h1:a9b8iMweWG+S0OBnlU36rzLp20z1Rp10w+IY2czHTQc= +golang.org/x/tools v0.41.0/go.mod h1:XSY6eDqxVNiYgezAVqqCeihT4j1U2CCsqvH3WhQpnlg= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= From f42deab7eb2bfea56e9bad6d69f94f88ea7af65b Mon Sep 17 00:00:00 2001 From: Gerrit Date: Fri, 23 Jan 2026 11:52:40 +0100 Subject: [PATCH 06/11] Manifests. --- .../crds/firewall.metal-stack.io_firewalldeployments.yaml | 6 +++++- config/crds/firewall.metal-stack.io_firewallmonitors.yaml | 6 +++++- config/crds/firewall.metal-stack.io_firewalls.yaml | 4 +++- config/crds/firewall.metal-stack.io_firewallsets.yaml | 6 +++++- 4 files changed, 18 insertions(+), 4 deletions(-) diff --git a/config/crds/firewall.metal-stack.io_firewalldeployments.yaml b/config/crds/firewall.metal-stack.io_firewalldeployments.yaml index 3100ea4..0006c72 100644 --- a/config/crds/firewall.metal-stack.io_firewalldeployments.yaml +++ b/config/crds/firewall.metal-stack.io_firewalldeployments.yaml @@ -3,7 +3,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.14.0 + controller-gen.kubebuilder.io/version: v0.20.0 name: firewalldeployments.firewall.metal-stack.io spec: group: firewall.metal-stack.io @@ -342,6 +342,10 @@ spec: - targetReplicas - unhealthyReplicas type: object + required: + - metadata + - spec + - status type: object served: true storage: true diff --git a/config/crds/firewall.metal-stack.io_firewallmonitors.yaml b/config/crds/firewall.metal-stack.io_firewallmonitors.yaml index dc859c3..78534a7 100644 --- a/config/crds/firewall.metal-stack.io_firewallmonitors.yaml +++ b/config/crds/firewall.metal-stack.io_firewallmonitors.yaml @@ -3,7 +3,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.14.0 + controller-gen.kubebuilder.io/version: v0.20.0 name: firewallmonitors.firewall.metal-stack.io spec: group: firewall.metal-stack.io @@ -184,6 +184,9 @@ spec: - idsStats - rules type: object + required: + - lastRun + - lastRunAgainstSeed type: object egressRules: description: EgressRules contains egress rules configured for this firewall. @@ -307,6 +310,7 @@ spec: required: - conditions - image + - metadata - networks - partition - project diff --git a/config/crds/firewall.metal-stack.io_firewalls.yaml b/config/crds/firewall.metal-stack.io_firewalls.yaml index c82118b..6cc38ac 100644 --- a/config/crds/firewall.metal-stack.io_firewalls.yaml +++ b/config/crds/firewall.metal-stack.io_firewalls.yaml @@ -3,7 +3,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.14.0 + controller-gen.kubebuilder.io/version: v0.20.0 name: firewalls.firewall.metal-stack.io spec: group: firewall.metal-stack.io @@ -423,7 +423,9 @@ spec: type: object required: - distance + - metadata - spec + - status type: object served: true storage: true diff --git a/config/crds/firewall.metal-stack.io_firewallsets.yaml b/config/crds/firewall.metal-stack.io_firewallsets.yaml index ae2878a..c06db3f 100644 --- a/config/crds/firewall.metal-stack.io_firewallsets.yaml +++ b/config/crds/firewall.metal-stack.io_firewallsets.yaml @@ -3,7 +3,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.14.0 + controller-gen.kubebuilder.io/version: v0.20.0 name: firewallsets.firewall.metal-stack.io spec: group: firewall.metal-stack.io @@ -296,6 +296,10 @@ spec: - targetReplicas - unhealthyReplicas type: object + required: + - metadata + - spec + - status type: object served: true storage: true From ce6ec9f43b0400fa6a5aee41e1699e06fed24f7e Mon Sep 17 00:00:00 2001 From: Gerrit Date: Fri, 23 Jan 2026 12:01:40 +0100 Subject: [PATCH 07/11] Revert omitempty change. --- api/v2/types_firewall.go | 4 ++-- api/v2/types_firewalldeployment.go | 8 ++++---- api/v2/types_firewallmonitor.go | 8 ++++---- api/v2/types_firewallset.go | 8 ++++---- .../crds/firewall.metal-stack.io_firewalldeployments.yaml | 4 ---- config/crds/firewall.metal-stack.io_firewallmonitors.yaml | 4 ---- config/crds/firewall.metal-stack.io_firewalls.yaml | 2 -- config/crds/firewall.metal-stack.io_firewallsets.yaml | 4 ---- 8 files changed, 14 insertions(+), 28 deletions(-) diff --git a/api/v2/types_firewall.go b/api/v2/types_firewall.go index 88c77df..34b18e8 100644 --- a/api/v2/types_firewall.go +++ b/api/v2/types_firewall.go @@ -30,12 +30,12 @@ const ( // +kubebuilder:printcolumn:name="Age",type="date",JSONPath=".status.machineStatus.allocationTimestamp" type Firewall struct { metav1.TypeMeta `json:",inline"` - metav1.ObjectMeta `json:"metadata"` + metav1.ObjectMeta `json:"metadata,omitempty"` // Spec contains the firewall specification. Spec FirewallSpec `json:"spec"` // Status contains current status information on the firewall. - Status FirewallStatus `json:"status"` + Status FirewallStatus `json:"status,omitempty"` // Distance defines the as-path length of a firewall. // This field is typically orchestrated by the deployment controller. diff --git a/api/v2/types_firewalldeployment.go b/api/v2/types_firewalldeployment.go index 9379b60..69e01fa 100644 --- a/api/v2/types_firewalldeployment.go +++ b/api/v2/types_firewalldeployment.go @@ -20,12 +20,12 @@ import ( // +kubebuilder:printcolumn:name="Age",type="date",JSONPath=".metadata.creationTimestamp" type FirewallDeployment struct { metav1.TypeMeta `json:",inline"` - metav1.ObjectMeta `json:"metadata"` + metav1.ObjectMeta `json:"metadata,omitempty"` // Spec contains the firewall deployment specification. - Spec FirewallDeploymentSpec `json:"spec"` + Spec FirewallDeploymentSpec `json:"spec,omitempty"` // Status contains current status information on the firewall deployment. - Status FirewallDeploymentStatus `json:"status"` + Status FirewallDeploymentStatus `json:"status,omitempty"` } // FirewallUpdateStrategy describes the strategy how firewalls are updated in case the update requires a physical recreation of the firewalls. @@ -93,7 +93,7 @@ const ( // +kubebuilder:object:root=true type FirewallDeploymentList struct { metav1.TypeMeta `json:",inline"` - metav1.ListMeta `json:"metadata"` + metav1.ListMeta `json:"metadata,omitempty"` // Items contains the list items. Items []FirewallDeployment `json:"items"` diff --git a/api/v2/types_firewallmonitor.go b/api/v2/types_firewallmonitor.go index 25f302e..d9bddc6 100644 --- a/api/v2/types_firewallmonitor.go +++ b/api/v2/types_firewallmonitor.go @@ -24,7 +24,7 @@ const ( // which are deployed into the seed cluster's shoot namespace. type FirewallMonitor struct { metav1.TypeMeta `json:",inline"` - metav1.ObjectMeta `json:"metadata"` + metav1.ObjectMeta `json:"metadata,omitempty"` // Size is the machine size of the firewall. Size string `json:"size"` @@ -57,8 +57,8 @@ type ControllerStatus struct { FirewallStats *FirewallStats `json:"stats,omitempty"` ControllerVersion string `json:"controllerVersion,omitempty"` NftablesExporterVersion string `json:"nftablesExporterVersion,omitempty"` - Updated metav1.Time `json:"lastRun"` - SeedUpdated metav1.Time `json:"lastRunAgainstSeed"` + Updated metav1.Time `json:"lastRun,omitempty"` + SeedUpdated metav1.Time `json:"lastRunAgainstSeed,omitempty"` Distance FirewallDistance `json:"distance,omitempty"` DistanceSupported bool `json:"distanceSupported,omitempty"` } @@ -107,7 +107,7 @@ type InterfaceStat struct { // +kubebuilder:object:root=true type FirewallMonitorList struct { metav1.TypeMeta `json:",inline"` - metav1.ListMeta `json:"metadata"` + metav1.ListMeta `json:"metadata,omitempty"` Items []FirewallMonitor `json:"items"` } diff --git a/api/v2/types_firewallset.go b/api/v2/types_firewallset.go index 10f954d..cfd58fa 100644 --- a/api/v2/types_firewallset.go +++ b/api/v2/types_firewallset.go @@ -45,12 +45,12 @@ func (f FirewallDistance) Pointer() *FirewallDistance { // +kubebuilder:printcolumn:name="Age",type="date",JSONPath=".metadata.creationTimestamp" type FirewallSet struct { metav1.TypeMeta `json:",inline"` - metav1.ObjectMeta `json:"metadata"` + metav1.ObjectMeta `json:"metadata,omitempty"` // Spec contains the firewall set specification. - Spec FirewallSetSpec `json:"spec"` + Spec FirewallSetSpec `json:"spec,omitempty"` // Status contains current status information on the firewall set. - Status FirewallSetStatus `json:"status"` + Status FirewallSetStatus `json:"status,omitempty"` } // FirewallSetSpec specifies the firewall set. @@ -100,7 +100,7 @@ type FirewallSetStatus struct { // +kubebuilder:object:root=true type FirewallSetList struct { metav1.TypeMeta `json:",inline"` - metav1.ListMeta `json:"metadata"` + metav1.ListMeta `json:"metadata,omitempty"` // Items contains the list items. Items []FirewallSet `json:"items"` diff --git a/config/crds/firewall.metal-stack.io_firewalldeployments.yaml b/config/crds/firewall.metal-stack.io_firewalldeployments.yaml index 0006c72..411bf6a 100644 --- a/config/crds/firewall.metal-stack.io_firewalldeployments.yaml +++ b/config/crds/firewall.metal-stack.io_firewalldeployments.yaml @@ -342,10 +342,6 @@ spec: - targetReplicas - unhealthyReplicas type: object - required: - - metadata - - spec - - status type: object served: true storage: true diff --git a/config/crds/firewall.metal-stack.io_firewallmonitors.yaml b/config/crds/firewall.metal-stack.io_firewallmonitors.yaml index 78534a7..637536b 100644 --- a/config/crds/firewall.metal-stack.io_firewallmonitors.yaml +++ b/config/crds/firewall.metal-stack.io_firewallmonitors.yaml @@ -184,9 +184,6 @@ spec: - idsStats - rules type: object - required: - - lastRun - - lastRunAgainstSeed type: object egressRules: description: EgressRules contains egress rules configured for this firewall. @@ -310,7 +307,6 @@ spec: required: - conditions - image - - metadata - networks - partition - project diff --git a/config/crds/firewall.metal-stack.io_firewalls.yaml b/config/crds/firewall.metal-stack.io_firewalls.yaml index 6cc38ac..6087ab1 100644 --- a/config/crds/firewall.metal-stack.io_firewalls.yaml +++ b/config/crds/firewall.metal-stack.io_firewalls.yaml @@ -423,9 +423,7 @@ spec: type: object required: - distance - - metadata - spec - - status type: object served: true storage: true diff --git a/config/crds/firewall.metal-stack.io_firewallsets.yaml b/config/crds/firewall.metal-stack.io_firewallsets.yaml index c06db3f..1f2b813 100644 --- a/config/crds/firewall.metal-stack.io_firewallsets.yaml +++ b/config/crds/firewall.metal-stack.io_firewallsets.yaml @@ -296,10 +296,6 @@ spec: - targetReplicas - unhealthyReplicas type: object - required: - - metadata - - spec - - status type: object served: true storage: true From 23c6a441e6c2fca1f50eb01706cc47dbc29f7595 Mon Sep 17 00:00:00 2001 From: Gerrit Date: Fri, 23 Jan 2026 18:14:38 +0100 Subject: [PATCH 08/11] Fixes. --- api/v2/helper/shoot_access_test.go | 4 +--- api/v2/types_annotations_test.go | 10 ---------- api/v2/types_firewall_test.go | 1 - api/v2/validation/firewall.go | 12 +++++++++--- api/v2/validation/firewall_test.go | 2 -- api/v2/validation/firewalldeployment.go | 14 +++++++++++--- api/v2/validation/firewalldeployment_test.go | 4 +--- api/v2/validation/firewallset.go | 14 +++++++++++--- api/v2/validation/firewallset_test.go | 8 +++----- controllers/firewall/reconcile_test.go | 1 - controllers/revision_test.go | 3 --- controllers/update/controller.go | 2 +- 12 files changed, 37 insertions(+), 38 deletions(-) diff --git a/api/v2/helper/shoot_access_test.go b/api/v2/helper/shoot_access_test.go index b53fed1..c028e00 100644 --- a/api/v2/helper/shoot_access_test.go +++ b/api/v2/helper/shoot_access_test.go @@ -62,7 +62,6 @@ users: } for _, tt := range tests { - tt := tt t.Run(tt.name, func(t *testing.T) { h := NewShootAccessHelper(tt.seed, tt.access) got, err := h.RESTConfig(context.Background()) @@ -90,14 +89,13 @@ contexts: name: shoot-name current-context: shoot-name kind: Config -preferences: {} users: - name: shoot-name user: token: /var/run/secrets/gardener.cloud/shoot/generic-kubeconfig/token `)) require.NoError(t, err) - assert.True(t, equal) + assert.True(t, equal, string(gotRaw)) }) } } diff --git a/api/v2/types_annotations_test.go b/api/v2/types_annotations_test.go index ce8060c..fcf4e48 100644 --- a/api/v2/types_annotations_test.go +++ b/api/v2/types_annotations_test.go @@ -217,10 +217,6 @@ func TestAddAnnotation(t *testing.T) { value: "true", wantErr: nil, want: &Firewall{ - TypeMeta: v1.TypeMeta{ - Kind: "Firewall", - APIVersion: "firewall.metal-stack.io/v2", - }, ObjectMeta: v1.ObjectMeta{ Name: "test", ResourceVersion: "1", @@ -279,10 +275,6 @@ func TestRemoveAnnotation(t *testing.T) { key: "test", wantErr: nil, want: &Firewall{ - TypeMeta: v1.TypeMeta{ - Kind: "Firewall", - APIVersion: "firewall.metal-stack.io/v2", - }, ObjectMeta: v1.ObjectMeta{ Name: "test", ResourceVersion: "1", @@ -348,7 +340,6 @@ func Test_annotationWasRemoved(t *testing.T) { }, } for _, tt := range tests { - tt := tt t.Run(tt.name, func(t *testing.T) { if got := annotationWasRemoved(event.UpdateEvent{ ObjectOld: &Firewall{ @@ -406,7 +397,6 @@ func Test_annotationWasAdded(t *testing.T) { }, } for _, tt := range tests { - tt := tt t.Run(tt.name, func(t *testing.T) { if got := annotationWasAdded(event.UpdateEvent{ ObjectOld: &Firewall{ diff --git a/api/v2/types_firewall_test.go b/api/v2/types_firewall_test.go index 3823240..e145730 100644 --- a/api/v2/types_firewall_test.go +++ b/api/v2/types_firewall_test.go @@ -98,7 +98,6 @@ func Test_SortFirewallsByImportance(t *testing.T) { }, } for _, tt := range tests { - tt := tt t.Run(tt.name, func(t *testing.T) { SortFirewallsByImportance(tt.fws) diff --git a/api/v2/validation/firewall.go b/api/v2/validation/firewall.go index 1a7302f..8eb0d4a 100644 --- a/api/v2/validation/firewall.go +++ b/api/v2/validation/firewall.go @@ -29,11 +29,15 @@ func NewFirewallValidator(log logr.Logger) admission.Validator[*v2.Firewall] { func (v *firewallValidator) ValidateCreate(ctx context.Context, f *v2.Firewall) (admission.Warnings, error) { var allErrs field.ErrorList - allErrs = append(allErrs, apivalidation.ValidateObjectMetaAccessor(&f.ObjectMeta, true, apivalidation.NameIsDNSSubdomain, field.NewPath("metadata"))...) + allErrs = append(allErrs, apivalidation.ValidateObjectMeta(&f.ObjectMeta, true, apivalidation.NameIsDNSSubdomain, field.NewPath("metadata"))...) allErrs = append(allErrs, validateFirewallAnnotations(f)...) allErrs = append(allErrs, validateFirewallSpec(&f.Spec, field.NewPath("spec"))...) allErrs = append(allErrs, validateDistance(f.Distance, field.NewPath("distance"))...) + if len(allErrs) == 0 { + return nil, nil + } + return nil, apierrors.NewInvalid( f.GetObjectKind().GroupVersionKind().GroupKind(), f.GetName(), @@ -49,6 +53,10 @@ func (v *firewallValidator) ValidateUpdate(ctx context.Context, fOld, fNew *v2.F allErrs = append(allErrs, validateFirewallSpecUpdate(&fOld.Spec, &fNew.Spec, field.NewPath("spec"))...) allErrs = append(allErrs, validateDistance(fNew.Distance, field.NewPath("distance"))...) + if len(allErrs) == 0 { + return nil, nil + } + return nil, apierrors.NewInvalid( fNew.GetObjectKind().GroupVersionKind().GroupKind(), fNew.GetName(), @@ -118,8 +126,6 @@ func validateFirewallSpec(f *v2.FirewallSpec, fldPath *field.Path) field.ErrorLi } for _, limit := range f.RateLimits { - limit := limit - r = requiredFields{ {path: fldPath.Child("rateLimits").Child("networkID"), value: limit.NetworkID}, } diff --git a/api/v2/validation/firewall_test.go b/api/v2/validation/firewall_test.go index a5aaf6d..9b1d641 100644 --- a/api/v2/validation/firewall_test.go +++ b/api/v2/validation/firewall_test.go @@ -116,7 +116,6 @@ func Test_firewallValidator_ValidateCreate(t *testing.T) { }, } for _, tt := range tests { - tt := tt t.Run(tt.name, func(t *testing.T) { v := NewFirewallValidator(testr.New(t)) @@ -207,7 +206,6 @@ func Test_firewallValidator_ValidateUpdate(t *testing.T) { }, } for _, tt := range tests { - tt := tt t.Run(tt.name, func(t *testing.T) { v := NewFirewallValidator(testr.New(t)) diff --git a/api/v2/validation/firewalldeployment.go b/api/v2/validation/firewalldeployment.go index c24f027..91c95c7 100644 --- a/api/v2/validation/firewalldeployment.go +++ b/api/v2/validation/firewalldeployment.go @@ -28,7 +28,11 @@ func (v *firewallDeploymentValidator) ValidateCreate(ctx context.Context, f *v2. var allErrs field.ErrorList allErrs = append(allErrs, apivalidation.ValidateObjectMetaAccessor(&f.ObjectMeta, true, apivalidation.NameIsDNSSubdomain, field.NewPath("metadata"))...) - allErrs = append(allErrs, v.validateSpec(v.log, &f.Spec, field.NewPath("spec"))...) + allErrs = append(allErrs, v.validateSpec(&f.Spec, field.NewPath("spec"))...) + + if len(allErrs) == 0 { + return nil, nil + } return nil, apierrors.NewInvalid( f.GetObjectKind().GroupVersionKind().GroupKind(), @@ -43,6 +47,10 @@ func (v *firewallDeploymentValidator) ValidateUpdate(ctx context.Context, oldF, allErrs = append(allErrs, apivalidation.ValidateObjectMetaAccessorUpdate(&newF.ObjectMeta, &oldF.ObjectMeta, field.NewPath("metadata"))...) allErrs = append(allErrs, v.validateSpecUpdate(v.log, &oldF.Spec, &newF.Spec, &newF.Status, field.NewPath("spec"))...) + if len(allErrs) == 0 { + return nil, nil + } + return nil, apierrors.NewInvalid( newF.GetObjectKind().GroupVersionKind().GroupKind(), newF.GetName(), @@ -54,7 +62,7 @@ func (v *firewallDeploymentValidator) ValidateDelete(ctx context.Context, f *v2. return nil, nil } -func (*firewallDeploymentValidator) validateSpec(log logr.Logger, f *v2.FirewallDeploymentSpec, fldPath *field.Path) field.ErrorList { +func (*firewallDeploymentValidator) validateSpec(f *v2.FirewallDeploymentSpec, fldPath *field.Path) field.ErrorList { var allErrs field.ErrorList switch f.Strategy { @@ -96,7 +104,7 @@ func (*firewallDeploymentValidator) validateSpec(log logr.Logger, f *v2.Firewall func (v *firewallDeploymentValidator) validateSpecUpdate(log logr.Logger, oldF, newF *v2.FirewallDeploymentSpec, status *v2.FirewallDeploymentStatus, fldPath *field.Path) field.ErrorList { var allErrs field.ErrorList - allErrs = append(allErrs, v.validateSpec(log, newF, fldPath)...) + allErrs = append(allErrs, v.validateSpec(newF, fldPath)...) allErrs = append(allErrs, validateFirewallSpecUpdate(&oldF.Template.Spec, &newF.Template.Spec, fldPath.Child("template").Child("spec"))...) diff --git a/api/v2/validation/firewalldeployment_test.go b/api/v2/validation/firewalldeployment_test.go index 647e174..98701e8 100644 --- a/api/v2/validation/firewalldeployment_test.go +++ b/api/v2/validation/firewalldeployment_test.go @@ -85,7 +85,6 @@ func Test_firewallDeploymentValidator_ValidateCreate(t *testing.T) { }, } for _, tt := range tests { - tt := tt t.Run(tt.name, func(t *testing.T) { v := NewFirewallDeploymentValidator(testr.New(t)) @@ -169,7 +168,7 @@ func Test_firewallDeploymentValidator_ValidateUpdate(t *testing.T) { }, wantErr: &apierrors.StatusError{ ErrStatus: metav1.Status{ - Message: ` "firewall" is invalid: spec.selector: Invalid value: map[string]string{"purpose":"shoot-firewall"}: field is immutable`, + Message: ` "firewall" is invalid: spec.selector: Invalid value: {"purpose":"shoot-firewall"}: field is immutable`, }, }, }, @@ -188,7 +187,6 @@ func Test_firewallDeploymentValidator_ValidateUpdate(t *testing.T) { }, } for _, tt := range tests { - tt := tt t.Run(tt.name, func(t *testing.T) { v := NewFirewallDeploymentValidator(testr.New(t)) diff --git a/api/v2/validation/firewallset.go b/api/v2/validation/firewallset.go index a5828ef..ab0a55a 100644 --- a/api/v2/validation/firewallset.go +++ b/api/v2/validation/firewallset.go @@ -28,7 +28,11 @@ func (v *firewallSetValidator) ValidateCreate(ctx context.Context, f *v2.Firewal var allErrs field.ErrorList allErrs = append(allErrs, apivalidation.ValidateObjectMetaAccessor(&f.ObjectMeta, true, apivalidation.NameIsDNSSubdomain, field.NewPath("metadata"))...) - allErrs = append(allErrs, v.validateSpec(v.log, &f.Spec, field.NewPath("spec"))...) + allErrs = append(allErrs, v.validateSpec(&f.Spec, field.NewPath("spec"))...) + + if len(allErrs) == 0 { + return nil, nil + } return nil, apierrors.NewInvalid( f.GetObjectKind().GroupVersionKind().GroupKind(), @@ -43,6 +47,10 @@ func (v *firewallSetValidator) ValidateUpdate(ctx context.Context, oldF, newF *v allErrs = append(allErrs, apivalidation.ValidateObjectMetaAccessorUpdate(&newF.ObjectMeta, &oldF.ObjectMeta, field.NewPath("metadata"))...) allErrs = append(allErrs, v.validateSpecUpdate(v.log, &oldF.Spec, &newF.Spec, field.NewPath("spec"))...) + if len(allErrs) == 0 { + return nil, nil + } + return nil, apierrors.NewInvalid( newF.GetObjectKind().GroupVersionKind().GroupKind(), newF.GetName(), @@ -54,7 +62,7 @@ func (v *firewallSetValidator) ValidateDelete(ctx context.Context, f *v2.Firewal return nil, nil } -func (v *firewallSetValidator) validateSpec(log logr.Logger, f *v2.FirewallSetSpec, fldPath *field.Path) field.ErrorList { +func (v *firewallSetValidator) validateSpec(f *v2.FirewallSetSpec, fldPath *field.Path) field.ErrorList { var allErrs field.ErrorList if f.Replicas < 0 { @@ -92,7 +100,7 @@ func (v *firewallSetValidator) validateSpec(log logr.Logger, f *v2.FirewallSetSp func (v *firewallSetValidator) validateSpecUpdate(log logr.Logger, oldF, newF *v2.FirewallSetSpec, fldPath *field.Path) field.ErrorList { var allErrs field.ErrorList - allErrs = append(allErrs, v.validateSpec(log, newF, fldPath)...) + allErrs = append(allErrs, v.validateSpec(newF, fldPath)...) allErrs = append(allErrs, validateFirewallSpecUpdate(&oldF.Template.Spec, &newF.Template.Spec, fldPath.Child("template").Child("spec"))...) diff --git a/api/v2/validation/firewallset_test.go b/api/v2/validation/firewallset_test.go index 8d79646..6757223 100644 --- a/api/v2/validation/firewallset_test.go +++ b/api/v2/validation/firewallset_test.go @@ -92,7 +92,7 @@ func Test_firewalSetValidator_ValidateCreate(t *testing.T) { }, wantErr: &apierrors.StatusError{ ErrStatus: metav1.Status{ - Message: ` "firewall" is invalid: spec.template.metadata.labels: Invalid value: map[string]string{"purpose":"shoot-firewall"}: ` + "`selector` does not match template `labels`", + Message: ` "firewall" is invalid: spec.template.metadata.labels: Invalid value: {"purpose":"shoot-firewall"}: ` + "`selector` does not match template `labels`", }, }, }, @@ -106,7 +106,7 @@ func Test_firewalSetValidator_ValidateCreate(t *testing.T) { }, wantErr: &apierrors.StatusError{ ErrStatus: metav1.Status{ - Message: ` "firewall" is invalid: spec.template.metadata.labels: Invalid value: map[string]string{"purpose":"shoot-firewall"}: ` + "`selector` does not match template `labels`", + Message: ` "firewall" is invalid: spec.template.metadata.labels: Invalid value: {"purpose":"shoot-firewall"}: ` + "`selector` does not match template `labels`", }, }, }, @@ -124,7 +124,6 @@ func Test_firewalSetValidator_ValidateCreate(t *testing.T) { }, } for _, tt := range tests { - tt := tt t.Run(tt.name, func(t *testing.T) { v := NewFirewallSetValidator(testr.New(t)) @@ -207,7 +206,7 @@ func Test_firewallSetValidator_ValidateUpdate(t *testing.T) { }, wantErr: &apierrors.StatusError{ ErrStatus: metav1.Status{ - Message: ` "firewall" is invalid: spec.selector: Invalid value: map[string]string{"purpose":"shoot-firewall"}: field is immutable`, + Message: ` "firewall" is invalid: spec.selector: Invalid value: {"purpose":"shoot-firewall"}: field is immutable`, }, }, }, @@ -226,7 +225,6 @@ func Test_firewallSetValidator_ValidateUpdate(t *testing.T) { }, } for _, tt := range tests { - tt := tt t.Run(tt.name, func(t *testing.T) { v := NewFirewallSetValidator(testr.New(t)) diff --git a/controllers/firewall/reconcile_test.go b/controllers/firewall/reconcile_test.go index 491a170..467df07 100644 --- a/controllers/firewall/reconcile_test.go +++ b/controllers/firewall/reconcile_test.go @@ -53,7 +53,6 @@ func Test_ensureTag(t *testing.T) { }, } for _, tt := range tests { - tt := tt t.Run(tt.name, func(t *testing.T) { got := ensureTag(tt.currentTags, tt.key, tt.value) if diff := cmp.Diff(got, tt.want); diff != "" { diff --git a/controllers/revision_test.go b/controllers/revision_test.go index f775809..f27776d 100644 --- a/controllers/revision_test.go +++ b/controllers/revision_test.go @@ -82,7 +82,6 @@ func TestMaxRevisionOf(t *testing.T) { }, } for _, tt := range tests { - tt := tt t.Run(tt.name, func(t *testing.T) { got, err := MaxRevisionOf(tt.sets) if diff := cmp.Diff(tt.wantErr, err, testcommon.ErrorStringComparer()); diff != "" { @@ -167,7 +166,6 @@ func TestMinRevisionOf(t *testing.T) { }, } for _, tt := range tests { - tt := tt t.Run(tt.name, func(t *testing.T) { got, err := MinRevisionOf(tt.sets) if diff := cmp.Diff(tt.wantErr, err, testcommon.ErrorStringComparer()); diff != "" { @@ -238,7 +236,6 @@ func TestExcept(t *testing.T) { }, } for _, tt := range tests { - tt := tt t.Run(tt.name, func(t *testing.T) { got := Except(tt.sets, tt.except...) if diff := cmp.Diff(tt.want, got); diff != "" { diff --git a/controllers/update/controller.go b/controllers/update/controller.go index 44fa59c..6d78cf5 100644 --- a/controllers/update/controller.go +++ b/controllers/update/controller.go @@ -41,7 +41,7 @@ func SetupWithManager(log logr.Logger, recorder events.EventRecorder, mgr ctrl.M v2.AnnotationAddedPredicate(v2.MaintenanceAnnotation), ), ). - Named("FirewallDeployment"). + Named("Update"). WithEventFilter(predicate.NewPredicateFuncs(controllers.SkipOtherNamespace(c.GetSeedNamespace()))). Complete(g) } From cc38de6c88f8a222eac1993528c520d8080780fc Mon Sep 17 00:00:00 2001 From: Gerrit Date: Fri, 23 Jan 2026 18:19:39 +0100 Subject: [PATCH 09/11] Remove self-assignments. --- api/v2/defaults/defaults_test.go | 1 - api/v2/validation/firewall.go | 2 -- controllers/deployment/delete.go | 2 -- controllers/firewall/delete.go | 2 -- controllers/firewall/reconcile.go | 2 -- controllers/firewall/status.go | 1 - controllers/generic_controller.go | 2 -- controllers/revision.go | 8 -------- controllers/set/controller_test.go | 2 -- controllers/set/delete.go | 4 ---- controllers/set/reconcile.go | 2 -- 11 files changed, 28 deletions(-) diff --git a/api/v2/defaults/defaults_test.go b/api/v2/defaults/defaults_test.go index ba39145..fcc422b 100644 --- a/api/v2/defaults/defaults_test.go +++ b/api/v2/defaults/defaults_test.go @@ -89,7 +89,6 @@ package defaults // }, // } // for _, tt := range tests { -// tt := tt // t.Run(tt.name, func(t *testing.T) { // r, err := NewFirewallDeploymentDefaulter(&DefaulterConfig{ // Log: testr.New(t), diff --git a/api/v2/validation/firewall.go b/api/v2/validation/firewall.go index 8eb0d4a..6667b64 100644 --- a/api/v2/validation/firewall.go +++ b/api/v2/validation/firewall.go @@ -105,8 +105,6 @@ func validateFirewallSpec(f *v2.FirewallSpec, fldPath *field.Path) field.ErrorLi } for _, rule := range f.EgressRules { - rule := rule - r = requiredFields{ {path: fldPath.Child("egressRules").Child("networkID"), value: rule.NetworkID}, } diff --git a/controllers/deployment/delete.go b/controllers/deployment/delete.go index 7ddbcc3..7d0298c 100644 --- a/controllers/deployment/delete.go +++ b/controllers/deployment/delete.go @@ -21,8 +21,6 @@ func (c *controller) Delete(r *controllers.Ctx[*v2.FirewallDeployment]) error { func (c *controller) deleteFirewallSets(r *controllers.Ctx[*v2.FirewallDeployment], sets ...*v2.FirewallSet) error { for _, set := range sets { - set := set - if set.DeletionTimestamp != nil { r.Log.Info("deletion timestamp on firewall set already set", "firewall-name", set.Name) continue diff --git a/controllers/firewall/delete.go b/controllers/firewall/delete.go index e1b3493..191584c 100644 --- a/controllers/firewall/delete.go +++ b/controllers/firewall/delete.go @@ -33,8 +33,6 @@ func (c *controller) Delete(r *controllers.Ctx[*v2.Firewall]) error { } for _, f := range fws { - f := f - if f.ID == nil { continue } diff --git a/controllers/firewall/reconcile.go b/controllers/firewall/reconcile.go index 6b03f1a..836e6bc 100644 --- a/controllers/firewall/reconcile.go +++ b/controllers/firewall/reconcile.go @@ -109,7 +109,6 @@ func (c *controller) Reconcile(r *controllers.Ctx[*v2.Firewall]) error { default: var ids []string for _, fw := range fws { - fw := fw ids = append(ids, pointer.SafeDeref(fw.ID)) } @@ -129,7 +128,6 @@ func (c *controller) createFirewall(r *controllers.Ctx[*v2.Firewall]) (*models.V } ) for _, n := range r.Target.Spec.Networks { - n := n network := &models.V1MachineAllocationNetwork{ Networkid: &n, Autoacquire: pointer.Pointer(true), diff --git a/controllers/firewall/status.go b/controllers/firewall/status.go index 07e8698..cb8c564 100644 --- a/controllers/firewall/status.go +++ b/controllers/firewall/status.go @@ -92,7 +92,6 @@ func (c *controller) setFirewallNetworks(r *controllers.Ctx[*v2.Firewall], f *mo var result []v2.FirewallNetwork for _, n := range f.Allocation.Networks { - n := n if n.Networkid == nil { continue } diff --git a/controllers/generic_controller.go b/controllers/generic_controller.go index 39609b5..5a585e2 100644 --- a/controllers/generic_controller.go +++ b/controllers/generic_controller.go @@ -221,8 +221,6 @@ func GetOwnedResources[O client.ObjectList, E metav1.Object](ctx context.Context } for _, o := range getter(list) { - o := o - if !metav1.IsControlledBy(o, owner) { if metav1.GetControllerOf(o) == nil { orphaned = append(orphaned, o) diff --git a/controllers/revision.go b/controllers/revision.go index 660bd3f..33c1df0 100644 --- a/controllers/revision.go +++ b/controllers/revision.go @@ -46,8 +46,6 @@ func MaxRevisionOf(sets []*v2.FirewallSet) (*v2.FirewallSet, error) { } for _, set := range sets { - set := set - if v, err := Revision(set); err != nil { return nil, fmt.Errorf("couldn't parse revision for firewall set: %w", err) } else if v > max { @@ -79,8 +77,6 @@ func MinRevisionOf(sets []*v2.FirewallSet) (*v2.FirewallSet, error) { } for _, set := range sets { - set := set - if v, err := Revision(set); err != nil { return nil, fmt.Errorf("couldn't parse revision for firewall set: %w", err) } else if v < min { @@ -96,16 +92,12 @@ func Except[O client.Object](sets []O, except ...O) []O { var result []O for _, s := range sets { - s := s - if reflect.ValueOf(s).IsNil() { continue } found := false for _, e := range except { - e := e - if reflect.ValueOf(e).IsNil() { continue } diff --git a/controllers/set/controller_test.go b/controllers/set/controller_test.go index e3f508b..f8f3fc5 100644 --- a/controllers/set/controller_test.go +++ b/controllers/set/controller_test.go @@ -99,8 +99,6 @@ var _ = Context("firewall set controller", Ordered, func() { var newest *v2.Firewall for _, fw := range fws.Items { - fw := fw - _, _ = fmt.Fprintf(GinkgoWriter, "Having %s with creation timestamp: %s\n", fw.Name, fw.CreationTimestamp.String()) if newest == nil { diff --git a/controllers/set/delete.go b/controllers/set/delete.go index 30cac7e..8d0e1ce 100644 --- a/controllers/set/delete.go +++ b/controllers/set/delete.go @@ -22,8 +22,6 @@ func (c *controller) Delete(r *controllers.Ctx[*v2.FirewallSet]) error { func (c *controller) deleteFirewalls(r *controllers.Ctx[*v2.FirewallSet], fws ...*v2.Firewall) error { for _, fw := range fws { - fw := fw - if fw.DeletionTimestamp != nil { r.Log.Info("deletion timestamp on firewall already set", "firewall-name", fw.Name) continue @@ -50,8 +48,6 @@ func (c *controller) deleteAfterTimeout(r *controllers.Ctx[*v2.FirewallSet], fws var result []*v2.Firewall for _, fw := range fws { - fw := fw - if fw.Status.Phase != v2.FirewallPhaseCreating { continue } diff --git a/controllers/set/reconcile.go b/controllers/set/reconcile.go index 17e6a27..3b99c19 100644 --- a/controllers/set/reconcile.go +++ b/controllers/set/reconcile.go @@ -184,8 +184,6 @@ func (c *controller) adoptFirewalls(r *controllers.Ctx[*v2.FirewallSet], fws []* var adoptions []*v2.Firewall for _, fw := range fws { - fw := fw - ok, err := c.adoptFirewall(r, fw) if err != nil { return nil, err From 806afe3f550f7b1b06a50c87a9d01a5f9b43df7d Mon Sep 17 00:00:00 2001 From: Gerrit Date: Wed, 11 Feb 2026 14:34:17 +0100 Subject: [PATCH 10/11] Update to go 1.26. --- Dockerfile | 2 +- go.mod | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index 6c338b9..2033b97 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,5 @@ # Build the firewall-controller-manager binary -FROM golang:1.25 AS builder +FROM golang:1.26 AS builder WORKDIR /work COPY . . diff --git a/go.mod b/go.mod index a05f894..feb936b 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/metal-stack/firewall-controller-manager -go 1.25.0 +go 1.26 require ( github.com/Masterminds/semver/v3 v3.4.0 From 770db7224ef5b706165b7b3525ff9487a9425f5c Mon Sep 17 00:00:00 2001 From: Gerrit Date: Wed, 11 Feb 2026 14:50:42 +0100 Subject: [PATCH 11/11] Run go fix. --- api/v2/defaults/userdata.go | 5 +- .../deployment/infrastructure_status_test.go | 25 ++- controllers/deployment/recreate.go | 3 +- controllers/firewall/reconcile.go | 2 +- controllers/set/reconcile.go | 7 +- controllers/update/reconcile_test.go | 5 +- integration/integration_test.go | 4 +- integration/metal_resources_test.go | 202 +++++++++--------- 8 files changed, 124 insertions(+), 129 deletions(-) diff --git a/api/v2/defaults/userdata.go b/api/v2/defaults/userdata.go index 4a4b49f..18e3c6e 100644 --- a/api/v2/defaults/userdata.go +++ b/api/v2/defaults/userdata.go @@ -5,7 +5,6 @@ import ( "fmt" "github.com/flatcar/container-linux-config-transpiler/config/types" - "github.com/metal-stack/metal-lib/pkg/pointer" ) const ( @@ -24,12 +23,12 @@ func renderUserdata(kubeconfig, seedKubeconfig []byte) (string, error) { { Name: fmt.Sprintf("%s.service", FirewallControllerName), Enable: true, - Enabled: pointer.Pointer(true), + Enabled: new(true), }, { Name: fmt.Sprintf("%s.service", DroptailerClientName), Enable: true, - Enabled: pointer.Pointer(true), + Enabled: new(true), }, }, }, diff --git a/controllers/deployment/infrastructure_status_test.go b/controllers/deployment/infrastructure_status_test.go index 96fa1cb..ab69a2f 100644 --- a/controllers/deployment/infrastructure_status_test.go +++ b/controllers/deployment/infrastructure_status_test.go @@ -9,7 +9,6 @@ import ( v2 "github.com/metal-stack/firewall-controller-manager/api/v2" "github.com/metal-stack/firewall-controller-manager/api/v2/config" "github.com/metal-stack/firewall-controller-manager/controllers" - "github.com/metal-stack/metal-lib/pkg/pointer" "github.com/metal-stack/metal-lib/pkg/testcommon" "github.com/stretchr/testify/require" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" @@ -79,11 +78,11 @@ func Test_controller_updateInfrastructureStatus(t *testing.T) { Status: v2.FirewallStatus{ FirewallNetworks: []v2.FirewallNetwork{ { - NetworkType: pointer.Pointer("external"), + NetworkType: new("external"), IPs: []string{"1.1.1.1"}, }, { - NetworkType: pointer.Pointer("underlay"), + NetworkType: new("underlay"), IPs: []string{"10.8.0.4"}, }, }, @@ -164,11 +163,11 @@ func Test_controller_updateInfrastructureStatus(t *testing.T) { Status: v2.FirewallStatus{ FirewallNetworks: []v2.FirewallNetwork{ { - NetworkType: pointer.Pointer("external"), + NetworkType: new("external"), IPs: []string{"1.1.1.1"}, }, { - NetworkType: pointer.Pointer("underlay"), + NetworkType: new("underlay"), IPs: []string{"10.8.0.4"}, }, }, @@ -234,11 +233,11 @@ func Test_controller_updateInfrastructureStatus(t *testing.T) { Status: v2.FirewallStatus{ FirewallNetworks: []v2.FirewallNetwork{ { - NetworkType: pointer.Pointer("external"), + NetworkType: new("external"), IPs: []string{"1.1.1.1"}, }, { - NetworkType: pointer.Pointer("underlay"), + NetworkType: new("underlay"), IPs: []string{"10.8.0.4"}, }, }, @@ -309,11 +308,11 @@ func Test_controller_updateInfrastructureStatus(t *testing.T) { Status: v2.FirewallStatus{ FirewallNetworks: []v2.FirewallNetwork{ { - NetworkType: pointer.Pointer("external"), + NetworkType: new("external"), IPs: []string{"1.1.1.1"}, }, { - NetworkType: pointer.Pointer("underlay"), + NetworkType: new("underlay"), IPs: []string{"10.8.0.4"}, }, }, @@ -384,11 +383,11 @@ func Test_controller_updateInfrastructureStatus(t *testing.T) { Status: v2.FirewallStatus{ FirewallNetworks: []v2.FirewallNetwork{ { - NetworkType: pointer.Pointer("external"), + NetworkType: new("external"), IPs: []string{"1.1.1.1"}, }, { - NetworkType: pointer.Pointer("underlay"), + NetworkType: new("underlay"), IPs: []string{"10.8.0.4"}, }, }, @@ -398,11 +397,11 @@ func Test_controller_updateInfrastructureStatus(t *testing.T) { Status: v2.FirewallStatus{ FirewallNetworks: []v2.FirewallNetwork{ { - NetworkType: pointer.Pointer("external"), + NetworkType: new("external"), IPs: []string{"1.1.1.2"}, }, { - NetworkType: pointer.Pointer("underlay"), + NetworkType: new("underlay"), IPs: []string{"10.8.0.5"}, }, }, diff --git a/controllers/deployment/recreate.go b/controllers/deployment/recreate.go index bc52149..da483c1 100644 --- a/controllers/deployment/recreate.go +++ b/controllers/deployment/recreate.go @@ -6,7 +6,6 @@ import ( v2 "github.com/metal-stack/firewall-controller-manager/api/v2" "github.com/metal-stack/firewall-controller-manager/controllers" - "github.com/metal-stack/metal-lib/pkg/pointer" ) // recreateStrategy first deletes the existing firewall sets and then creates a new one @@ -15,7 +14,7 @@ func (c *controller) recreateStrategy(r *controllers.Ctx[*v2.FirewallDeployment] r.Log.Info("significant changes detected in the spec, create new scaled down firewall set, then cleaning up old sets") set, err := c.createNextFirewallSet(r, latestSet, &setOverrides{ - replicas: pointer.Pointer(0), + replicas: new(0), }) if err != nil { return err diff --git a/controllers/firewall/reconcile.go b/controllers/firewall/reconcile.go index 836e6bc..26170ae 100644 --- a/controllers/firewall/reconcile.go +++ b/controllers/firewall/reconcile.go @@ -130,7 +130,7 @@ func (c *controller) createFirewall(r *controllers.Ctx[*v2.Firewall]) (*models.V for _, n := range r.Target.Spec.Networks { network := &models.V1MachineAllocationNetwork{ Networkid: &n, - Autoacquire: pointer.Pointer(true), + Autoacquire: new(true), } networks = append(networks, network) } diff --git a/controllers/set/reconcile.go b/controllers/set/reconcile.go index 3b99c19..b557f5e 100644 --- a/controllers/set/reconcile.go +++ b/controllers/set/reconcile.go @@ -2,6 +2,7 @@ package set import ( "fmt" + "maps" "github.com/Masterminds/semver/v3" "github.com/google/uuid" @@ -145,10 +146,8 @@ func (c *controller) createFirewall(r *controllers.Ctx[*v2.FirewallSet]) (*v2.Fi *metav1.NewControllerRef(r.Target, v2.GroupVersion.WithKind("FirewallSet")), } - for k, v := range r.Target.Labels { - // inheriting labels from the firewall set to the firewall - meta.Labels[k] = v - } + // inheriting labels from the firewall set to the firewall + maps.Copy(meta.Labels, r.Target.Labels) if v, err := semver.NewVersion(r.Target.Spec.Template.Spec.ControllerVersion); err == nil && v.LessThan(semver.MustParse("v2.0.0")) { if meta.Annotations == nil { diff --git a/controllers/update/reconcile_test.go b/controllers/update/reconcile_test.go index 4f06956..635a020 100644 --- a/controllers/update/reconcile_test.go +++ b/controllers/update/reconcile_test.go @@ -13,7 +13,6 @@ import ( "github.com/metal-stack/metal-go/api/client/image" "github.com/metal-stack/metal-go/api/models" metaltestclient "github.com/metal-stack/metal-go/test/client" - "github.com/metal-stack/metal-lib/pkg/pointer" "github.com/metal-stack/metal-lib/pkg/testcommon" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" @@ -114,7 +113,7 @@ func Test_controller_autoUpdateOS(t *testing.T) { Image: func(mock *mock.Mock) { mock.On("FindLatestImage", image.NewFindLatestImageParams().WithID("firewall-ubuntu-3.0").WithContext(ctx), nil).Return(&image.FindLatestImageOK{ Payload: &models.V1ImageResponse{ - ID: pointer.Pointer("firewall-ubuntu-3.0.20240503"), + ID: new("firewall-ubuntu-3.0.20240503"), }, }, nil) }, @@ -170,7 +169,7 @@ func Test_controller_autoUpdateOS(t *testing.T) { Image: func(mock *mock.Mock) { mock.On("FindLatestImage", image.NewFindLatestImageParams().WithID("firewall-ubuntu-3.0").WithContext(ctx), nil).Return(&image.FindLatestImageOK{ Payload: &models.V1ImageResponse{ - ID: pointer.Pointer("firewall-ubuntu-3.0.20240503"), + ID: new("firewall-ubuntu-3.0.20240503"), }, }, nil) }, diff --git a/integration/integration_test.go b/integration/integration_test.go index d132242..147aded 100644 --- a/integration/integration_test.go +++ b/integration/integration_test.go @@ -53,7 +53,7 @@ var ( Namespace: namespaceName, }, Data: map[string][]byte{ - "kubeconfig": []byte(fmt.Sprintf(`apiVersion: v1 + "kubeconfig": fmt.Appendf(nil, `apiVersion: v1 clusters: - cluster: certificate-authority-data: %s @@ -73,7 +73,7 @@ users: client-certificate-data: %s client-key-data: %s -`, apiCA, apiHost, apiCert, apiKey))}, +`, apiCA, apiHost, apiCert, apiKey)}, } } diff --git a/integration/metal_resources_test.go b/integration/metal_resources_test.go index da2bb30..a8c9605 100644 --- a/integration/metal_resources_test.go +++ b/integration/metal_resources_test.go @@ -18,86 +18,86 @@ var ( firewall1 = &models.V1FirewallResponse{ Allocation: &models.V1MachineAllocation{ BootInfo: &models.V1BootInfo{ - Bootloaderid: pointer.Pointer("bootloaderid"), - Cmdline: pointer.Pointer("cmdline"), - ImageID: pointer.Pointer("imageid"), - Initrd: pointer.Pointer("initrd"), - Kernel: pointer.Pointer("kernel"), - OsPartition: pointer.Pointer("ospartition"), - PrimaryDisk: pointer.Pointer("primarydisk"), + Bootloaderid: new("bootloaderid"), + Cmdline: new("cmdline"), + ImageID: new("imageid"), + Initrd: new("initrd"), + Kernel: new("kernel"), + OsPartition: new("ospartition"), + PrimaryDisk: new("primarydisk"), }, - Created: pointer.Pointer(strfmt.DateTime(testTime.Add(-14 * 24 * time.Hour))), - Creator: pointer.Pointer("creator"), + Created: new(strfmt.DateTime(testTime.Add(-14 * 24 * time.Hour))), + Creator: new("creator"), Description: "firewall allocation 1", Filesystemlayout: fsl1, - Hostname: pointer.Pointer("firewall-hostname-1"), + Hostname: new("firewall-hostname-1"), Image: image1, - Name: pointer.Pointer("firewall-1"), + Name: new("firewall-1"), Networks: []*models.V1MachineNetwork{ { - Asn: pointer.Pointer(int64(200)), + Asn: new(int64(200)), Destinationprefixes: []string{"2.2.2.2"}, Ips: []string{"1.1.1.1"}, - Nat: pointer.Pointer(false), - Networkid: pointer.Pointer("private"), + Nat: new(false), + Networkid: new("private"), Networktype: pointer.Pointer(net.PrivatePrimaryUnshared), Prefixes: []string{"prefixes"}, - Private: pointer.Pointer(true), - Underlay: pointer.Pointer(false), - Vrf: pointer.Pointer(int64(100)), + Private: new(true), + Underlay: new(false), + Vrf: new(int64(100)), }, }, - Project: pointer.Pointer("project-1"), - Reinstall: pointer.Pointer(false), + Project: new("project-1"), + Reinstall: new(false), Role: pointer.Pointer(models.V1MachineAllocationRoleFirewall), SSHPubKeys: []string{"sshpubkey"}, - Succeeded: pointer.Pointer(true), + Succeeded: new(true), UserData: "---userdata---", }, Bios: &models.V1MachineBIOS{ - Date: pointer.Pointer("biosdata"), - Vendor: pointer.Pointer("biosvendor"), - Version: pointer.Pointer("biosversion"), + Date: new("biosdata"), + Vendor: new("biosvendor"), + Version: new("biosversion"), }, Description: "firewall 1", Events: &models.V1MachineRecentProvisioningEvents{ - CrashLoop: pointer.Pointer(false), - FailedMachineReclaim: pointer.Pointer(false), + CrashLoop: new(false), + FailedMachineReclaim: new(false), LastErrorEvent: &models.V1MachineProvisioningEvent{ - Event: pointer.Pointer("Crashed"), + Event: new("Crashed"), Message: "crash", Time: strfmt.DateTime(testTime.Add(-10 * 24 * time.Hour)), }, LastEventTime: strfmt.DateTime(testTime.Add(-7 * 24 * time.Hour)), Log: []*models.V1MachineProvisioningEvent{ { - Event: pointer.Pointer("Phoned Home"), + Event: new("Phoned Home"), Message: "phoning home", Time: strfmt.DateTime(testTime.Add(-7 * 24 * time.Hour)), }, }, }, Hardware: &models.V1MachineHardware{ - CPUCores: pointer.Pointer(int32(16)), + CPUCores: new(int32(16)), Disks: []*models.V1MachineBlockDevice{}, - Memory: pointer.Pointer(int64(32)), + Memory: new(int64(32)), Nics: []*models.V1MachineNic{}, }, - ID: pointer.Pointer("1"), + ID: new("1"), Ledstate: &models.V1ChassisIdentifyLEDState{ - Description: pointer.Pointer(""), - Value: pointer.Pointer(""), + Description: new(""), + Value: new(""), }, - Liveliness: pointer.Pointer("Alive"), + Liveliness: new("Alive"), Name: "firewall-1", Partition: partition1, Rackid: "rack-1", Size: size1, State: &models.V1MachineState{ - Description: pointer.Pointer("state"), + Description: new("state"), Issuer: "issuer", - MetalHammerVersion: pointer.Pointer("version"), - Value: pointer.Pointer(""), + MetalHammerVersion: new("version"), + Value: new(""), }, Tags: []string{"a"}, } @@ -105,82 +105,82 @@ var ( return &models.V1FirewallResponse{ Allocation: &models.V1MachineAllocation{ BootInfo: &models.V1BootInfo{ - Bootloaderid: pointer.Pointer("bootloaderid"), - Cmdline: pointer.Pointer("cmdline"), - ImageID: pointer.Pointer("imageid"), - Initrd: pointer.Pointer("initrd"), - Kernel: pointer.Pointer("kernel"), - OsPartition: pointer.Pointer("ospartition"), - PrimaryDisk: pointer.Pointer("primarydisk"), + Bootloaderid: new("bootloaderid"), + Cmdline: new("cmdline"), + ImageID: new("imageid"), + Initrd: new("initrd"), + Kernel: new("kernel"), + OsPartition: new("ospartition"), + PrimaryDisk: new("primarydisk"), }, - Created: pointer.Pointer(strfmt.DateTime(testTime)), - Creator: pointer.Pointer("creator"), + Created: new(strfmt.DateTime(testTime)), + Creator: new("creator"), Description: "firewall allocation 2", Filesystemlayout: fsl1, - Hostname: pointer.Pointer("firewall-hostname-2"), + Hostname: new("firewall-hostname-2"), Image: image1, - Name: pointer.Pointer("firewall-2"), + Name: new("firewall-2"), Networks: []*models.V1MachineNetwork{ { - Asn: pointer.Pointer(int64(200)), + Asn: new(int64(200)), Destinationprefixes: []string{"2.2.2.2"}, Ips: []string{"1.1.1.1"}, - Nat: pointer.Pointer(false), - Networkid: pointer.Pointer("private"), + Nat: new(false), + Networkid: new("private"), Networktype: pointer.Pointer(net.PrivatePrimaryUnshared), Prefixes: []string{"prefixes"}, - Private: pointer.Pointer(true), - Underlay: pointer.Pointer(false), - Vrf: pointer.Pointer(int64(100)), + Private: new(true), + Underlay: new(false), + Vrf: new(int64(100)), }, }, - Project: pointer.Pointer("project-1"), - Reinstall: pointer.Pointer(false), + Project: new("project-1"), + Reinstall: new(false), Role: pointer.Pointer(models.V1MachineAllocationRoleFirewall), SSHPubKeys: []string{"sshpubkey"}, - Succeeded: pointer.Pointer(true), + Succeeded: new(true), UserData: "---userdata---", }, Bios: &models.V1MachineBIOS{ - Date: pointer.Pointer("biosdata"), - Vendor: pointer.Pointer("biosvendor"), - Version: pointer.Pointer("biosversion"), + Date: new("biosdata"), + Vendor: new("biosvendor"), + Version: new("biosversion"), }, Description: "firewall 2", Events: &models.V1MachineRecentProvisioningEvents{ - CrashLoop: pointer.Pointer(false), - FailedMachineReclaim: pointer.Pointer(false), + CrashLoop: new(false), + FailedMachineReclaim: new(false), LastErrorEvent: &models.V1MachineProvisioningEvent{}, LastEventTime: strfmt.DateTime(testTime.Add(-1 * time.Minute)), Log: []*models.V1MachineProvisioningEvent{ { - Event: pointer.Pointer(event), + Event: new(event), Message: message, Time: strfmt.DateTime(testTime.Add(-7 * 24 * time.Hour)), }, }, }, Hardware: &models.V1MachineHardware{ - CPUCores: pointer.Pointer(int32(16)), + CPUCores: new(int32(16)), Disks: []*models.V1MachineBlockDevice{}, - Memory: pointer.Pointer(int64(32)), + Memory: new(int64(32)), Nics: []*models.V1MachineNic{}, }, - ID: pointer.Pointer("2"), + ID: new("2"), Ledstate: &models.V1ChassisIdentifyLEDState{ - Description: pointer.Pointer(""), - Value: pointer.Pointer(""), + Description: new(""), + Value: new(""), }, - Liveliness: pointer.Pointer("Alive"), + Liveliness: new("Alive"), Name: "firewall-2", Partition: partition1, Rackid: "rack-1", Size: size1, State: &models.V1MachineState{ - Description: pointer.Pointer("state"), + Description: new("state"), Issuer: "issuer", - MetalHammerVersion: pointer.Pointer("version"), - Value: pointer.Pointer(""), + MetalHammerVersion: new("version"), + Value: new(""), }, Tags: []string{"b"}, } @@ -195,43 +195,43 @@ var ( Description: "fsl 1", Disks: []*models.V1Disk{ { - Device: pointer.Pointer("/dev/sda"), + Device: new("/dev/sda"), Partitions: []*models.V1DiskPartition{ { - Gpttype: pointer.Pointer("ef00"), + Gpttype: new("ef00"), Label: "efi", - Number: pointer.Pointer(int64(1)), - Size: pointer.Pointer(int64(1000)), + Number: new(int64(1)), + Size: new(int64(1000)), }, }, - Wipeonreinstall: pointer.Pointer(true), + Wipeonreinstall: new(true), }, }, Filesystems: []*models.V1Filesystem{ { Createoptions: []string{"-F 32"}, - Device: pointer.Pointer("/dev/sda1"), - Format: pointer.Pointer("vfat"), + Device: new("/dev/sda1"), + Format: new("vfat"), Label: "efi", Mountoptions: []string{"noexec"}, Path: "/boot/efi", }, { Createoptions: []string{}, - Device: pointer.Pointer("tmpfs"), - Format: pointer.Pointer("tmpfs"), + Device: new("tmpfs"), + Format: new("tmpfs"), Label: "", Mountoptions: []string{"noexec"}, Path: "/tmp", }, }, - ID: pointer.Pointer("1"), + ID: new("1"), Logicalvolumes: []*models.V1LogicalVolume{ { - Lvmtype: pointer.Pointer("linear"), - Name: pointer.Pointer("varlib"), - Size: pointer.Pointer(int64(5000)), - Volumegroup: pointer.Pointer("lvm"), + Lvmtype: new("linear"), + Name: new("varlib"), + Size: new(int64(5000)), + Volumegroup: new("lvm"), }, }, Name: "fsl1", @@ -239,18 +239,18 @@ var ( Volumegroups: []*models.V1VolumeGroup{ { Devices: []string{"/dev/nvme0n1"}, - Name: pointer.Pointer("lvm"), + Name: new("lvm"), Tags: []string{}, }, }, } - imageExpiration = pointer.Pointer(strfmt.DateTime(testTime.Add(3 * 24 * time.Hour))) + imageExpiration = new(strfmt.DateTime(testTime.Add(3 * 24 * time.Hour))) image1 = &models.V1ImageResponse{ Classification: "supported", Description: "firewall-image-description", ExpirationDate: imageExpiration, Features: []string{"firewall"}, - ID: pointer.Pointer("firewall-ubuntu-2.0"), + ID: new("firewall-ubuntu-2.0"), Name: "firewall-image-name", URL: "firewall-image-url", } @@ -261,7 +261,7 @@ var ( Kernelurl: "kernelurl", }, Description: "partition 1", - ID: pointer.Pointer("1"), + ID: new("1"), Mgmtserviceaddress: "mgmt", Name: "partition-1", } @@ -270,42 +270,42 @@ var ( { Max: int64(2), Min: int64(1), - Type: pointer.Pointer("storage"), + Type: new("storage"), }, { Max: int64(4), Min: int64(3), - Type: pointer.Pointer("memory"), + Type: new("memory"), }, { Max: int64(6), Min: int64(5), - Type: pointer.Pointer("cores"), + Type: new("cores"), }, }, Description: "size 1", - ID: pointer.Pointer("1"), + ID: new("1"), Name: "size-1", } network1 = &models.V1NetworkResponse{ Description: "network 1", Destinationprefixes: []string{"dest"}, - ID: pointer.Pointer("nw1"), + ID: new("nw1"), Labels: map[string]string{"a": "b"}, Name: "network-1", - Nat: pointer.Pointer(true), + Nat: new(true), Parentnetworkid: "", Partitionid: "partition-1", Prefixes: []string{"prefix"}, - Privatesuper: pointer.Pointer(true), + Privatesuper: new(true), Projectid: "", Shared: false, - Underlay: pointer.Pointer(true), + Underlay: new(true), Usage: &models.V1NetworkUsage{ - AvailableIps: pointer.Pointer(int64(100)), - AvailablePrefixes: pointer.Pointer(int64(200)), - UsedIps: pointer.Pointer(int64(300)), - UsedPrefixes: pointer.Pointer(int64(400)), + AvailableIps: new(int64(100)), + AvailablePrefixes: new(int64(200)), + UsedIps: new(int64(300)), + UsedPrefixes: new(int64(400)), }, Vrf: 50, Vrfshared: true,