Merge pull request #40879 from copejon/pv-e2e-unique-nfs-vol
Automatic merge from submit-queue (batch tested with PRs 40289, 40877, 40879, 39972, 40942) PV E2E: provide each spec with a fresh nfs host **What this PR does / why we need it**: PersistentVolume e2e currently reuses an NFS host pod created at the start of the suite and accessed by each test. This is far less favorable than using a fresh volume per test. Additionally, this guards against the volume host pod or it's kubelet being disrupted, which has led to flakes. ```release-note-none ```
This commit is contained in:
		@@ -59,14 +59,6 @@ var _ = framework.KubeDescribe("PersistentVolumes [Volume][Disruptive][Flaky]",
 | 
				
			|||||||
		clientNode                *v1.Node
 | 
							clientNode                *v1.Node
 | 
				
			||||||
	)
 | 
						)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	nfsServerConfig := VolumeTestConfig{
 | 
					 | 
				
			||||||
		namespace:   metav1.NamespaceDefault,
 | 
					 | 
				
			||||||
		prefix:      "nfs",
 | 
					 | 
				
			||||||
		serverImage: NfsServerImage,
 | 
					 | 
				
			||||||
		serverPorts: []int{2049},
 | 
					 | 
				
			||||||
		serverArgs:  []string{"-G", "777", "/exports"},
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	BeforeEach(func() {
 | 
						BeforeEach(func() {
 | 
				
			||||||
		// To protect the NFS volume pod from the kubelet restart, we isolate it on its own node.
 | 
							// To protect the NFS volume pod from the kubelet restart, we isolate it on its own node.
 | 
				
			||||||
		framework.SkipUnlessNodeCountIsAtLeast(MinNodes)
 | 
							framework.SkipUnlessNodeCountIsAtLeast(MinNodes)
 | 
				
			||||||
@@ -74,9 +66,8 @@ var _ = framework.KubeDescribe("PersistentVolumes [Volume][Disruptive][Flaky]",
 | 
				
			|||||||
		ns = f.Namespace.Name
 | 
							ns = f.Namespace.Name
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// Start the NFS server pod.
 | 
							// Start the NFS server pod.
 | 
				
			||||||
		if nfsServerPod == nil {
 | 
							framework.Logf("[BeforeEach] Creating NFS Server Pod")
 | 
				
			||||||
			framework.Logf("[BeforeEach] Initializing NFS Server Pod")
 | 
							nfsServerPod = initNFSserverPod(c, ns)
 | 
				
			||||||
			nfsServerPod = startVolumeServer(c, nfsServerConfig)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
		framework.Logf("[BeforeEach] Configuring PersistentVolume")
 | 
							framework.Logf("[BeforeEach] Configuring PersistentVolume")
 | 
				
			||||||
		nfsServerIP = nfsServerPod.Status.PodIP
 | 
							nfsServerIP = nfsServerPod.Status.PodIP
 | 
				
			||||||
@@ -91,7 +82,6 @@ var _ = framework.KubeDescribe("PersistentVolumes [Volume][Disruptive][Flaky]",
 | 
				
			|||||||
				},
 | 
									},
 | 
				
			||||||
			},
 | 
								},
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		// Get the first ready node IP that is not hosting the NFS pod.
 | 
							// Get the first ready node IP that is not hosting the NFS pod.
 | 
				
			||||||
		if clientNodeIP == "" {
 | 
							if clientNodeIP == "" {
 | 
				
			||||||
			framework.Logf("Designating test node")
 | 
								framework.Logf("Designating test node")
 | 
				
			||||||
@@ -100,19 +90,15 @@ var _ = framework.KubeDescribe("PersistentVolumes [Volume][Disruptive][Flaky]",
 | 
				
			|||||||
				if node.Name != nfsServerPod.Spec.NodeName {
 | 
									if node.Name != nfsServerPod.Spec.NodeName {
 | 
				
			||||||
					clientNode = &node
 | 
										clientNode = &node
 | 
				
			||||||
					clientNodeIP = framework.GetNodeExternalIP(clientNode)
 | 
										clientNodeIP = framework.GetNodeExternalIP(clientNode)
 | 
				
			||||||
					Expect(clientNodeIP).NotTo(BeEmpty())
 | 
					 | 
				
			||||||
					break
 | 
										break
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
								Expect(clientNodeIP).NotTo(BeEmpty())
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	})
 | 
						})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	AddCleanupAction(func() {
 | 
						AfterEach(func() {
 | 
				
			||||||
		if nfsServerPod != nil && c != nil {
 | 
							deletePodWithWait(f, c, nfsServerPod)
 | 
				
			||||||
			By("Deleting NFS server pod")
 | 
					 | 
				
			||||||
			nfsServerPodCleanup(c, nfsServerConfig)
 | 
					 | 
				
			||||||
			nfsServerPod = nil
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	})
 | 
						})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	Context("when kubelet restarts", func() {
 | 
						Context("when kubelet restarts", func() {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -85,6 +85,18 @@ func initializeGCETestSpec(c clientset.Interface, ns string, pvConfig persistent
 | 
				
			|||||||
	return clientPod, pv, pvc
 | 
						return clientPod, pv, pvc
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// initNFSserverPod wraps volumes.go's startVolumeServer to return a running nfs host pod
 | 
				
			||||||
 | 
					// commonly used by persistent volume testing
 | 
				
			||||||
 | 
					func initNFSserverPod(c clientset.Interface, ns string) *v1.Pod {
 | 
				
			||||||
 | 
						return startVolumeServer(c, VolumeTestConfig{
 | 
				
			||||||
 | 
							namespace:   ns,
 | 
				
			||||||
 | 
							prefix:      "nfs",
 | 
				
			||||||
 | 
							serverImage: NfsServerImage,
 | 
				
			||||||
 | 
							serverPorts: []int{2049},
 | 
				
			||||||
 | 
							serverArgs:  []string{"-G", "777", "/exports"},
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var _ = framework.KubeDescribe("PersistentVolumes [Volume][Serial]", func() {
 | 
					var _ = framework.KubeDescribe("PersistentVolumes [Volume][Serial]", func() {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// global vars for the Context()s and It()'s below
 | 
						// global vars for the Context()s and It()'s below
 | 
				
			||||||
@@ -105,30 +117,16 @@ var _ = framework.KubeDescribe("PersistentVolumes [Volume][Serial]", func() {
 | 
				
			|||||||
	framework.KubeDescribe("PersistentVolumes:NFS[Flaky]", func() {
 | 
						framework.KubeDescribe("PersistentVolumes:NFS[Flaky]", func() {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		var (
 | 
							var (
 | 
				
			||||||
			NFSconfig    VolumeTestConfig
 | 
					 | 
				
			||||||
			nfsServerPod *v1.Pod
 | 
								nfsServerPod *v1.Pod
 | 
				
			||||||
			serverIP     string
 | 
								serverIP     string
 | 
				
			||||||
			pvConfig     persistentVolumeConfig
 | 
								pvConfig     persistentVolumeConfig
 | 
				
			||||||
		)
 | 
							)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// config for the nfs-server pod in the default namespace
 | 
					 | 
				
			||||||
		NFSconfig = VolumeTestConfig{
 | 
					 | 
				
			||||||
			namespace:   metav1.NamespaceDefault,
 | 
					 | 
				
			||||||
			prefix:      "nfs",
 | 
					 | 
				
			||||||
			serverImage: NfsServerImage,
 | 
					 | 
				
			||||||
			serverPorts: []int{2049},
 | 
					 | 
				
			||||||
			serverArgs:  []string{"-G", "777", "/exports"},
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		BeforeEach(func() {
 | 
							BeforeEach(func() {
 | 
				
			||||||
			// If it doesn't exist, create the nfs server pod in the "default" ns.
 | 
								framework.Logf("[BeforeEach] Creating NFS Server Pod")
 | 
				
			||||||
			// The "default" ns is used so that individual tests can delete their
 | 
								nfsServerPod = initNFSserverPod(c, ns)
 | 
				
			||||||
			// ns without impacting the nfs-server pod.
 | 
					 | 
				
			||||||
			if nfsServerPod == nil {
 | 
					 | 
				
			||||||
				nfsServerPod = startVolumeServer(c, NFSconfig)
 | 
					 | 
				
			||||||
			serverIP = nfsServerPod.Status.PodIP
 | 
								serverIP = nfsServerPod.Status.PodIP
 | 
				
			||||||
				framework.Logf("NFS server IP address: %v", serverIP)
 | 
								framework.Logf("[BeforeEach] Configuring PersistentVolume")
 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			pvConfig = persistentVolumeConfig{
 | 
								pvConfig = persistentVolumeConfig{
 | 
				
			||||||
				namePrefix: "nfs-",
 | 
									namePrefix: "nfs-",
 | 
				
			||||||
				pvSource: v1.PersistentVolumeSource{
 | 
									pvSource: v1.PersistentVolumeSource{
 | 
				
			||||||
@@ -141,13 +139,8 @@ var _ = framework.KubeDescribe("PersistentVolumes [Volume][Serial]", func() {
 | 
				
			|||||||
			}
 | 
								}
 | 
				
			||||||
		})
 | 
							})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// Execute after *all* the tests have run
 | 
							AfterEach(func() {
 | 
				
			||||||
		AddCleanupAction(func() {
 | 
								deletePodWithWait(f, c, nfsServerPod)
 | 
				
			||||||
			if nfsServerPod != nil && c != nil {
 | 
					 | 
				
			||||||
				framework.Logf("AfterSuite: nfs-server pod %v is non-nil, deleting pod", nfsServerPod.Name)
 | 
					 | 
				
			||||||
				nfsServerPodCleanup(c, NFSconfig)
 | 
					 | 
				
			||||||
				nfsServerPod = nil
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		})
 | 
							})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		Context("with Single PV - PVC pairs", func() {
 | 
							Context("with Single PV - PVC pairs", func() {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -183,8 +183,6 @@ func startVolumeServer(client clientset.Interface, config VolumeTestConfig) *v1.
 | 
				
			|||||||
		By(fmt.Sprintf("locating the %q server pod", serverPodName))
 | 
							By(fmt.Sprintf("locating the %q server pod", serverPodName))
 | 
				
			||||||
		pod, err = podClient.Get(serverPodName, metav1.GetOptions{})
 | 
							pod, err = podClient.Get(serverPodName, metav1.GetOptions{})
 | 
				
			||||||
		framework.ExpectNoError(err, "Cannot locate the server pod %q: %v", serverPodName, err)
 | 
							framework.ExpectNoError(err, "Cannot locate the server pod %q: %v", serverPodName, err)
 | 
				
			||||||
		By("sleeping a bit to give the server time to start")
 | 
					 | 
				
			||||||
		time.Sleep(20 * time.Second)
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return pod
 | 
						return pod
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user