-
Notifications
You must be signed in to change notification settings - Fork 83
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #3668 from cyclinder/spidercliamparameter/webhook
spiderclaimparameter: add webhook to verify the create and update
- Loading branch information
Showing
10 changed files
with
405 additions
and
13 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
17 changes: 16 additions & 1 deletion
17
pkg/k8s/apis/spiderpool.spidernet.io/v2beta1/zz_generated.deepcopy.go
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
128 changes: 128 additions & 0 deletions
128
pkg/manager/spidercliamparameter/spidercliamparameter_webhook.go
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,128 @@ | ||
// Copyright 2022 Authors of spidernet-io | ||
// SPDX-License-Identifier: Apache-2.0 | ||
|
||
package spidercliamparameter | ||
|
||
import ( | ||
"context" | ||
"fmt" | ||
|
||
"go.uber.org/zap" | ||
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" | ||
"sigs.k8s.io/controller-runtime/pkg/client" | ||
"sigs.k8s.io/controller-runtime/pkg/webhook" | ||
"sigs.k8s.io/controller-runtime/pkg/webhook/admission" | ||
|
||
"github.com/spidernet-io/spiderpool/pkg/constant" | ||
spiderpoolv2beta1 "github.com/spidernet-io/spiderpool/pkg/k8s/apis/spiderpool.spidernet.io/v2beta1" | ||
"github.com/spidernet-io/spiderpool/pkg/logutils" | ||
) | ||
|
||
var logger *zap.Logger | ||
|
||
type SpiderClaimParameterManager interface { | ||
admission.CustomDefaulter | ||
admission.CustomValidator | ||
} | ||
|
||
type spiderClaimParameterWebhook struct { | ||
Client client.Client | ||
APIReader client.Reader | ||
} | ||
|
||
func New(client client.Client, apiReader client.Reader, mgr ctrl.Manager) error { | ||
if logger == nil { | ||
logger = logutils.Logger.Named("SpiderClaimParameter-Webhook") | ||
} | ||
|
||
scpm := &spiderClaimParameterWebhook{ | ||
Client: client, | ||
APIReader: apiReader, | ||
} | ||
|
||
return ctrl.NewWebhookManagedBy(mgr). | ||
For(&spiderpoolv2beta1.SpiderClaimParameter{}). | ||
WithDefaulter(scpm). | ||
WithValidator(scpm). | ||
Complete() | ||
} | ||
|
||
var _ webhook.CustomValidator = &spiderClaimParameterWebhook{} | ||
|
||
// Default implements admission.CustomDefaulter. | ||
func (*spiderClaimParameterWebhook) Default(ctx context.Context, obj runtime.Object) error { | ||
return nil | ||
} | ||
|
||
func (scpm *spiderClaimParameterWebhook) ValidateCreate(ctx context.Context, obj runtime.Object) (admission.Warnings, error) { | ||
scp := obj.(*spiderpoolv2beta1.SpiderClaimParameter) | ||
|
||
log := logger.Named("Validating").With( | ||
zap.String("SpiderClaimParameter", fmt.Sprintf("%s/%s", scp.Namespace, scp.Name)), | ||
zap.String("Operation", "CREATE"), | ||
) | ||
log.Sugar().Debugf("Request SpiderClaimParameter: %+v", *scp) | ||
|
||
err := scpm.validate(scp) | ||
if err != nil { | ||
log.Error(err.Error()) | ||
return nil, apierrors.NewInvalid( | ||
spiderpoolv2beta1.SchemeGroupVersion.WithKind(constant.KindSpiderClaimParameter).GroupKind(), | ||
scp.Name, | ||
field.ErrorList{err}, | ||
) | ||
} | ||
|
||
return nil, nil | ||
} | ||
|
||
func (scpm *spiderClaimParameterWebhook) ValidateUpdate(ctx context.Context, oldObj, newObj runtime.Object) (admission.Warnings, error) { | ||
new := newObj.(*spiderpoolv2beta1.SpiderClaimParameter) | ||
|
||
log := logger.Named("Validating").With( | ||
zap.String("SpiderClaimParameter", fmt.Sprintf("%s/%s", new.Namespace, new.Name)), | ||
zap.String("Operation", "UPDATE"), | ||
) | ||
log.Sugar().Debugf("Request new SpiderClaimParameter: %+v", *new) | ||
|
||
err := scpm.validate(new) | ||
if err != nil { | ||
log.Error(err.Error()) | ||
return nil, apierrors.NewInvalid( | ||
spiderpoolv2beta1.SchemeGroupVersion.WithKind(constant.KindSpiderClaimParameter).GroupKind(), | ||
new.Name, | ||
field.ErrorList{err}, | ||
) | ||
} | ||
|
||
return nil, nil | ||
} | ||
|
||
// ValidateDelete will implement something just like kubernetes Foreground cascade deletion to delete the MultusConfig corresponding net-attach-def firstly | ||
// Since the MultusConf doesn't have Finalizer, you could delete it as soon as possible and we can't filter it to delete the net-attach-def at first. | ||
func (scpm *spiderClaimParameterWebhook) ValidateDelete(ctx context.Context, obj runtime.Object) (admission.Warnings, error) { | ||
return nil, nil | ||
} | ||
|
||
// check the existence of SpiderMultusConfig in the StaticNics | ||
func (scpm *spiderClaimParameterWebhook) validate(scp *spiderpoolv2beta1.SpiderClaimParameter) *field.Error { | ||
if scp == nil { | ||
return field.Required(nil, "SpiderClaimParameter is nil") | ||
} | ||
|
||
for idx, nic := range scp.Spec.StaticNics { | ||
if nic.MultusConfigName == "" { | ||
return field.Invalid(field.NewPath("Spec").Child("StaticNics", fmt.Sprintf("[%v].MultusConfigName", idx)), nic, "value should not be empty") | ||
} | ||
|
||
var smc spiderpoolv2beta1.SpiderMultusConfig | ||
if err := scpm.APIReader.Get(context.TODO(), client.ObjectKey{Name: nic.MultusConfigName, Namespace: nic.Namespace}, &smc); err != nil { | ||
return field.Invalid(field.NewPath("Spec").Child("StaticNics", fmt.Sprintf("[%v]", idx)), nic, fmt.Sprintf("error get spidermultusconfig %v: %v", nic, err)) | ||
} | ||
} | ||
|
||
return nil | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
# E2E Cases for spiderclaimparameter | ||
|
||
| Case ID | Title | Priority | Smoke | Status | Other | | ||
| ------- | ------| -------- | ----- | ------ | ----- | | ||
| Y00001 | test create spiderclaimparameter | p3 | | done | | ||
| Y00002 | test create spiderclaimparameter for empty staticNics | p3 | | done | | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
35 changes: 35 additions & 0 deletions
35
test/e2e/spiderclaimparameter/spiderclaimparameter_suite_test.go
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,35 @@ | ||
// Copyright 2024 Authors of spidernet-io | ||
// SPDX-License-Identifier: Apache-2.0 | ||
package spiderclaimparameter_test | ||
|
||
import ( | ||
"testing" | ||
|
||
. "github.com/onsi/ginkgo/v2" | ||
. "github.com/onsi/gomega" | ||
e2e "github.com/spidernet-io/e2eframework/framework" | ||
spiderpool "github.com/spidernet-io/spiderpool/pkg/k8s/apis/spiderpool.spidernet.io/v2beta1" | ||
"github.com/spidernet-io/spiderpool/test/e2e/common" | ||
"k8s.io/api/resource/v1alpha2" | ||
|
||
"k8s.io/apimachinery/pkg/runtime" | ||
) | ||
|
||
func TestSpiderclaimparameter(t *testing.T) { | ||
RegisterFailHandler(Fail) | ||
RunSpecs(t, "Spiderclaimparameter Suite") | ||
} | ||
|
||
var frame *e2e.Framework | ||
|
||
var _ = BeforeSuite(func() { | ||
if !common.IsDRAEnabled() { | ||
GinkgoWriter.Println("DRA feature is disabled. Skip") | ||
Skip("DRA feature is disabled. Skip") | ||
} | ||
|
||
defer GinkgoRecover() | ||
var e error | ||
frame, e = e2e.NewFramework(GinkgoT(), []func(*runtime.Scheme) error{spiderpool.AddToScheme, v1alpha2.AddToScheme}) | ||
Expect(e).NotTo(HaveOccurred()) | ||
}) |
Oops, something went wrong.