Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion .golangci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,8 @@ linters:
staticcheck:
# Default: ["all", "-ST1000", "-ST1003", "-ST1016", "-ST1020", "-ST1021", "-ST1022"]
# Disabled QF1008 ("Omit embedded fields from selector expression"): using embedded fields is often more readable.
checks: ["all", "-ST1000", "-ST1003", "-ST1016", "-ST1020", "-ST1021", "-ST1022", "-QF1008"]
# Disabled SA1019 ("Using a deprecated function, variable, constant or field"): We need time to migrate to the new way.
checks: ["all", "-ST1000", "-ST1003", "-ST1016", "-SA1019", "-ST1020", "-ST1021", "-ST1022", "-QF1008"]
exclusions:
paths:
- ".*/zz_generated.*\\.go$"
Expand Down
3 changes: 1 addition & 2 deletions cmd/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -217,8 +217,7 @@ func main() {
}
//+kubebuilder:scaffold:builder

if err = ctrl.NewWebhookManagedBy(mgr).
For(&storagev1.StorageClass{}).
if err = ctrl.NewWebhookManagedBy(mgr, &storagev1.StorageClass{}).
WithValidator(&piraeuswebhook.StorageClass{}).
Complete(); err != nil {
setupLog.Error(err, "unable to create webhook", "webhook", "StorageClass")
Expand Down
2 changes: 1 addition & 1 deletion docs/how-to/external-cluster-api.md
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ The following commands create a `piraeus-clusterapi.kubeconfig` file.
```
$ export KUBECONFIG=management.kubeconfig
$ export KUBENS=workload-cluster-ns
$ TOKEN="$(kubectl --namespace=$KUBENS create token piraeus-operator)"
$ TOKEN="$(kubectl --namespace=$KUBENS create token piraeus-operator --duration=87600h)"
$ kubectl config view --flatten --minify -ojson | jq --arg TOKEN "$TOKEN" '.users[0].user = {"token": $TOKEN}' > piraeus-clusterapi.kubeconfig
```

Expand Down
4 changes: 2 additions & 2 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ require (
k8s.io/component-helpers v0.35.0
k8s.io/utils v0.0.0-20251002143259-bc988d571ff4
sigs.k8s.io/cluster-api v1.12.1
sigs.k8s.io/controller-runtime v0.22.4
sigs.k8s.io/controller-runtime v0.23.0
sigs.k8s.io/kustomize/api v0.21.0
sigs.k8s.io/kustomize/kyaml v0.21.0
sigs.k8s.io/yaml v1.6.0
Expand Down Expand Up @@ -80,7 +80,7 @@ require (
github.com/prometheus/client_model v0.6.2 // indirect
github.com/prometheus/common v0.67.5 // indirect
github.com/prometheus/procfs v0.19.2 // indirect
github.com/sirupsen/logrus v1.9.3 // indirect
github.com/sirupsen/logrus v1.9.4 // indirect
github.com/spf13/pflag v1.0.10 // indirect
github.com/stretchr/objx v0.5.3 // indirect
github.com/x448/float16 v0.8.4 // indirect
Expand Down
9 changes: 4 additions & 5 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -170,8 +170,8 @@ github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7
github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo=
github.com/sergi/go-diff v1.4.0 h1:n/SP9D5ad1fORl+llWyN+D6qoUETXNZARKjyY2/KVCw=
github.com/sergi/go-diff v1.4.0/go.mod h1:A0bzQcvG0E7Rwjx0REVgAGH58e96+X0MeOfepqsbeW4=
github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ=
github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
github.com/sirupsen/logrus v1.9.4 h1:TsZE7l11zFCLZnZ+teH4Umoq5BhEIfIzfRDZ1Uzql2w=
github.com/sirupsen/logrus v1.9.4/go.mod h1:ftWc9WdOfJ0a92nsE2jF5u5ZwH8Bv2zdeOC42RjbV2g=
github.com/spf13/pflag v1.0.10 h1:4EBh2KAYBwaONj6b2Ye1GiHfwjqyROoF4RwYO+vPwFk=
github.com/spf13/pflag v1.0.10/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
Expand Down Expand Up @@ -241,7 +241,6 @@ golang.org/x/sync v0.19.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
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.39.0 h1:RclSuaJf32jOqZz74CkPA9qFuVTX7vhLlpfj/IGWlqY=
Expand Down Expand Up @@ -305,8 +304,8 @@ moul.io/http2curl/v2 v2.3.0 h1:9r3JfDzWPcbIklMOs2TnIFzDYvfAZvjeavG6EzP7jYs=
moul.io/http2curl/v2 v2.3.0/go.mod h1:RW4hyBjTWSYDOxapodpNEtX0g5Eb16sxklBqmd2RHcE=
sigs.k8s.io/cluster-api v1.12.1 h1:s3DivSZjXdu2HPyOtV/n6XwSZBaIycZdKNs4y8X+3lY=
sigs.k8s.io/cluster-api v1.12.1/go.mod h1:+S6WJdi8UPdqv5q9nka5al3ed/Qa0zAcSBgzTaa9VKA=
sigs.k8s.io/controller-runtime v0.22.4 h1:GEjV7KV3TY8e+tJ2LCTxUTanW4z/FmNB7l327UfMq9A=
sigs.k8s.io/controller-runtime v0.22.4/go.mod h1:+QX1XUpTXN4mLoblf4tqr5CQcyHPAki2HLXqQMY6vh8=
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/gateway-api v1.4.1 h1:NPxFutNkKNa8UfLd2CMlEuhIPMQgDQ6DXNKG9sHbJU8=
sigs.k8s.io/gateway-api v1.4.1/go.mod h1:AR5RSqciWP98OPckEjOjh2XJhAe2Na4LHyXD2FUY7Qk=
sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730 h1:IpInykpT6ceI+QxKBbEflcR5EXP7sU1kvOlxwZh5txg=
Expand Down
21 changes: 9 additions & 12 deletions internal/webhook/storageclass.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,6 @@ import (
"github.com/piraeusdatastore/linstor-csi/pkg/volume"
storagev1 "k8s.io/api/storage/v1"
apierrors "k8s.io/apimachinery/pkg/api/errors"
"k8s.io/apimachinery/pkg/api/meta"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/runtime/schema"
"k8s.io/apimachinery/pkg/util/validation/field"
"sigs.k8s.io/controller-runtime/pkg/webhook/admission"
)
Expand All @@ -18,27 +15,27 @@ import (

type StorageClass struct{}

func (s *StorageClass) ValidateCreate(ctx context.Context, obj runtime.Object) (admission.Warnings, error) {
warnings, errs := s.validate(nil, obj.(*storagev1.StorageClass))
var _ admission.Validator[*storagev1.StorageClass] = &StorageClass{}

func (s *StorageClass) ValidateCreate(ctx context.Context, sc *storagev1.StorageClass) (admission.Warnings, error) {
warnings, errs := s.validate(nil, sc)
if len(errs) != 0 {
accessor, _ := meta.Accessor(obj)
return warnings, apierrors.NewInvalid(schema.GroupKind{Group: storagev1.GroupName, Kind: "StorageClass"}, accessor.GetName(), errs)
return warnings, apierrors.NewInvalid(sc.GroupVersionKind().GroupKind(), sc.GetName(), errs)
}

return warnings, nil
}

func (s *StorageClass) ValidateUpdate(ctx context.Context, oldObj, newObj runtime.Object) (admission.Warnings, error) {
warnings, errs := s.validate(oldObj.(*storagev1.StorageClass), newObj.(*storagev1.StorageClass))
func (s *StorageClass) ValidateUpdate(ctx context.Context, oldSC, newSC *storagev1.StorageClass) (admission.Warnings, error) {
warnings, errs := s.validate(oldSC, newSC)
if len(errs) != 0 {
accessor, _ := meta.Accessor(newObj)
return warnings, apierrors.NewInvalid(schema.GroupKind{Group: storagev1.GroupName, Kind: "StorageClass"}, accessor.GetName(), errs)
return warnings, apierrors.NewInvalid(newSC.GroupVersionKind().GroupKind(), newSC.GetName(), errs)
}

return warnings, nil
}

func (s *StorageClass) ValidateDelete(ctx context.Context, obj runtime.Object) (admission.Warnings, error) {
func (s *StorageClass) ValidateDelete(ctx context.Context, sc *storagev1.StorageClass) (admission.Warnings, error) {
return nil, nil
}

Expand Down
30 changes: 6 additions & 24 deletions internal/webhook/v1/linstorcluster_webhook.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,16 +18,13 @@ package v1

import (
"context"
"fmt"
"net/url"
"strconv"

apierrors "k8s.io/apimachinery/pkg/api/errors"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/util/validation/field"
ctrl "sigs.k8s.io/controller-runtime"
logf "sigs.k8s.io/controller-runtime/pkg/log"
"sigs.k8s.io/controller-runtime/pkg/webhook"
"sigs.k8s.io/controller-runtime/pkg/webhook/admission"

piraeusiov1 "github.com/piraeusdatastore/piraeus-operator/v2/api/v1"
Expand All @@ -36,7 +33,7 @@ import (
var linstorclusterlog = logf.Log.WithName("linstorcluster-resource")

func SetupLinstorClusterWebhookWithManager(mgr ctrl.Manager) error {
return ctrl.NewWebhookManagedBy(mgr).For(&piraeusiov1.LinstorCluster{}).
return ctrl.NewWebhookManagedBy(mgr, &piraeusiov1.LinstorCluster{}).
WithValidator(&LinstorClusterCustomValidator{}).
Complete()
}
Expand All @@ -45,14 +42,9 @@ func SetupLinstorClusterWebhookWithManager(mgr ctrl.Manager) error {

type LinstorClusterCustomValidator struct{}

var _ webhook.CustomValidator = &LinstorClusterCustomValidator{}

func (r *LinstorClusterCustomValidator) ValidateCreate(ctx context.Context, obj runtime.Object) (admission.Warnings, error) {
linstorCluster, ok := obj.(*piraeusiov1.LinstorCluster)
if !ok {
return nil, fmt.Errorf("expected LinstorCluster but got %T", obj)
}
var _ admission.Validator[*piraeusiov1.LinstorCluster] = &LinstorClusterCustomValidator{}

func (r *LinstorClusterCustomValidator) ValidateCreate(ctx context.Context, linstorCluster *piraeusiov1.LinstorCluster) (admission.Warnings, error) {
linstorclusterlog.Info("validate create", "name", linstorCluster.GetName())

warnings, errs := r.validate(linstorCluster, nil)
Expand All @@ -63,28 +55,18 @@ func (r *LinstorClusterCustomValidator) ValidateCreate(ctx context.Context, obj
return warnings, nil
}

func (r *LinstorClusterCustomValidator) ValidateUpdate(ctx context.Context, obj, old runtime.Object) (admission.Warnings, error) {
linstorCluster, ok := obj.(*piraeusiov1.LinstorCluster)
if !ok {
return nil, fmt.Errorf("expected LinstorCluster but got %T", obj)
}

func (r *LinstorClusterCustomValidator) ValidateUpdate(ctx context.Context, oldLinstorCluster, linstorCluster *piraeusiov1.LinstorCluster) (admission.Warnings, error) {
linstorclusterlog.Info("validate update", "name", linstorCluster.GetName())

warnings, errs := r.validate(linstorCluster, old.(*piraeusiov1.LinstorCluster))
warnings, errs := r.validate(linstorCluster, oldLinstorCluster)
if len(errs) != 0 {
return warnings, apierrors.NewInvalid(linstorCluster.GroupVersionKind().GroupKind(), linstorCluster.GetName(), errs)
}

return warnings, nil
}

func (r *LinstorClusterCustomValidator) ValidateDelete(ctx context.Context, old runtime.Object) (admission.Warnings, error) {
linstorCluster, ok := old.(*piraeusiov1.LinstorCluster)
if !ok {
return nil, fmt.Errorf("expected LinstorCluster but got %T", old)
}

func (r *LinstorClusterCustomValidator) ValidateDelete(ctx context.Context, linstorCluster *piraeusiov1.LinstorCluster) (admission.Warnings, error) {
linstorclusterlog.Info("validate delete", "name", linstorCluster.GetName())

return nil, nil
Expand Down
29 changes: 6 additions & 23 deletions internal/webhook/v1/linstornodeconnection_webhook.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,11 +22,9 @@ import (
"strconv"

apierrors "k8s.io/apimachinery/pkg/api/errors"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/util/validation/field"
ctrl "sigs.k8s.io/controller-runtime"
logf "sigs.k8s.io/controller-runtime/pkg/log"
"sigs.k8s.io/controller-runtime/pkg/webhook"
"sigs.k8s.io/controller-runtime/pkg/webhook/admission"

piraeusv1 "github.com/piraeusdatastore/piraeus-operator/v2/api/v1"
Expand All @@ -35,7 +33,7 @@ import (
var linstornodeconnectionlog = logf.Log.WithName("linstornodeconnection-resource")

func SetupLinstorNodeConnectionWebhookWithManager(mgr ctrl.Manager) error {
return ctrl.NewWebhookManagedBy(mgr).For(&piraeusv1.LinstorNodeConnection{}).
return ctrl.NewWebhookManagedBy(mgr, &piraeusv1.LinstorNodeConnection{}).
WithValidator(&LinstorNodeConnectionCustomValidator{}).
Complete()
}
Expand All @@ -44,14 +42,9 @@ func SetupLinstorNodeConnectionWebhookWithManager(mgr ctrl.Manager) error {

type LinstorNodeConnectionCustomValidator struct{}

var _ webhook.CustomValidator = &LinstorNodeConnectionCustomValidator{}

func (r *LinstorNodeConnectionCustomValidator) ValidateCreate(ctx context.Context, obj runtime.Object) (admission.Warnings, error) {
nodeConnection, ok := obj.(*piraeusv1.LinstorNodeConnection)
if !ok {
return nil, apierrors.NewBadRequest(fmt.Sprintf("expected LinstorNodeConnection, got %T", obj))
}
var _ admission.Validator[*piraeusv1.LinstorNodeConnection] = &LinstorNodeConnectionCustomValidator{}

func (r *LinstorNodeConnectionCustomValidator) ValidateCreate(ctx context.Context, nodeConnection *piraeusv1.LinstorNodeConnection) (admission.Warnings, error) {
linstornodeconnectionlog.Info("validate create", "name", nodeConnection.GetName())

warnings, errs := r.validate(nodeConnection, nil)
Expand All @@ -62,28 +55,18 @@ func (r *LinstorNodeConnectionCustomValidator) ValidateCreate(ctx context.Contex
return warnings, nil
}

func (r *LinstorNodeConnectionCustomValidator) ValidateUpdate(ctx context.Context, obj, old runtime.Object) (admission.Warnings, error) {
nodeConnection, ok := obj.(*piraeusv1.LinstorNodeConnection)
if !ok {
return nil, apierrors.NewBadRequest(fmt.Sprintf("expected LinstorNodeConnection, got %T", obj))
}

func (r *LinstorNodeConnectionCustomValidator) ValidateUpdate(ctx context.Context, oldNodeConnection, nodeConnection *piraeusv1.LinstorNodeConnection) (admission.Warnings, error) {
linstornodeconnectionlog.Info("validate update", "name", nodeConnection.GetName())

warnings, errs := r.validate(nodeConnection, old.(*piraeusv1.LinstorNodeConnection))
warnings, errs := r.validate(nodeConnection, oldNodeConnection)
if len(errs) != 0 {
return warnings, apierrors.NewInvalid(nodeConnection.GroupVersionKind().GroupKind(), nodeConnection.GetName(), errs)
}

return warnings, nil
}

func (r *LinstorNodeConnectionCustomValidator) ValidateDelete(ctx context.Context, old runtime.Object) (admission.Warnings, error) {
nodeConnection, ok := old.(*piraeusv1.LinstorNodeConnection)
if !ok {
return nil, apierrors.NewBadRequest(fmt.Sprintf("expected LinstorNodeConnection, got %T", old))
}

func (r *LinstorNodeConnectionCustomValidator) ValidateDelete(ctx context.Context, nodeConnection *piraeusv1.LinstorNodeConnection) (admission.Warnings, error) {
linstornodeconnectionlog.Info("validate delete", "name", nodeConnection.GetName())

return nil, nil
Expand Down
29 changes: 6 additions & 23 deletions internal/webhook/v1/linstorsatellite_webhook.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,11 +22,9 @@ import (
"strconv"

apierrors "k8s.io/apimachinery/pkg/api/errors"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/util/validation/field"
ctrl "sigs.k8s.io/controller-runtime"
logf "sigs.k8s.io/controller-runtime/pkg/log"
"sigs.k8s.io/controller-runtime/pkg/webhook"
"sigs.k8s.io/controller-runtime/pkg/webhook/admission"

piraeusiov1 "github.com/piraeusdatastore/piraeus-operator/v2/api/v1"
Expand All @@ -35,7 +33,7 @@ import (
var linstorsatellitelog = logf.Log.WithName("linstorsatellite-resource")

func SetupLinstorSatelliteWebhookWithManager(mgr ctrl.Manager) error {
return ctrl.NewWebhookManagedBy(mgr).For(&piraeusiov1.LinstorSatellite{}).
return ctrl.NewWebhookManagedBy(mgr, &piraeusiov1.LinstorSatellite{}).
WithValidator(&LinstorSatelliteCustomValidator{}).
Complete()
}
Expand All @@ -44,15 +42,10 @@ func SetupLinstorSatelliteWebhookWithManager(mgr ctrl.Manager) error {

type LinstorSatelliteCustomValidator struct{}

var _ webhook.CustomValidator = &LinstorSatelliteCustomValidator{}
var _ admission.Validator[*piraeusiov1.LinstorSatellite] = &LinstorSatelliteCustomValidator{}

// ValidateCreate implements webhook.Validator so a webhook will be registered for the type
func (r *LinstorSatelliteCustomValidator) ValidateCreate(ctx context.Context, obj runtime.Object) (admission.Warnings, error) {
satellite, ok := obj.(*piraeusiov1.LinstorSatellite)
if !ok {
return nil, fmt.Errorf("expected LinstorSatellite but got %T", obj)
}

func (r *LinstorSatelliteCustomValidator) ValidateCreate(ctx context.Context, satellite *piraeusiov1.LinstorSatellite) (admission.Warnings, error) {
linstorsatellitelog.Info("validate create", "name", satellite.GetName())

warnings, errs := r.validate(satellite, nil)
Expand All @@ -64,15 +57,10 @@ func (r *LinstorSatelliteCustomValidator) ValidateCreate(ctx context.Context, ob
}

// ValidateUpdate implements webhook.Validator so a webhook will be registered for the type
func (r *LinstorSatelliteCustomValidator) ValidateUpdate(ctx context.Context, obj, old runtime.Object) (admission.Warnings, error) {
satellite, ok := obj.(*piraeusiov1.LinstorSatellite)
if !ok {
return nil, fmt.Errorf("expected LinstorSatellite but got %T", obj)
}

func (r *LinstorSatelliteCustomValidator) ValidateUpdate(ctx context.Context, oldSatellite, satellite *piraeusiov1.LinstorSatellite) (admission.Warnings, error) {
linstorsatellitelog.Info("validate update", "name", satellite.GetName())

warnings, errs := r.validate(satellite, old.(*piraeusiov1.LinstorSatellite))
warnings, errs := r.validate(satellite, oldSatellite)
if len(errs) != 0 {
return warnings, apierrors.NewInvalid(satellite.GroupVersionKind().GroupKind(), satellite.GetName(), errs)
}
Expand All @@ -81,12 +69,7 @@ func (r *LinstorSatelliteCustomValidator) ValidateUpdate(ctx context.Context, ob
}

// ValidateDelete implements webhook.Validator so a webhook will be registered for the type
func (r *LinstorSatelliteCustomValidator) ValidateDelete(ctx context.Context, old runtime.Object) (admission.Warnings, error) {
satellite, ok := old.(*piraeusiov1.LinstorSatellite)
if !ok {
return nil, fmt.Errorf("expected LinstorSatellite but got %T", old)
}

func (r *LinstorSatelliteCustomValidator) ValidateDelete(ctx context.Context, satellite *piraeusiov1.LinstorSatellite) (admission.Warnings, error) {
linstorsatellitelog.Info("validate delete", "name", satellite.GetName())

return nil, nil
Expand Down
Loading
Loading