Trim folder title (#98275)

This commit is contained in:
Leonor Oliveira 2024-12-19 17:56:14 +01:00 committed by GitHub
parent 123c860293
commit 58c44f6c66
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 218 additions and 0 deletions

View File

@ -5,6 +5,7 @@ import (
"errors"
"fmt"
"slices"
"strings"
"github.com/prometheus/client_golang/prometheus"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@ -238,6 +239,20 @@ var folderValidationRules = struct {
invalidNames: []string{"general"},
}
func (b *FolderAPIBuilder) Mutate(ctx context.Context, a admission.Attributes, _ admission.ObjectInterfaces) error {
verb := a.GetOperation()
if verb == admission.Create || verb == admission.Update {
obj := a.GetObject()
f, ok := obj.(*v0alpha1.Folder)
if !ok {
return fmt.Errorf("obj is not v0alpha1.Folder")
}
f.Spec.Title = strings.Trim(f.Spec.Title, "")
return nil
}
return nil
}
func (b *FolderAPIBuilder) Validate(ctx context.Context, a admission.Attributes, _ admission.ObjectInterfaces) error {
id := a.GetName()
obj := a.GetObject()

View File

@ -577,3 +577,206 @@ func TestFolderAPIBuilder_Validate_Update(t *testing.T) {
})
}
}
func TestFolderAPIBuilder_Mutate_Create(t *testing.T) {
tests := []struct {
name string
input *v0alpha1.Folder
expected *v0alpha1.Folder
wantErr bool
}{
{
name: "should trim a title",
input: &v0alpha1.Folder{
Spec: v0alpha1.Spec{
Title: " foo ",
},
TypeMeta: metav1.TypeMeta{
Kind: "Folder",
},
ObjectMeta: metav1.ObjectMeta{
Name: "valid-name",
},
},
expected: &v0alpha1.Folder{
Spec: v0alpha1.Spec{
Title: "foo",
},
TypeMeta: metav1.TypeMeta{
Kind: "Folder",
},
ObjectMeta: metav1.ObjectMeta{
Name: "valid-name",
},
},
},
{
name: "should return error if title doesnt exist",
input: &v0alpha1.Folder{
Spec: v0alpha1.Spec{},
TypeMeta: metav1.TypeMeta{
Kind: "Folder",
},
ObjectMeta: metav1.ObjectMeta{
Name: "valid-name",
},
},
wantErr: true,
},
{
name: "should return error if spec doesnt exist",
input: &v0alpha1.Folder{
TypeMeta: metav1.TypeMeta{
Kind: "Folder",
},
ObjectMeta: metav1.ObjectMeta{
Name: "valid-name",
},
},
wantErr: true,
},
}
s := (grafanarest.Storage)(nil)
m := &mock.Mock{}
us := storageMock{m, s}
sm := searcherMock{Mock: m}
b := &FolderAPIBuilder{
gv: resourceInfo.GroupVersion(),
features: nil,
namespacer: func(_ int64) string { return "123" },
folderSvc: foldertest.NewFakeService(),
storage: us,
accessControl: acimpl.ProvideAccessControl(featuremgmt.WithFeatures("nestedFolders"), zanzana.NewNoopClient()),
searcher: sm,
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
err := b.Validate(context.Background(), admission.NewAttributesRecord(
tt.input,
nil,
v0alpha1.SchemeGroupVersion.WithKind("folder"),
"stacks-123",
tt.input.Name,
v0alpha1.SchemeGroupVersion.WithResource("folders"),
"",
"CREATE",
nil,
true,
&user.SignedInUser{},
), nil)
if tt.wantErr {
require.Error(t, err)
return
}
require.NoError(t, err)
})
}
}
func TestFolderAPIBuilder_Mutate_Update(t *testing.T) {
existingObj := &v0alpha1.Folder{
Spec: v0alpha1.Spec{
Title: "some title",
},
TypeMeta: metav1.TypeMeta{
Kind: "Folder",
},
ObjectMeta: metav1.ObjectMeta{
Name: "valid-name",
},
}
tests := []struct {
name string
input *v0alpha1.Folder
expected *v0alpha1.Folder
wantErr bool
}{
{
name: "should trim a title",
input: &v0alpha1.Folder{
Spec: v0alpha1.Spec{
Title: " foo ",
},
TypeMeta: metav1.TypeMeta{
Kind: "Folder",
},
ObjectMeta: metav1.ObjectMeta{
Name: "valid-name",
},
},
expected: &v0alpha1.Folder{
Spec: v0alpha1.Spec{
Title: "foo",
},
TypeMeta: metav1.TypeMeta{
Kind: "Folder",
},
ObjectMeta: metav1.ObjectMeta{
Name: "valid-name",
},
},
},
{
name: "should return error if title doesnt exist",
input: &v0alpha1.Folder{
Spec: v0alpha1.Spec{},
TypeMeta: metav1.TypeMeta{
Kind: "Folder",
},
ObjectMeta: metav1.ObjectMeta{
Name: "valid-name",
},
},
wantErr: true,
},
{
name: "should return error if spec doesnt exist",
input: &v0alpha1.Folder{
TypeMeta: metav1.TypeMeta{
Kind: "Folder",
},
ObjectMeta: metav1.ObjectMeta{
Name: "valid-name",
},
},
wantErr: true,
},
}
s := (grafanarest.Storage)(nil)
m := &mock.Mock{}
us := storageMock{m, s}
sm := searcherMock{Mock: m}
b := &FolderAPIBuilder{
gv: resourceInfo.GroupVersion(),
features: nil,
namespacer: func(_ int64) string { return "123" },
folderSvc: foldertest.NewFakeService(),
storage: us,
accessControl: acimpl.ProvideAccessControl(featuremgmt.WithFeatures("nestedFolders"), zanzana.NewNoopClient()),
searcher: sm,
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
err := b.Validate(context.Background(), admission.NewAttributesRecord(
tt.input,
existingObj,
v0alpha1.SchemeGroupVersion.WithKind("folder"),
"stacks-123",
tt.input.Name,
v0alpha1.SchemeGroupVersion.WithResource("folders"),
"",
"UPDATE",
nil,
true,
&user.SignedInUser{},
), nil)
if tt.wantErr {
require.Error(t, err)
return
}
require.NoError(t, err)
})
}
}