...
1
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
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
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 }
134
View as plain text