Chore: Add additional builder validation tests (#95518)

This commit is contained in:
Todd Treece
2024-10-29 01:42:10 +01:00
committed by GitHub
parent 9f2da249fd
commit 4508d6c143
2 changed files with 80 additions and 11 deletions

View File

@@ -7,8 +7,6 @@ import (
"k8s.io/apiserver/pkg/admission" "k8s.io/apiserver/pkg/admission"
) )
const PluginName = "GrafanaAdmission"
type builderAdmission struct { type builderAdmission struct {
validators map[schema.GroupVersion]APIGroupValidation validators map[schema.GroupVersion]APIGroupValidation
} }

View File

@@ -13,12 +13,12 @@ import (
func TestBuilderAdmission_Validate(t *testing.T) { func TestBuilderAdmission_Validate(t *testing.T) {
gvk := schema.GroupVersionKind{ gvk := schema.GroupVersionKind{
Group: "testGroup", Group: "example.grafana.app",
Version: "v1", Version: "v1",
Kind: "testKind", Kind: "Foo",
} }
gvr := gvk.GroupVersion().WithResource("testkinds") gvr := gvk.GroupVersion().WithResource("foos")
defaultAttributes := admission.NewAttributesRecord(nil, nil, gvk, "", "", gvr, "", admission.Create, nil, false, nil) defaultAttributes := admission.NewAttributesRecord(nil, nil, gvk, "default", "foo", gvr, "", admission.Create, nil, false, nil)
tests := []struct { tests := []struct {
name string name string
validators map[schema.GroupVersion]builder.APIGroupValidation validators map[schema.GroupVersion]builder.APIGroupValidation
@@ -28,7 +28,7 @@ func TestBuilderAdmission_Validate(t *testing.T) {
{ {
name: "validator exists - forbidden", name: "validator exists - forbidden",
validators: map[schema.GroupVersion]builder.APIGroupValidation{ validators: map[schema.GroupVersion]builder.APIGroupValidation{
{Group: "testGroup", Version: "v1"}: &mockValidator{ gvk.GroupVersion(): &mockValidator{
validateFunc: func(ctx context.Context, a admission.Attributes, o admission.ObjectInterfaces) error { validateFunc: func(ctx context.Context, a admission.Attributes, o admission.ObjectInterfaces) error {
return admission.NewForbidden(a, errors.New("test error")) return admission.NewForbidden(a, errors.New("test error"))
}, },
@@ -40,7 +40,7 @@ func TestBuilderAdmission_Validate(t *testing.T) {
{ {
name: "validator exists - allowed", name: "validator exists - allowed",
validators: map[schema.GroupVersion]builder.APIGroupValidation{ validators: map[schema.GroupVersion]builder.APIGroupValidation{
{Group: "testGroup", Version: "v1"}: &mockValidator{ gvk.GroupVersion(): &mockValidator{
validateFunc: func(ctx context.Context, a admission.Attributes, o admission.ObjectInterfaces) error { validateFunc: func(ctx context.Context, a admission.Attributes, o admission.ObjectInterfaces) error {
return nil return nil
}, },
@@ -50,16 +50,32 @@ func TestBuilderAdmission_Validate(t *testing.T) {
wantErr: false, wantErr: false,
}, },
{ {
name: "validator does not exist", name: "validator does not exist",
validators: map[schema.GroupVersion]builder.APIGroupValidation{},
attributes: defaultAttributes,
wantErr: false,
},
{
name: "multiple validators",
validators: map[schema.GroupVersion]builder.APIGroupValidation{ validators: map[schema.GroupVersion]builder.APIGroupValidation{
{Group: "testGroup", Version: "v1"}: &mockValidator{ {Group: "example.grafana.app", Version: "v1beta"}: &mockValidator{
validateFunc: func(ctx context.Context, a admission.Attributes, o admission.ObjectInterfaces) error {
return nil
},
},
gvk.GroupVersion(): &mockValidator{
validateFunc: func(ctx context.Context, a admission.Attributes, o admission.ObjectInterfaces) error {
return admission.NewForbidden(a, errors.New("test error"))
},
},
{Group: "example.grafana.app", Version: "v2"}: &mockValidator{
validateFunc: func(ctx context.Context, a admission.Attributes, o admission.ObjectInterfaces) error { validateFunc: func(ctx context.Context, a admission.Attributes, o admission.ObjectInterfaces) error {
return nil return nil
}, },
}, },
}, },
attributes: defaultAttributes, attributes: defaultAttributes,
wantErr: false, wantErr: true,
}, },
} }
@@ -76,6 +92,61 @@ func TestBuilderAdmission_Validate(t *testing.T) {
} }
} }
func TestNewAdmissionFromBuilders(t *testing.T) {
gvk := schema.GroupVersionKind{
Group: "example.grafana.app",
Version: "v1",
Kind: "Foo",
}
gvr := gvk.GroupVersion().WithResource("foos")
defaultAttributes := admission.NewAttributesRecord(nil, nil, gvk, "default", "foo", gvr, "", admission.Create, nil, false, nil)
builders := []builder.APIGroupBuilder{
&mockBuilder{
groupVersion: schema.GroupVersion{Group: "example.grafana.app", Version: "v1beta"},
validator: &mockValidator{
validateFunc: func(ctx context.Context, a admission.Attributes, o admission.ObjectInterfaces) error {
return nil
},
},
},
&mockBuilder{
groupVersion: gvk.GroupVersion(),
validator: &mockValidator{
validateFunc: func(ctx context.Context, a admission.Attributes, o admission.ObjectInterfaces) error {
return admission.NewForbidden(a, errors.New("test error"))
},
},
},
&mockBuilder{
groupVersion: schema.GroupVersion{Group: "example.grafana.app", Version: "v2"},
validator: &mockValidator{
validateFunc: func(ctx context.Context, a admission.Attributes, o admission.ObjectInterfaces) error {
return nil
},
},
},
}
a := builder.NewAdmissionFromBuilders(builders)
err := a.Validate(context.Background(), defaultAttributes, nil)
require.Error(t, err)
}
type mockBuilder struct {
builder.APIGroupBuilder
groupVersion schema.GroupVersion
validator builder.APIGroupValidation
}
func (m *mockBuilder) GetGroupVersion() schema.GroupVersion {
return m.groupVersion
}
func (m *mockBuilder) Validate(ctx context.Context, a admission.Attributes, o admission.ObjectInterfaces) error {
return m.validator.Validate(ctx, a, o)
}
type mockValidator struct { type mockValidator struct {
validateFunc func(ctx context.Context, a admission.Attributes, o admission.ObjectInterfaces) error validateFunc func(ctx context.Context, a admission.Attributes, o admission.ObjectInterfaces) error
} }