mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-08-06 10:43:56 +00:00
fix: fixes update CRD check
Signed-off-by: Nilekh Chaudhari <1626598+nilekhc@users.noreply.github.com>
This commit is contained in:
parent
caafc21140
commit
23a407ce44
@ -181,7 +181,7 @@ func TestStorageVersionMigrationWithCRD(t *testing.T) {
|
|||||||
shutdownServer := svmTest.createConversionWebhook(ctx, t, certCtx)
|
shutdownServer := svmTest.createConversionWebhook(ctx, t, certCtx)
|
||||||
|
|
||||||
// add v2 for serving only
|
// add v2 for serving only
|
||||||
svmTest.updateCRD(ctx, t, crd.Name, v2CRDVersion)
|
svmTest.updateCRD(ctx, t, crd.Name, v2CRDVersion, []string{"v1", "v2"}, "v1")
|
||||||
|
|
||||||
// create another CR
|
// create another CR
|
||||||
cr2 := svmTest.createCR(ctx, t, "cr2", "v2")
|
cr2 := svmTest.createCR(ctx, t, "cr2", "v2")
|
||||||
@ -195,7 +195,7 @@ func TestStorageVersionMigrationWithCRD(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// add v2 as storage version
|
// add v2 as storage version
|
||||||
svmTest.updateCRD(ctx, t, crd.Name, v2StorageCRDVersion)
|
svmTest.updateCRD(ctx, t, crd.Name, v2StorageCRDVersion, []string{"v1", "v2"}, "v2")
|
||||||
|
|
||||||
// create CR with v1
|
// create CR with v1
|
||||||
cr3 := svmTest.createCR(ctx, t, "cr3", "v1")
|
cr3 := svmTest.createCR(ctx, t, "cr3", "v1")
|
||||||
@ -257,7 +257,7 @@ func TestStorageVersionMigrationWithCRD(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// update CRD to v1 not serving and storage followed by webhook shutdown
|
// update CRD to v1 not serving and storage followed by webhook shutdown
|
||||||
svmTest.updateCRD(ctx, t, crd.Name, v1NotServingCRDVersion)
|
svmTest.updateCRD(ctx, t, crd.Name, v1NotServingCRDVersion, []string{"v2"}, "v2")
|
||||||
shutdownServer()
|
shutdownServer()
|
||||||
|
|
||||||
// assert RV and Generations of CRs
|
// assert RV and Generations of CRs
|
||||||
|
@ -26,7 +26,9 @@ import (
|
|||||||
"net/http"
|
"net/http"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
"reflect"
|
||||||
"regexp"
|
"regexp"
|
||||||
|
"sort"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
@ -46,6 +48,7 @@ import (
|
|||||||
"k8s.io/apimachinery/pkg/util/wait"
|
"k8s.io/apimachinery/pkg/util/wait"
|
||||||
auditinternal "k8s.io/apiserver/pkg/apis/audit"
|
auditinternal "k8s.io/apiserver/pkg/apis/audit"
|
||||||
auditv1 "k8s.io/apiserver/pkg/apis/audit/v1"
|
auditv1 "k8s.io/apiserver/pkg/apis/audit/v1"
|
||||||
|
endpointsdiscovery "k8s.io/apiserver/pkg/endpoints/discovery"
|
||||||
"k8s.io/apiserver/pkg/storage/storagebackend"
|
"k8s.io/apiserver/pkg/storage/storagebackend"
|
||||||
"k8s.io/client-go/discovery"
|
"k8s.io/client-go/discovery"
|
||||||
cacheddiscovery "k8s.io/client-go/discovery/cached/memory"
|
cacheddiscovery "k8s.io/client-go/discovery/cached/memory"
|
||||||
@ -245,6 +248,7 @@ type svmTest struct {
|
|||||||
client clientset.Interface
|
client clientset.Interface
|
||||||
clientConfig *rest.Config
|
clientConfig *rest.Config
|
||||||
dynamicClient *dynamic.DynamicClient
|
dynamicClient *dynamic.DynamicClient
|
||||||
|
discoveryClient *discovery.DiscoveryClient
|
||||||
storageConfig *storagebackend.Config
|
storageConfig *storagebackend.Config
|
||||||
server *kubeapiservertesting.TestServer
|
server *kubeapiservertesting.TestServer
|
||||||
apiextensionsclient *apiextensionsclientset.Clientset
|
apiextensionsclient *apiextensionsclientset.Clientset
|
||||||
@ -350,6 +354,7 @@ func svmSetup(ctx context.Context, t *testing.T) *svmTest {
|
|||||||
client: clientSet,
|
client: clientSet,
|
||||||
clientConfig: server.ClientConfig,
|
clientConfig: server.ClientConfig,
|
||||||
dynamicClient: dynamicClient,
|
dynamicClient: dynamicClient,
|
||||||
|
discoveryClient: rvDiscoveryClient,
|
||||||
policyFile: policyFile,
|
policyFile: policyFile,
|
||||||
logFile: logFile,
|
logFile: logFile,
|
||||||
filePathForEncryptionConfig: filePathForEncryptionConfig,
|
filePathForEncryptionConfig: filePathForEncryptionConfig,
|
||||||
@ -484,29 +489,6 @@ func (svm *svmTest) updateFile(t *testing.T, configDir, filename string, newCont
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// func (svm *svmTest) createSVMResource(ctx context.Context, t *testing.T, name string) (
|
|
||||||
// *svmv1alpha1.StorageVersionMigration,
|
|
||||||
// error,
|
|
||||||
// ) {
|
|
||||||
// t.Helper()
|
|
||||||
// svmResource := &svmv1alpha1.StorageVersionMigration{
|
|
||||||
// ObjectMeta: metav1.ObjectMeta{
|
|
||||||
// Name: name,
|
|
||||||
// },
|
|
||||||
// Spec: svmv1alpha1.StorageVersionMigrationSpec{
|
|
||||||
// Resource: svmv1alpha1.GroupVersionResource{
|
|
||||||
// Group: "",
|
|
||||||
// Version: "v1",
|
|
||||||
// Resource: "secrets",
|
|
||||||
// },
|
|
||||||
// },
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// return svm.client.StoragemigrationV1alpha1().
|
|
||||||
// StorageVersionMigrations().
|
|
||||||
// Create(ctx, svmResource, metav1.CreateOptions{})
|
|
||||||
// }
|
|
||||||
|
|
||||||
func (svm *svmTest) createSVMResource(ctx context.Context, t *testing.T, name string, gvr svmv1alpha1.GroupVersionResource) (
|
func (svm *svmTest) createSVMResource(ctx context.Context, t *testing.T, name string, gvr svmv1alpha1.GroupVersionResource) (
|
||||||
*svmv1alpha1.StorageVersionMigration,
|
*svmv1alpha1.StorageVersionMigration,
|
||||||
error,
|
error,
|
||||||
@ -757,27 +739,74 @@ func (svm *svmTest) updateCRD(
|
|||||||
t *testing.T,
|
t *testing.T,
|
||||||
crdName string,
|
crdName string,
|
||||||
updatesCRDVersions []apiextensionsv1.CustomResourceDefinitionVersion,
|
updatesCRDVersions []apiextensionsv1.CustomResourceDefinitionVersion,
|
||||||
) *apiextensionsv1.CustomResourceDefinition {
|
expectedServingVersions []string,
|
||||||
|
expectedStorageVersion string,
|
||||||
|
) {
|
||||||
t.Helper()
|
t.Helper()
|
||||||
|
|
||||||
var err error
|
var err error
|
||||||
_, err = crdintegration.UpdateV1CustomResourceDefinitionWithRetry(svm.apiextensionsclient, crdName, func(c *apiextensionsv1.CustomResourceDefinition) {
|
crd, err := crdintegration.UpdateV1CustomResourceDefinitionWithRetry(svm.apiextensionsclient, crdName, func(c *apiextensionsv1.CustomResourceDefinition) {
|
||||||
c.Spec.Versions = updatesCRDVersions
|
c.Spec.Versions = updatesCRDVersions
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("Failed to update CRD: %v", err)
|
t.Fatalf("Failed to update CRD: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
crd, err := svm.apiextensionsclient.ApiextensionsV1().CustomResourceDefinitions().Get(ctx, crdName, metav1.GetOptions{})
|
svm.waitForCRDUpdate(ctx, t, crd.Spec.Names.Kind, expectedServingVersions, expectedStorageVersion)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (svm *svmTest) waitForCRDUpdate(
|
||||||
|
ctx context.Context,
|
||||||
|
t *testing.T,
|
||||||
|
crdKind string,
|
||||||
|
expectedServingVersions []string,
|
||||||
|
expectedStorageVersion string,
|
||||||
|
) {
|
||||||
|
t.Helper()
|
||||||
|
|
||||||
|
err := wait.PollUntilContextTimeout(
|
||||||
|
ctx,
|
||||||
|
500*time.Millisecond,
|
||||||
|
wait.ForeverTestTimeout,
|
||||||
|
true,
|
||||||
|
func(ctx context.Context) (bool, error) {
|
||||||
|
apiGroups, _, err := svm.discoveryClient.ServerGroupsAndResources()
|
||||||
|
if err != nil {
|
||||||
|
return false, fmt.Errorf("failed to get server groups and resources: %w", err)
|
||||||
|
}
|
||||||
|
for _, api := range apiGroups {
|
||||||
|
if api.Name == crdGroup {
|
||||||
|
var servingVersions []string
|
||||||
|
for _, apiVersion := range api.Versions {
|
||||||
|
servingVersions = append(servingVersions, apiVersion.Version)
|
||||||
|
}
|
||||||
|
sort.Strings(servingVersions)
|
||||||
|
|
||||||
|
// Check if the serving versions are as expected
|
||||||
|
if reflect.DeepEqual(expectedServingVersions, servingVersions) {
|
||||||
|
expectedHash := endpointsdiscovery.StorageVersionHash(crdGroup, expectedStorageVersion, crdKind)
|
||||||
|
resourceList, err := svm.discoveryClient.ServerResourcesForGroupVersion(crdGroup + "/" + api.PreferredVersion.Version)
|
||||||
|
if err != nil {
|
||||||
|
return false, fmt.Errorf("failed to get server resources for group version: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if the storage version is as expected
|
||||||
|
for _, resource := range resourceList.APIResources {
|
||||||
|
if resource.Kind == crdKind {
|
||||||
|
if resource.StorageVersionHash == expectedHash {
|
||||||
|
return true, nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false, nil
|
||||||
|
},
|
||||||
|
)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("Failed to get CRD: %v", err)
|
t.Fatalf("Failed to update a CRD: Name: %s, Err: %v", crdName, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: wrap all actions after updateCRD with wait loops so we do not need this sleep
|
|
||||||
// it is currently necessary because we update the CRD but do not otherwise guarantee that the updated config is active
|
|
||||||
time.Sleep(10 * time.Second)
|
|
||||||
|
|
||||||
return crd
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (svm *svmTest) createCR(ctx context.Context, t *testing.T, crName, version string) *unstructured.Unstructured {
|
func (svm *svmTest) createCR(ctx context.Context, t *testing.T, crName, version string) *unstructured.Unstructured {
|
||||||
|
Loading…
Reference in New Issue
Block a user