...

Source file src/k8s.io/kubernetes/test/e2e/storage/helpers.go

Documentation: k8s.io/kubernetes/test/e2e/storage

     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  }
   134  

View as plain text