diff --git a/test/e2e/storage/constants.go b/test/e2e/storage/constants.go new file mode 100644 index 00000000000..9fe1e9ec316 --- /dev/null +++ b/test/e2e/storage/constants.go @@ -0,0 +1,26 @@ +/* +Copyright 2024 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 storage + +import "time" + +const ( + minNodes = 2 + + // total time to wait for cloudprovider or file system resize to finish + totalResizeWaitPeriod = 10 * time.Minute +) diff --git a/test/e2e/storage/flexvolume_mounted_volume_resize.go b/test/e2e/storage/flexvolume_mounted_volume_resize.go index 0095f420b23..4e139f61a21 100644 --- a/test/e2e/storage/flexvolume_mounted_volume_resize.go +++ b/test/e2e/storage/flexvolume_mounted_volume_resize.go @@ -1,6 +1,3 @@ -//go:build !providerless -// +build !providerless - /* Copyright 2018 The Kubernetes Authors. @@ -22,9 +19,6 @@ package storage import ( "context" "fmt" - "path" - "time" - "github.com/onsi/ginkgo/v2" "github.com/onsi/gomega" v1 "k8s.io/api/core/v1" @@ -43,11 +37,7 @@ import ( "k8s.io/kubernetes/test/e2e/storage/testsuites" "k8s.io/kubernetes/test/e2e/storage/utils" admissionapi "k8s.io/pod-security-admission/api" -) - -const ( - // total time to wait for cloudprovider or file system resize to finish - totalResizeWaitPeriod = 10 * time.Minute + "path" ) var _ = utils.SIGDescribe(feature.Flexvolumes, "Mounted flexvolume expand", framework.WithSlow(), func() { diff --git a/test/e2e/storage/flexvolume_online_resize.go b/test/e2e/storage/flexvolume_online_resize.go index 9ba5eb420e2..a73f02bb5fd 100644 --- a/test/e2e/storage/flexvolume_online_resize.go +++ b/test/e2e/storage/flexvolume_online_resize.go @@ -1,6 +1,3 @@ -//go:build !providerless -// +build !providerless - /* Copyright 2018 The Kubernetes Authors. diff --git a/test/e2e/storage/generic_persistent_volume-disruptive.go b/test/e2e/storage/generic_persistent_volume-disruptive.go index 23f6dc8e3c8..8ac6e1648a2 100644 --- a/test/e2e/storage/generic_persistent_volume-disruptive.go +++ b/test/e2e/storage/generic_persistent_volume-disruptive.go @@ -1,6 +1,3 @@ -//go:build !providerless -// +build !providerless - /* Copyright 2018 The Kubernetes Authors. diff --git a/test/e2e/storage/helpers.go b/test/e2e/storage/helpers.go new file mode 100644 index 00000000000..646d3480953 --- /dev/null +++ b/test/e2e/storage/helpers.go @@ -0,0 +1,133 @@ +/* +Copyright 2024 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 storage + +import ( + "context" + "fmt" + "time" + + appsv1 "k8s.io/api/apps/v1" + v1 "k8s.io/api/core/v1" + storagev1 "k8s.io/api/storage/v1" + v12 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/util/wait" + "k8s.io/client-go/kubernetes" + "k8s.io/kubernetes/pkg/client/conditions" + "k8s.io/kubernetes/test/e2e/framework" + e2edeployment "k8s.io/kubernetes/test/e2e/framework/deployment" + e2epv "k8s.io/kubernetes/test/e2e/framework/pv" + "k8s.io/kubernetes/test/e2e/storage/testsuites" +) + +func newStorageClass(t testsuites.StorageClassTest, ns string, prefix string) *storagev1.StorageClass { + pluginName := t.Provisioner + if pluginName == "" { + pluginName = getDefaultPluginName() + } + if prefix == "" { + prefix = "sc" + } + bindingMode := storagev1.VolumeBindingImmediate + if t.DelayBinding { + bindingMode = storagev1.VolumeBindingWaitForFirstConsumer + } + if t.Parameters == nil { + t.Parameters = make(map[string]string) + } + + if framework.NodeOSDistroIs("windows") { + // fstype might be forced from outside, in that case skip setting a default + if _, exists := t.Parameters["fstype"]; !exists { + t.Parameters["fstype"] = e2epv.GetDefaultFSType() + framework.Logf("settings a default fsType=%s in the storage class", t.Parameters["fstype"]) + } + } + + sc := getStorageClass(pluginName, t.Parameters, &bindingMode, t.MountOptions, ns, prefix) + if t.AllowVolumeExpansion { + sc.AllowVolumeExpansion = &t.AllowVolumeExpansion + } + return sc +} + +func getDefaultPluginName() string { + switch { + case framework.ProviderIs("gke"), framework.ProviderIs("gce"): + return "kubernetes.io/gce-pd" + case framework.ProviderIs("aws"): + return "kubernetes.io/aws-ebs" + case framework.ProviderIs("openstack"): + return "kubernetes.io/cinder" + case framework.ProviderIs("vsphere"): + return "kubernetes.io/vsphere-volume" + case framework.ProviderIs("azure"): + return "kubernetes.io/azure-disk" + } + return "" +} + +func getStorageClass( + provisioner string, + parameters map[string]string, + bindingMode *storagev1.VolumeBindingMode, + mountOptions []string, + ns string, + prefix string, +) *storagev1.StorageClass { + if bindingMode == nil { + defaultBindingMode := storagev1.VolumeBindingImmediate + bindingMode = &defaultBindingMode + } + return &storagev1.StorageClass{ + TypeMeta: v12.TypeMeta{ + Kind: "StorageClass", + }, + ObjectMeta: v12.ObjectMeta{ + // Name must be unique, so let's base it on namespace name and the prefix (the prefix is test specific) + GenerateName: ns + "-" + prefix, + }, + Provisioner: provisioner, + Parameters: parameters, + VolumeBindingMode: bindingMode, + MountOptions: mountOptions, + } +} + +func waitForDeploymentToRecreatePod(ctx context.Context, client kubernetes.Interface, deployment *appsv1.Deployment) (v1.Pod, error) { + var runningPod v1.Pod + waitErr := wait.PollImmediate(10*time.Second, 5*time.Minute, func() (bool, error) { + podList, err := e2edeployment.GetPodsForDeployment(ctx, client, deployment) + if err != nil { + return false, fmt.Errorf("failed to get pods for deployment: %w", err) + } + for _, pod := range podList.Items { + switch pod.Status.Phase { + case v1.PodRunning: + runningPod = pod + return true, nil + case v1.PodFailed, v1.PodSucceeded: + return false, conditions.ErrPodCompleted + } + } + return false, nil + }) + if waitErr != nil { + return runningPod, fmt.Errorf("error waiting for recreated pod: %v", waitErr) + } + return runningPod, nil +} diff --git a/test/e2e/storage/mounted_volume_resize.go b/test/e2e/storage/mounted_volume_resize.go index fd8ce10e421..d2edc7cf046 100644 --- a/test/e2e/storage/mounted_volume_resize.go +++ b/test/e2e/storage/mounted_volume_resize.go @@ -1,6 +1,3 @@ -//go:build !providerless -// +build !providerless - /* Copyright 2018 The Kubernetes Authors. @@ -21,12 +18,8 @@ package storage import ( "context" - "fmt" - "time" - "github.com/onsi/ginkgo/v2" "github.com/onsi/gomega" - appsv1 "k8s.io/api/apps/v1" v1 "k8s.io/api/core/v1" storagev1 "k8s.io/api/storage/v1" "k8s.io/apimachinery/pkg/api/resource" @@ -34,9 +27,7 @@ import ( admissionapi "k8s.io/pod-security-admission/api" utilerrors "k8s.io/apimachinery/pkg/util/errors" - "k8s.io/apimachinery/pkg/util/wait" clientset "k8s.io/client-go/kubernetes" - "k8s.io/kubernetes/pkg/client/conditions" "k8s.io/kubernetes/test/e2e/feature" "k8s.io/kubernetes/test/e2e/framework" e2edeployment "k8s.io/kubernetes/test/e2e/framework/deployment" @@ -171,27 +162,3 @@ var _ = utils.SIGDescribe("Mounted volume expand", feature.StorageProvider, func gomega.Expect(pvcConditions).To(gomega.BeEmpty(), "pvc should not have conditions") }) }) - -func waitForDeploymentToRecreatePod(ctx context.Context, client clientset.Interface, deployment *appsv1.Deployment) (v1.Pod, error) { - var runningPod v1.Pod - waitErr := wait.PollImmediate(10*time.Second, 5*time.Minute, func() (bool, error) { - podList, err := e2edeployment.GetPodsForDeployment(ctx, client, deployment) - if err != nil { - return false, fmt.Errorf("failed to get pods for deployment: %w", err) - } - for _, pod := range podList.Items { - switch pod.Status.Phase { - case v1.PodRunning: - runningPod = pod - return true, nil - case v1.PodFailed, v1.PodSucceeded: - return false, conditions.ErrPodCompleted - } - } - return false, nil - }) - if waitErr != nil { - return runningPod, fmt.Errorf("error waiting for recreated pod: %v", waitErr) - } - return runningPod, nil -} diff --git a/test/e2e/storage/nfs_persistent_volume-disruptive.go b/test/e2e/storage/nfs_persistent_volume-disruptive.go index 8ba9d76d28a..d5577b06c6a 100644 --- a/test/e2e/storage/nfs_persistent_volume-disruptive.go +++ b/test/e2e/storage/nfs_persistent_volume-disruptive.go @@ -1,6 +1,3 @@ -//go:build !providerless -// +build !providerless - /* Copyright 2016 The Kubernetes Authors. diff --git a/test/e2e/storage/pd.go b/test/e2e/storage/pd.go index 2a77cb2898b..b3178aa41b1 100644 --- a/test/e2e/storage/pd.go +++ b/test/e2e/storage/pd.go @@ -58,7 +58,6 @@ const ( nodeStatusTimeout = 10 * time.Minute nodeStatusPollTime = 1 * time.Second podEvictTimeout = 2 * time.Minute - minNodes = 2 ) var _ = utils.SIGDescribe("Pod Disks", feature.StorageProvider, func() { diff --git a/test/e2e/storage/volume_provisioning.go b/test/e2e/storage/volume_provisioning.go index 2b2259e9445..76a0358c05b 100644 --- a/test/e2e/storage/volume_provisioning.go +++ b/test/e2e/storage/volume_provisioning.go @@ -30,7 +30,6 @@ import ( v1 "k8s.io/api/core/v1" rbacv1 "k8s.io/api/rbac/v1" - storagev1 "k8s.io/api/storage/v1" apierrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime/schema" @@ -724,80 +723,6 @@ func updateDefaultStorageClass(ctx context.Context, c clientset.Interface, scNam verifyDefaultStorageClass(ctx, c, scName, expectedDefault) } -func getDefaultPluginName() string { - switch { - case framework.ProviderIs("gke"), framework.ProviderIs("gce"): - return "kubernetes.io/gce-pd" - case framework.ProviderIs("aws"): - return "kubernetes.io/aws-ebs" - case framework.ProviderIs("openstack"): - return "kubernetes.io/cinder" - case framework.ProviderIs("vsphere"): - return "kubernetes.io/vsphere-volume" - case framework.ProviderIs("azure"): - return "kubernetes.io/azure-disk" - } - return "" -} - -func newStorageClass(t testsuites.StorageClassTest, ns string, prefix string) *storagev1.StorageClass { - pluginName := t.Provisioner - if pluginName == "" { - pluginName = getDefaultPluginName() - } - if prefix == "" { - prefix = "sc" - } - bindingMode := storagev1.VolumeBindingImmediate - if t.DelayBinding { - bindingMode = storagev1.VolumeBindingWaitForFirstConsumer - } - if t.Parameters == nil { - t.Parameters = make(map[string]string) - } - - if framework.NodeOSDistroIs("windows") { - // fstype might be forced from outside, in that case skip setting a default - if _, exists := t.Parameters["fstype"]; !exists { - t.Parameters["fstype"] = e2epv.GetDefaultFSType() - framework.Logf("settings a default fsType=%s in the storage class", t.Parameters["fstype"]) - } - } - - sc := getStorageClass(pluginName, t.Parameters, &bindingMode, t.MountOptions, ns, prefix) - if t.AllowVolumeExpansion { - sc.AllowVolumeExpansion = &t.AllowVolumeExpansion - } - return sc -} - -func getStorageClass( - provisioner string, - parameters map[string]string, - bindingMode *storagev1.VolumeBindingMode, - mountOptions []string, - ns string, - prefix string, -) *storagev1.StorageClass { - if bindingMode == nil { - defaultBindingMode := storagev1.VolumeBindingImmediate - bindingMode = &defaultBindingMode - } - return &storagev1.StorageClass{ - TypeMeta: metav1.TypeMeta{ - Kind: "StorageClass", - }, - ObjectMeta: metav1.ObjectMeta{ - // Name must be unique, so let's base it on namespace name and the prefix (the prefix is test specific) - GenerateName: ns + "-" + prefix, - }, - Provisioner: provisioner, - Parameters: parameters, - VolumeBindingMode: bindingMode, - MountOptions: mountOptions, - } -} - // waitForProvisionedVolumesDelete is a polling wrapper to scan all PersistentVolumes for any associated to the test's // StorageClass. Returns either an error and nil values or the remaining PVs and their count. func waitForProvisionedVolumesDeleted(ctx context.Context, c clientset.Interface, scName string) ([]*v1.PersistentVolume, error) {