mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-26 05:03:09 +00:00
Extracted GCEPD pv tests
This commit is contained in:
parent
f657607d88
commit
29d4c1c1ce
@ -59,6 +59,7 @@ go_library(
|
|||||||
"pd.go",
|
"pd.go",
|
||||||
"persistent_volumes.go",
|
"persistent_volumes.go",
|
||||||
"persistent_volumes-disruptive.go",
|
"persistent_volumes-disruptive.go",
|
||||||
|
"persistent_volumes-gce.go",
|
||||||
"persistent_volumes-vsphere.go",
|
"persistent_volumes-vsphere.go",
|
||||||
"pod_gc.go",
|
"pod_gc.go",
|
||||||
"podpreset.go",
|
"podpreset.go",
|
||||||
|
@ -192,16 +192,16 @@ func initTestCase(f *framework.Framework, c clientset.Interface, pvConfig framew
|
|||||||
pod := framework.MakePod(ns, pvc.Name, true, "")
|
pod := framework.MakePod(ns, pvc.Name, true, "")
|
||||||
pod.Spec.NodeName = nodeName
|
pod.Spec.NodeName = nodeName
|
||||||
framework.Logf("Creating nfs client Pod %s on node %s", pod.Name, nodeName)
|
framework.Logf("Creating nfs client Pod %s on node %s", pod.Name, nodeName)
|
||||||
pod, err := c.Core().Pods(ns).Create(pod)
|
pod, err := c.CoreV1().Pods(ns).Create(pod)
|
||||||
Expect(err).NotTo(HaveOccurred())
|
Expect(err).NotTo(HaveOccurred())
|
||||||
err = framework.WaitForPodRunningInNamespace(c, pod)
|
err = framework.WaitForPodRunningInNamespace(c, pod)
|
||||||
Expect(err).NotTo(HaveOccurred())
|
Expect(err).NotTo(HaveOccurred())
|
||||||
|
|
||||||
pod, err = c.Core().Pods(ns).Get(pod.Name, metav1.GetOptions{})
|
pod, err = c.CoreV1().Pods(ns).Get(pod.Name, metav1.GetOptions{})
|
||||||
Expect(err).NotTo(HaveOccurred())
|
Expect(err).NotTo(HaveOccurred())
|
||||||
pvc, err = c.Core().PersistentVolumeClaims(ns).Get(pvc.Name, metav1.GetOptions{})
|
pvc, err = c.CoreV1().PersistentVolumeClaims(ns).Get(pvc.Name, metav1.GetOptions{})
|
||||||
Expect(err).NotTo(HaveOccurred())
|
Expect(err).NotTo(HaveOccurred())
|
||||||
pv, err = c.Core().PersistentVolumes().Get(pv.Name, metav1.GetOptions{})
|
pv, err = c.CoreV1().PersistentVolumes().Get(pv.Name, metav1.GetOptions{})
|
||||||
Expect(err).NotTo(HaveOccurred())
|
Expect(err).NotTo(HaveOccurred())
|
||||||
return pod, pv, pvc
|
return pod, pv, pvc
|
||||||
}
|
}
|
||||||
|
151
test/e2e/persistent_volumes-gce.go
Normal file
151
test/e2e/persistent_volumes-gce.go
Normal file
@ -0,0 +1,151 @@
|
|||||||
|
/*
|
||||||
|
Copyright 2017 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 e2e
|
||||||
|
|
||||||
|
import (
|
||||||
|
"time"
|
||||||
|
|
||||||
|
. "github.com/onsi/ginkgo"
|
||||||
|
. "github.com/onsi/gomega"
|
||||||
|
"k8s.io/apimachinery/pkg/types"
|
||||||
|
"k8s.io/kubernetes/pkg/api/v1"
|
||||||
|
"k8s.io/kubernetes/pkg/client/clientset_generated/clientset"
|
||||||
|
"k8s.io/kubernetes/test/e2e/framework"
|
||||||
|
)
|
||||||
|
|
||||||
|
// verifyGCEDiskAttached performs a sanity check to verify the PD attached to the node
|
||||||
|
func verifyGCEDiskAttached(diskName string, nodeName types.NodeName) bool {
|
||||||
|
gceCloud, err := framework.GetGCECloud()
|
||||||
|
Expect(err).NotTo(HaveOccurred())
|
||||||
|
isAttached, err := gceCloud.DiskIsAttached(diskName, nodeName)
|
||||||
|
Expect(err).NotTo(HaveOccurred())
|
||||||
|
return isAttached
|
||||||
|
}
|
||||||
|
|
||||||
|
// initializeGCETestSpec creates a PV, PVC, and ClientPod that will run until killed by test or clean up.
|
||||||
|
func initializeGCETestSpec(c clientset.Interface, ns string, pvConfig framework.PersistentVolumeConfig, isPrebound bool) (*v1.Pod, *v1.PersistentVolume, *v1.PersistentVolumeClaim) {
|
||||||
|
By("Creating the PV and PVC")
|
||||||
|
pv, pvc := framework.CreatePVPVC(c, pvConfig, ns, isPrebound)
|
||||||
|
framework.WaitOnPVandPVC(c, ns, pv, pvc)
|
||||||
|
|
||||||
|
By("Creating the Client Pod")
|
||||||
|
clientPod := framework.CreateClientPod(c, ns, pvc)
|
||||||
|
return clientPod, pv, pvc
|
||||||
|
}
|
||||||
|
|
||||||
|
// Testing configurations of single a PV/PVC pair attached to a GCE PD
|
||||||
|
var _ = framework.KubeDescribe("PersistentVolumes:GCEPD [Volume]", func() {
|
||||||
|
var (
|
||||||
|
c clientset.Interface
|
||||||
|
diskName string
|
||||||
|
ns string
|
||||||
|
err error
|
||||||
|
pv *v1.PersistentVolume
|
||||||
|
pvc *v1.PersistentVolumeClaim
|
||||||
|
clientPod *v1.Pod
|
||||||
|
pvConfig framework.PersistentVolumeConfig
|
||||||
|
node types.NodeName
|
||||||
|
)
|
||||||
|
|
||||||
|
f := framework.NewDefaultFramework("pv")
|
||||||
|
BeforeEach(func() {
|
||||||
|
c = f.ClientSet
|
||||||
|
ns = f.Namespace.Name
|
||||||
|
|
||||||
|
framework.SkipUnlessProviderIs("gce", "gke")
|
||||||
|
By("Initializing Test Spec")
|
||||||
|
if diskName == "" {
|
||||||
|
diskName, err = framework.CreatePDWithRetry()
|
||||||
|
Expect(err).NotTo(HaveOccurred())
|
||||||
|
pvConfig = framework.PersistentVolumeConfig{
|
||||||
|
NamePrefix: "gce-",
|
||||||
|
PVSource: v1.PersistentVolumeSource{
|
||||||
|
GCEPersistentDisk: &v1.GCEPersistentDiskVolumeSource{
|
||||||
|
PDName: diskName,
|
||||||
|
FSType: "ext3",
|
||||||
|
ReadOnly: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
Prebind: nil,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
clientPod, pv, pvc = initializeGCETestSpec(c, ns, pvConfig, false)
|
||||||
|
node = types.NodeName(clientPod.Spec.NodeName)
|
||||||
|
})
|
||||||
|
|
||||||
|
AfterEach(func() {
|
||||||
|
framework.Logf("AfterEach: Cleaning up test resources")
|
||||||
|
if c != nil {
|
||||||
|
framework.DeletePodWithWait(f, c, clientPod)
|
||||||
|
framework.PVPVCCleanup(c, ns, pv, pvc)
|
||||||
|
clientPod, pv, pvc, node = nil, nil, nil, ""
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
AddCleanupAction(func() {
|
||||||
|
if len(diskName) > 0 {
|
||||||
|
framework.DeletePDWithRetry(diskName)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
// Attach a persistent disk to a pod using a PVC.
|
||||||
|
// Delete the PVC and then the pod. Expect the pod to succeed in unmounting and detaching PD on delete.
|
||||||
|
It("should test that deleting a PVC before the pod does not cause pod deletion to fail on PD detach", func() {
|
||||||
|
|
||||||
|
By("Deleting the Claim")
|
||||||
|
framework.DeletePersistentVolumeClaim(c, pvc.Name, ns)
|
||||||
|
verifyGCEDiskAttached(diskName, node)
|
||||||
|
|
||||||
|
By("Deleting the Pod")
|
||||||
|
framework.DeletePodWithWait(f, c, clientPod)
|
||||||
|
|
||||||
|
By("Verifying Persistent Disk detach")
|
||||||
|
err = waitForPDDetach(diskName, node)
|
||||||
|
Expect(err).NotTo(HaveOccurred())
|
||||||
|
})
|
||||||
|
|
||||||
|
// Attach a persistent disk to a pod using a PVC.
|
||||||
|
// Delete the PV and then the pod. Expect the pod to succeed in unmounting and detaching PD on delete.
|
||||||
|
It("should test that deleting the PV before the pod does not cause pod deletion to fail on PD detach", func() {
|
||||||
|
|
||||||
|
By("Deleting the Persistent Volume")
|
||||||
|
framework.DeletePersistentVolume(c, pv.Name)
|
||||||
|
verifyGCEDiskAttached(diskName, node)
|
||||||
|
|
||||||
|
By("Deleting the client pod")
|
||||||
|
framework.DeletePodWithWait(f, c, clientPod)
|
||||||
|
|
||||||
|
By("Verifying Persistent Disk detaches")
|
||||||
|
err = waitForPDDetach(diskName, node)
|
||||||
|
Expect(err).NotTo(HaveOccurred())
|
||||||
|
})
|
||||||
|
|
||||||
|
// Test that a Pod and PVC attached to a GCEPD successfully unmounts and detaches when the encompassing Namespace is deleted.
|
||||||
|
It("should test that deleting the Namespace of a PVC and Pod causes the successful detach of Persistent Disk", func() {
|
||||||
|
|
||||||
|
By("Deleting the Namespace")
|
||||||
|
err := c.CoreV1().Namespaces().Delete(ns, nil)
|
||||||
|
Expect(err).NotTo(HaveOccurred())
|
||||||
|
|
||||||
|
err = framework.WaitForNamespacesDeleted(c, []string{ns}, 3*time.Minute)
|
||||||
|
Expect(err).NotTo(HaveOccurred())
|
||||||
|
|
||||||
|
By("Verifying Persistent Disk detaches")
|
||||||
|
err = waitForPDDetach(diskName, node)
|
||||||
|
Expect(err).NotTo(HaveOccurred())
|
||||||
|
})
|
||||||
|
})
|
@ -23,7 +23,6 @@ import (
|
|||||||
. "github.com/onsi/ginkgo"
|
. "github.com/onsi/ginkgo"
|
||||||
. "github.com/onsi/gomega"
|
. "github.com/onsi/gomega"
|
||||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
"k8s.io/apimachinery/pkg/types"
|
|
||||||
"k8s.io/kubernetes/pkg/api/v1"
|
"k8s.io/kubernetes/pkg/api/v1"
|
||||||
"k8s.io/kubernetes/pkg/client/clientset_generated/clientset"
|
"k8s.io/kubernetes/pkg/client/clientset_generated/clientset"
|
||||||
"k8s.io/kubernetes/test/e2e/framework"
|
"k8s.io/kubernetes/test/e2e/framework"
|
||||||
@ -57,7 +56,7 @@ func completeMultiTest(f *framework.Framework, c clientset.Interface, ns string,
|
|||||||
// 1. verify each PV permits write access to a client pod
|
// 1. verify each PV permits write access to a client pod
|
||||||
By("Checking pod has write access to PersistentVolumes")
|
By("Checking pod has write access to PersistentVolumes")
|
||||||
for pvcKey := range claims {
|
for pvcKey := range claims {
|
||||||
pvc, err := c.Core().PersistentVolumeClaims(pvcKey.Namespace).Get(pvcKey.Name, metav1.GetOptions{})
|
pvc, err := c.CoreV1().PersistentVolumeClaims(pvcKey.Namespace).Get(pvcKey.Name, metav1.GetOptions{})
|
||||||
Expect(err).NotTo(HaveOccurred())
|
Expect(err).NotTo(HaveOccurred())
|
||||||
if len(pvc.Spec.VolumeName) == 0 {
|
if len(pvc.Spec.VolumeName) == 0 {
|
||||||
continue // claim is not bound
|
continue // claim is not bound
|
||||||
@ -74,17 +73,6 @@ func completeMultiTest(f *framework.Framework, c clientset.Interface, ns string,
|
|||||||
framework.DeletePVCandValidatePVGroup(c, ns, pvols, claims, expectPhase)
|
framework.DeletePVCandValidatePVGroup(c, ns, pvols, claims, expectPhase)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Creates a PV, PVC, and ClientPod that will run until killed by test or clean up.
|
|
||||||
func initializeGCETestSpec(c clientset.Interface, ns string, pvConfig framework.PersistentVolumeConfig, isPrebound bool) (*v1.Pod, *v1.PersistentVolume, *v1.PersistentVolumeClaim) {
|
|
||||||
By("Creating the PV and PVC")
|
|
||||||
pv, pvc := framework.CreatePVPVC(c, pvConfig, ns, isPrebound)
|
|
||||||
framework.WaitOnPVandPVC(c, ns, pv, pvc)
|
|
||||||
|
|
||||||
By("Creating the Client Pod")
|
|
||||||
clientPod := framework.CreateClientPod(c, ns, pvc)
|
|
||||||
return clientPod, pv, pvc
|
|
||||||
}
|
|
||||||
|
|
||||||
// initNFSserverPod wraps volumes.go's startVolumeServer to return a running nfs host pod
|
// initNFSserverPod wraps volumes.go's startVolumeServer to return a running nfs host pod
|
||||||
// commonly used by persistent volume testing
|
// commonly used by persistent volume testing
|
||||||
func initNFSserverPod(c clientset.Interface, ns string) *v1.Pod {
|
func initNFSserverPod(c clientset.Interface, ns string) *v1.Pod {
|
||||||
@ -109,9 +97,6 @@ var _ = framework.KubeDescribe("PersistentVolumes [Volume][Serial]", func() {
|
|||||||
ns = f.Namespace.Name
|
ns = f.Namespace.Name
|
||||||
})
|
})
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////
|
|
||||||
// NFS
|
|
||||||
///////////////////////////////////////////////////////////////////////
|
|
||||||
// Testing configurations of a single a PV/PVC pair, multiple evenly paired PVs/PVCs,
|
// Testing configurations of a single a PV/PVC pair, multiple evenly paired PVs/PVCs,
|
||||||
// and multiple unevenly paired PV/PVCs
|
// and multiple unevenly paired PV/PVCs
|
||||||
framework.KubeDescribe("PersistentVolumes:NFS[Flaky]", func() {
|
framework.KubeDescribe("PersistentVolumes:NFS[Flaky]", func() {
|
||||||
@ -264,7 +249,7 @@ var _ = framework.KubeDescribe("PersistentVolumes [Volume][Serial]", func() {
|
|||||||
It("should test that a PV becomes Available and is clean after the PVC is deleted. [Volume][Serial][Flaky]", func() {
|
It("should test that a PV becomes Available and is clean after the PVC is deleted. [Volume][Serial][Flaky]", func() {
|
||||||
By("Writing to the volume.")
|
By("Writing to the volume.")
|
||||||
pod := framework.MakeWritePod(ns, pvc.Name)
|
pod := framework.MakeWritePod(ns, pvc.Name)
|
||||||
pod, err := c.Core().Pods(ns).Create(pod)
|
pod, err := c.CoreV1().Pods(ns).Create(pod)
|
||||||
Expect(err).NotTo(HaveOccurred())
|
Expect(err).NotTo(HaveOccurred())
|
||||||
err = framework.WaitForPodSuccessInNamespace(c, pod.Name, ns)
|
err = framework.WaitForPodSuccessInNamespace(c, pod.Name, ns)
|
||||||
Expect(err).NotTo(HaveOccurred())
|
Expect(err).NotTo(HaveOccurred())
|
||||||
@ -282,7 +267,7 @@ var _ = framework.KubeDescribe("PersistentVolumes [Volume][Serial]", func() {
|
|||||||
mount := pod.Spec.Containers[0].VolumeMounts[0].MountPath
|
mount := pod.Spec.Containers[0].VolumeMounts[0].MountPath
|
||||||
pod = framework.MakePod(ns, pvc.Name, true, fmt.Sprintf("[ $(ls -A %s | wc -l) -eq 0 ] && exit 0 || exit 1", mount))
|
pod = framework.MakePod(ns, pvc.Name, true, fmt.Sprintf("[ $(ls -A %s | wc -l) -eq 0 ] && exit 0 || exit 1", mount))
|
||||||
|
|
||||||
pod, err = c.Core().Pods(ns).Create(pod)
|
pod, err = c.CoreV1().Pods(ns).Create(pod)
|
||||||
Expect(err).NotTo(HaveOccurred())
|
Expect(err).NotTo(HaveOccurred())
|
||||||
err = framework.WaitForPodSuccessInNamespace(c, pod.Name, ns)
|
err = framework.WaitForPodSuccessInNamespace(c, pod.Name, ns)
|
||||||
Expect(err).NotTo(HaveOccurred())
|
Expect(err).NotTo(HaveOccurred())
|
||||||
@ -290,107 +275,4 @@ var _ = framework.KubeDescribe("PersistentVolumes [Volume][Serial]", func() {
|
|||||||
})
|
})
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
///////////////////////////////////////////////////////////////////////
|
|
||||||
// GCE PD
|
|
||||||
///////////////////////////////////////////////////////////////////////
|
|
||||||
// Testing configurations of single a PV/PVC pair attached to a GCE PD
|
|
||||||
framework.KubeDescribe("PersistentVolumes:GCEPD[Flaky]", func() {
|
|
||||||
|
|
||||||
var (
|
|
||||||
diskName string
|
|
||||||
node types.NodeName
|
|
||||||
err error
|
|
||||||
pv *v1.PersistentVolume
|
|
||||||
pvc *v1.PersistentVolumeClaim
|
|
||||||
clientPod *v1.Pod
|
|
||||||
pvConfig framework.PersistentVolumeConfig
|
|
||||||
)
|
|
||||||
|
|
||||||
BeforeEach(func() {
|
|
||||||
framework.SkipUnlessProviderIs("gce")
|
|
||||||
By("Initializing Test Spec")
|
|
||||||
if diskName == "" {
|
|
||||||
diskName, err = framework.CreatePDWithRetry()
|
|
||||||
Expect(err).NotTo(HaveOccurred())
|
|
||||||
pvConfig = framework.PersistentVolumeConfig{
|
|
||||||
NamePrefix: "gce-",
|
|
||||||
PVSource: v1.PersistentVolumeSource{
|
|
||||||
GCEPersistentDisk: &v1.GCEPersistentDiskVolumeSource{
|
|
||||||
PDName: diskName,
|
|
||||||
FSType: "ext3",
|
|
||||||
ReadOnly: false,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
Prebind: nil,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
clientPod, pv, pvc = initializeGCETestSpec(c, ns, pvConfig, false)
|
|
||||||
node = types.NodeName(clientPod.Spec.NodeName)
|
|
||||||
})
|
|
||||||
|
|
||||||
AfterEach(func() {
|
|
||||||
framework.Logf("AfterEach: Cleaning up test resources")
|
|
||||||
if c != nil {
|
|
||||||
framework.DeletePodWithWait(f, c, clientPod)
|
|
||||||
framework.PVPVCCleanup(c, ns, pv, pvc)
|
|
||||||
clientPod = nil
|
|
||||||
pvc = nil
|
|
||||||
pv = nil
|
|
||||||
}
|
|
||||||
node, clientPod, pvc, pv = "", nil, nil, nil
|
|
||||||
})
|
|
||||||
|
|
||||||
AddCleanupAction(func() {
|
|
||||||
if len(diskName) > 0 {
|
|
||||||
framework.DeletePDWithRetry(diskName)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
// Attach a persistent disk to a pod using a PVC.
|
|
||||||
// Delete the PVC and then the pod. Expect the pod to succeed in unmounting and detaching PD on delete.
|
|
||||||
It("should test that deleting a PVC before the pod does not cause pod deletion to fail on PD detach", func() {
|
|
||||||
|
|
||||||
By("Deleting the Claim")
|
|
||||||
framework.DeletePersistentVolumeClaim(c, pvc.Name, ns)
|
|
||||||
framework.VerifyGCEDiskAttached(diskName, node)
|
|
||||||
|
|
||||||
By("Deleting the Pod")
|
|
||||||
framework.DeletePodWithWait(f, c, clientPod)
|
|
||||||
|
|
||||||
By("Verifying Persistent Disk detach")
|
|
||||||
err = waitForPDDetach(diskName, node)
|
|
||||||
Expect(err).NotTo(HaveOccurred())
|
|
||||||
})
|
|
||||||
|
|
||||||
// Attach a persistent disk to a pod using a PVC.
|
|
||||||
// Delete the PV and then the pod. Expect the pod to succeed in unmounting and detaching PD on delete.
|
|
||||||
It("should test that deleting the PV before the pod does not cause pod deletion to fail on PD detach", func() {
|
|
||||||
|
|
||||||
By("Deleting the Persistent Volume")
|
|
||||||
framework.DeletePersistentVolume(c, pv.Name)
|
|
||||||
framework.VerifyGCEDiskAttached(diskName, node)
|
|
||||||
|
|
||||||
By("Deleting the client pod")
|
|
||||||
framework.DeletePodWithWait(f, c, clientPod)
|
|
||||||
|
|
||||||
By("Verifying Persistent Disk detaches")
|
|
||||||
err = waitForPDDetach(diskName, node)
|
|
||||||
Expect(err).NotTo(HaveOccurred())
|
|
||||||
})
|
|
||||||
|
|
||||||
// Test that a Pod and PVC attached to a GCEPD successfully unmounts and detaches when the encompassing Namespace is deleted.
|
|
||||||
It("should test that deleting the Namespace of a PVC and Pod causes the successful detach of Persistent Disk", func() {
|
|
||||||
|
|
||||||
By("Deleting the Namespace")
|
|
||||||
err := c.Core().Namespaces().Delete(ns, nil)
|
|
||||||
Expect(err).NotTo(HaveOccurred())
|
|
||||||
|
|
||||||
err = framework.WaitForNamespacesDeleted(c, []string{ns}, 3*time.Minute)
|
|
||||||
Expect(err).NotTo(HaveOccurred())
|
|
||||||
|
|
||||||
By("Verifying Persistent Disk detaches")
|
|
||||||
err = waitForPDDetach(diskName, node)
|
|
||||||
Expect(err).NotTo(HaveOccurred())
|
|
||||||
})
|
|
||||||
})
|
|
||||||
})
|
})
|
||||||
|
Loading…
Reference in New Issue
Block a user