Add unit tests to isResourceUpdatable

This commit is contained in:
Michael Aspinwall
2025-08-26 20:09:44 +00:00
parent 3bdaeea215
commit e1218922db
3 changed files with 110 additions and 5 deletions

View File

@@ -50,7 +50,7 @@ const (
// to the SVM status before the migration is initiated. This resource version is utilized for checking
// freshness of GC cache before the migration is initiated.
type ResourceVersionController struct {
discoveryClient *discovery.DiscoveryClient
discoveryClient discovery.DiscoveryInterface
metadataClient metadata.Interface
svmListers svmlisters.StorageVersionMigrationLister
svmSynced cache.InformerSynced
@@ -62,7 +62,7 @@ type ResourceVersionController struct {
func NewResourceVersionController(
ctx context.Context,
kubeClient clientset.Interface,
discoveryClient *discovery.DiscoveryClient,
discoveryClient discovery.DiscoveryInterface,
metadataClient metadata.Interface,
svmInformer svminformers.StorageVersionMigrationInformer,
mapper meta.ResettableRESTMapper,

View File

@@ -56,7 +56,7 @@ type SVMController struct {
controllerName string
kubeClient kubernetes.Interface
dynamicClient *dynamic.DynamicClient
discoveryClient *discovery.DiscoveryClient
discoveryClient discovery.DiscoveryInterface
svmListers svmlisters.StorageVersionMigrationLister
svmSynced cache.InformerSynced
queue workqueue.TypedRateLimitingInterface[string]
@@ -68,7 +68,7 @@ func NewSVMController(
ctx context.Context,
kubeClient kubernetes.Interface,
dynamicClient *dynamic.DynamicClient,
discoveryClient *discovery.DiscoveryClient,
discoveryClient discovery.DiscoveryInterface,
svmInformer svminformers.StorageVersionMigrationInformer,
controllerName string,
mapper meta.ResettableRESTMapper,
@@ -368,7 +368,7 @@ func (sv *SVMController) isResourceUpdatable(gvr schema.GroupVersionResource) (b
if resource.Verbs != nil && sets.NewString(resource.Verbs...).Has("update") {
return true, nil
}
return false, fmt.Errorf("resource %q does not support update verb", gvr.String())
return false, nil
}
}

View File

@@ -0,0 +1,105 @@
/*
Copyright 2025 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 storageversionmigrator
import (
"net/http"
"net/http/httptest"
"testing"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime/schema"
fakediscovery "k8s.io/client-go/discovery/fake"
kubetesting "k8s.io/client-go/testing"
)
func TestIsResourceUpdatable(t *testing.T) {
tcs := []struct {
name string
resources []*metav1.APIResourceList
resource schema.GroupVersionResource
want bool
wantErr bool
}{
{
name: "updatable resource",
resources: []*metav1.APIResourceList{
{
GroupVersion: "v1",
APIResources: []metav1.APIResource{
{Name: "pods", Namespaced: true, Kind: "Pod", Verbs: []string{"get", "list", "watch", "create", "update", "patch", "delete"}},
{Name: "events", Namespaced: true, Kind: "Event", Verbs: []string{"get", "list", "watch", "create", "delete"}},
},
},
},
resource: schema.GroupVersionResource{Group: "", Version: "v1", Resource: "pods"},
want: true,
},
{
name: "non-updatable resource",
resources: []*metav1.APIResourceList{
{
GroupVersion: "v1",
APIResources: []metav1.APIResource{
{Name: "pods", Namespaced: true, Kind: "Pod", Verbs: []string{"get", "list", "watch", "create", "update", "patch", "delete"}},
{Name: "events", Namespaced: true, Kind: "Event", Verbs: []string{"get", "list", "watch", "create", "delete"}},
},
},
},
resource: schema.GroupVersionResource{Group: "", Version: "v1", Resource: "events"},
want: false,
},
{
name: "unknown resource",
resources: []*metav1.APIResourceList{
{
GroupVersion: "v1",
APIResources: []metav1.APIResource{
{Name: "pods", Namespaced: true, Kind: "Pod", Verbs: []string{"get", "list", "watch", "create", "update", "patch", "delete"}},
{Name: "events", Namespaced: true, Kind: "Event", Verbs: []string{"get", "list", "watch", "create", "delete"}},
},
},
},
resource: schema.GroupVersionResource{Group: "", Version: "v1", Resource: "foo"},
wantErr: true,
},
}
for _, tc := range tcs {
t.Run(tc.name, func(t *testing.T) {
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {}))
defer server.Close()
discoveryClient := fakediscovery.FakeDiscovery{Fake: &kubetesting.Fake{}}
discoveryClient.Resources = tc.resources
svmController := &SVMController{
discoveryClient: &discoveryClient,
}
isUpdatable, err := svmController.isResourceUpdatable(tc.resource)
if err != nil {
if !tc.wantErr {
t.Errorf("Unexpected error: %v", err)
}
return
}
if isUpdatable != tc.want {
t.Errorf("Expected %v, got %v", tc.want, isUpdatable)
}
})
}
}