
This PR is the first step to transition CSINodeInfo and CSIDriver CRD's to in-tree APIs. It adds them to the existing API group “storage.k8s.io” as core storage APIs.
156 lines
3.8 KiB
Go
156 lines
3.8 KiB
Go
/*
|
|
Copyright 2019 The Kubernetes Authors.
|
|
|
|
Licensed under the Apache License, Version 2.0 (the "License");
|
|
you may not use this file except in compliance with the License.
|
|
You may obtain a copy of the License at
|
|
|
|
http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
Unless required by applicable law or agreed to in writing, software
|
|
distributed under the License is distributed on an "AS IS" BASIS,
|
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
See the License for the specific language governing permissions and
|
|
limitations under the License.
|
|
*/
|
|
|
|
package csidriver
|
|
|
|
import (
|
|
"testing"
|
|
|
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
|
"k8s.io/apimachinery/pkg/util/validation/field"
|
|
genericapirequest "k8s.io/apiserver/pkg/endpoints/request"
|
|
"k8s.io/kubernetes/pkg/apis/storage"
|
|
)
|
|
|
|
func getValidCSIDriver(name string) *storage.CSIDriver {
|
|
attachRequired := true
|
|
podInfoOnMount := true
|
|
return &storage.CSIDriver{
|
|
ObjectMeta: metav1.ObjectMeta{
|
|
Name: name,
|
|
},
|
|
Spec: storage.CSIDriverSpec{
|
|
AttachRequired: &attachRequired,
|
|
PodInfoOnMount: &podInfoOnMount,
|
|
},
|
|
}
|
|
}
|
|
|
|
func TestCSIDriverStrategy(t *testing.T) {
|
|
ctx := genericapirequest.WithRequestInfo(genericapirequest.NewContext(), &genericapirequest.RequestInfo{
|
|
APIGroup: "storage.k8s.io",
|
|
APIVersion: "v1beta1",
|
|
Resource: "csidrivers",
|
|
})
|
|
if Strategy.NamespaceScoped() {
|
|
t.Errorf("CSIDriver must not be namespace scoped")
|
|
}
|
|
if Strategy.AllowCreateOnUpdate() {
|
|
t.Errorf("CSIDriver should not allow create on update")
|
|
}
|
|
|
|
csiDriver := getValidCSIDriver("valid-csidriver")
|
|
|
|
Strategy.PrepareForCreate(ctx, csiDriver)
|
|
|
|
errs := Strategy.Validate(ctx, csiDriver)
|
|
if len(errs) != 0 {
|
|
t.Errorf("unexpected error validating %v", errs)
|
|
}
|
|
|
|
// Update of spec is disallowed
|
|
newCSIDriver := csiDriver.DeepCopy()
|
|
attachNotRequired := false
|
|
newCSIDriver.Spec.AttachRequired = &attachNotRequired
|
|
|
|
Strategy.PrepareForUpdate(ctx, newCSIDriver, csiDriver)
|
|
|
|
errs = Strategy.ValidateUpdate(ctx, newCSIDriver, csiDriver)
|
|
if len(errs) == 0 {
|
|
t.Errorf("Expected a validation error")
|
|
}
|
|
}
|
|
|
|
func TestCSIDriverValidation(t *testing.T) {
|
|
attachRequired := true
|
|
notAttachRequired := false
|
|
podInfoOnMount := true
|
|
notPodInfoOnMount := false
|
|
|
|
tests := []struct {
|
|
name string
|
|
csiDriver *storage.CSIDriver
|
|
expectError bool
|
|
}{
|
|
{
|
|
"valid csidriver",
|
|
getValidCSIDriver("foo"),
|
|
false,
|
|
},
|
|
{
|
|
"true PodInfoOnMount and AttachRequired",
|
|
&storage.CSIDriver{
|
|
ObjectMeta: metav1.ObjectMeta{
|
|
Name: "foo",
|
|
},
|
|
Spec: storage.CSIDriverSpec{
|
|
AttachRequired: &attachRequired,
|
|
PodInfoOnMount: &podInfoOnMount,
|
|
},
|
|
},
|
|
false,
|
|
},
|
|
{
|
|
"false PodInfoOnMount and AttachRequired",
|
|
&storage.CSIDriver{
|
|
ObjectMeta: metav1.ObjectMeta{
|
|
Name: "foo",
|
|
},
|
|
Spec: storage.CSIDriverSpec{
|
|
AttachRequired: ¬AttachRequired,
|
|
PodInfoOnMount: ¬PodInfoOnMount,
|
|
},
|
|
},
|
|
false,
|
|
},
|
|
{
|
|
"invalid driver name",
|
|
&storage.CSIDriver{
|
|
ObjectMeta: metav1.ObjectMeta{
|
|
Name: "*foo#",
|
|
},
|
|
Spec: storage.CSIDriverSpec{
|
|
AttachRequired: &attachRequired,
|
|
PodInfoOnMount: &podInfoOnMount,
|
|
},
|
|
},
|
|
true,
|
|
},
|
|
}
|
|
|
|
for _, test := range tests {
|
|
t.Run(test.name, func(t *testing.T) {
|
|
|
|
testValidation := func(csiDriver *storage.CSIDriver, apiVersion string) field.ErrorList {
|
|
ctx := genericapirequest.WithRequestInfo(genericapirequest.NewContext(), &genericapirequest.RequestInfo{
|
|
APIGroup: "storage.k8s.io",
|
|
APIVersion: "v1beta1",
|
|
Resource: "csidrivers",
|
|
})
|
|
return Strategy.Validate(ctx, csiDriver)
|
|
}
|
|
|
|
betaErr := testValidation(test.csiDriver, "v1beta1")
|
|
if len(betaErr) > 0 && !test.expectError {
|
|
t.Errorf("Validation of v1beta1 object failed: %+v", betaErr)
|
|
}
|
|
if len(betaErr) == 0 && test.expectError {
|
|
t.Errorf("Validation of v1beta1 object unexpectedly succeeded")
|
|
}
|
|
})
|
|
}
|
|
}
|