k8s.io/kubernetes@v1.31.0-alpha.0.0.20240520171757-56147500dadc/test/e2e/storage/helpers.go (about) 1 /* 2 Copyright 2024 The Kubernetes Authors. 3 4 Licensed under the Apache License, Version 2.0 (the "License"); 5 you may not use this file except in compliance with the License. 6 You may obtain a copy of the License at 7 8 http://www.apache.org/licenses/LICENSE-2.0 9 10 Unless required by applicable law or agreed to in writing, software 11 distributed under the License is distributed on an "AS IS" BASIS, 12 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 See the License for the specific language governing permissions and 14 limitations under the License. 15 */ 16 17 package storage 18 19 import ( 20 "context" 21 "fmt" 22 "time" 23 24 appsv1 "k8s.io/api/apps/v1" 25 v1 "k8s.io/api/core/v1" 26 storagev1 "k8s.io/api/storage/v1" 27 v12 "k8s.io/apimachinery/pkg/apis/meta/v1" 28 "k8s.io/apimachinery/pkg/util/wait" 29 "k8s.io/client-go/kubernetes" 30 "k8s.io/kubernetes/pkg/client/conditions" 31 "k8s.io/kubernetes/test/e2e/framework" 32 e2edeployment "k8s.io/kubernetes/test/e2e/framework/deployment" 33 e2epv "k8s.io/kubernetes/test/e2e/framework/pv" 34 "k8s.io/kubernetes/test/e2e/storage/testsuites" 35 ) 36 37 func newStorageClass(t testsuites.StorageClassTest, ns string, prefix string) *storagev1.StorageClass { 38 pluginName := t.Provisioner 39 if pluginName == "" { 40 pluginName = getDefaultPluginName() 41 } 42 if prefix == "" { 43 prefix = "sc" 44 } 45 bindingMode := storagev1.VolumeBindingImmediate 46 if t.DelayBinding { 47 bindingMode = storagev1.VolumeBindingWaitForFirstConsumer 48 } 49 if t.Parameters == nil { 50 t.Parameters = make(map[string]string) 51 } 52 53 if framework.NodeOSDistroIs("windows") { 54 // fstype might be forced from outside, in that case skip setting a default 55 if _, exists := t.Parameters["fstype"]; !exists { 56 t.Parameters["fstype"] = e2epv.GetDefaultFSType() 57 framework.Logf("settings a default fsType=%s in the storage class", t.Parameters["fstype"]) 58 } 59 } 60 61 sc := getStorageClass(pluginName, t.Parameters, &bindingMode, t.MountOptions, ns, prefix) 62 if t.AllowVolumeExpansion { 63 sc.AllowVolumeExpansion = &t.AllowVolumeExpansion 64 } 65 return sc 66 } 67 68 func getDefaultPluginName() string { 69 switch { 70 case framework.ProviderIs("gke"), framework.ProviderIs("gce"): 71 return "kubernetes.io/gce-pd" 72 case framework.ProviderIs("aws"): 73 return "kubernetes.io/aws-ebs" 74 case framework.ProviderIs("openstack"): 75 return "kubernetes.io/cinder" 76 case framework.ProviderIs("vsphere"): 77 return "kubernetes.io/vsphere-volume" 78 case framework.ProviderIs("azure"): 79 return "kubernetes.io/azure-disk" 80 } 81 return "" 82 } 83 84 func getStorageClass( 85 provisioner string, 86 parameters map[string]string, 87 bindingMode *storagev1.VolumeBindingMode, 88 mountOptions []string, 89 ns string, 90 prefix string, 91 ) *storagev1.StorageClass { 92 if bindingMode == nil { 93 defaultBindingMode := storagev1.VolumeBindingImmediate 94 bindingMode = &defaultBindingMode 95 } 96 return &storagev1.StorageClass{ 97 TypeMeta: v12.TypeMeta{ 98 Kind: "StorageClass", 99 }, 100 ObjectMeta: v12.ObjectMeta{ 101 // Name must be unique, so let's base it on namespace name and the prefix (the prefix is test specific) 102 GenerateName: ns + "-" + prefix, 103 }, 104 Provisioner: provisioner, 105 Parameters: parameters, 106 VolumeBindingMode: bindingMode, 107 MountOptions: mountOptions, 108 } 109 } 110 111 func waitForDeploymentToRecreatePod(ctx context.Context, client kubernetes.Interface, deployment *appsv1.Deployment) (v1.Pod, error) { 112 var runningPod v1.Pod 113 waitErr := wait.PollImmediate(10*time.Second, 5*time.Minute, func() (bool, error) { 114 podList, err := e2edeployment.GetPodsForDeployment(ctx, client, deployment) 115 if err != nil { 116 return false, fmt.Errorf("failed to get pods for deployment: %w", err) 117 } 118 for _, pod := range podList.Items { 119 switch pod.Status.Phase { 120 case v1.PodRunning: 121 runningPod = pod 122 return true, nil 123 case v1.PodFailed, v1.PodSucceeded: 124 return false, conditions.ErrPodCompleted 125 } 126 } 127 return false, nil 128 }) 129 if waitErr != nil { 130 return runningPod, fmt.Errorf("error waiting for recreated pod: %v", waitErr) 131 } 132 return runningPod, nil 133 }