Move pv_util.go into framework package so that it can be used in tests

not in the e2e package.
This commit is contained in:
Michelle Au 2017-02-16 20:33:41 -08:00
parent c2cf3beda0
commit f2887af4f5
13 changed files with 204 additions and 217 deletions

View File

@ -77,7 +77,6 @@ go_library(
"proxy.go",
"pv_reclaimpolicy.go",
"pvc_label_selector.go",
"pvutil.go",
"rc.go",
"reboot.go",
"replica_set.go",

View File

@ -25,6 +25,7 @@ go_library(
"nodes_util.go",
"perf_util.go",
"pods.go",
"pv_util.go",
"resource_usage_gatherer.go",
"service_util.go",
"test_context.go",
@ -68,6 +69,7 @@ go_library(
"//pkg/util/labels:go_default_library",
"//pkg/util/system:go_default_library",
"//pkg/util/version:go_default_library",
"//pkg/volume/util/volumehelper:go_default_library",
"//plugin/pkg/scheduler/algorithm/predicates:go_default_library",
"//plugin/pkg/scheduler/schedulercache:go_default_library",
"//test/e2e/perftype:go_default_library",
@ -86,6 +88,7 @@ go_library(
"//vendor:google.golang.org/api/compute/v1",
"//vendor:google.golang.org/api/googleapi",
"//vendor:k8s.io/apimachinery/pkg/api/errors",
"//vendor:k8s.io/apimachinery/pkg/api/resource",
"//vendor:k8s.io/apimachinery/pkg/apis/meta/v1",
"//vendor:k8s.io/apimachinery/pkg/apis/meta/v1/unstructured",
"//vendor:k8s.io/apimachinery/pkg/fields",

View File

@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
limitations under the License.
*/
package e2e
package framework
import (
"fmt"
@ -30,7 +30,6 @@ import (
"k8s.io/kubernetes/pkg/api/v1"
"k8s.io/kubernetes/pkg/client/clientset_generated/clientset"
"k8s.io/kubernetes/pkg/volume/util/volumehelper"
"k8s.io/kubernetes/test/e2e/framework"
)
// Map of all PVs used in the multi pv-pvc tests. The key is the PV's name, which is
@ -38,7 +37,7 @@ import (
// in the PV's name and if it is present. We must always Get the pv object before
// referencing any of its values, eg its ClaimRef.
type pvval struct{}
type pvmap map[string]pvval
type PVMap map[string]pvval
// Map of all PVCs used in the multi pv-pvc tests. The key is "namespace/pvc.Name". The
// value is {} (empty struct) since we're only interested in the PVC's name and if it is
@ -47,7 +46,7 @@ type pvmap map[string]pvval
// Note: It's unsafe to add keys to a map in a loop. Their insertion in the map is
// unpredictable and can result in the same key being iterated over again.
type pvcval struct{}
type pvcmap map[types.NamespacedName]pvcval
type PVCMap map[types.NamespacedName]pvcval
// Configuration for a persistent volume. To create PVs for varying storage options (NFS, ceph, glusterFS, etc.)
// define the pvSource as below. prebind holds a pre-bound PVC if there is one.
@ -56,50 +55,37 @@ type pvcmap map[types.NamespacedName]pvcval
// ...
// },
// }
type persistentVolumeConfig struct {
pvSource v1.PersistentVolumeSource
prebind *v1.PersistentVolumeClaim
reclaimPolicy v1.PersistentVolumeReclaimPolicy
namePrefix string
}
// Delete the nfs-server pod. Only done once per KubeDescription().
func nfsServerPodCleanup(c clientset.Interface, config VolumeTestConfig) {
defer GinkgoRecover()
podClient := c.Core().Pods(config.namespace)
if config.serverImage != "" {
podName := config.prefix + "-server"
err := podClient.Delete(podName, nil)
Expect(err).NotTo(HaveOccurred())
}
type PersistentVolumeConfig struct {
PVSource v1.PersistentVolumeSource
Prebind *v1.PersistentVolumeClaim
ReclaimPolicy v1.PersistentVolumeReclaimPolicy
NamePrefix string
}
// Clean up a pv and pvc in a single pv/pvc test case.
func pvPvcCleanup(c clientset.Interface, ns string, pv *v1.PersistentVolume, pvc *v1.PersistentVolumeClaim) {
deletePersistentVolumeClaim(c, pvc.Name, ns)
deletePersistentVolume(c, pv.Name)
func PVPVCCleanup(c clientset.Interface, ns string, pv *v1.PersistentVolume, pvc *v1.PersistentVolumeClaim) {
DeletePersistentVolumeClaim(c, pvc.Name, ns)
DeletePersistentVolume(c, pv.Name)
}
// Clean up pvs and pvcs in multi-pv-pvc test cases. All entries found in the pv and
// claims maps are deleted.
func pvPvcMapCleanup(c clientset.Interface, ns string, pvols pvmap, claims pvcmap) {
func PVPVCMapCleanup(c clientset.Interface, ns string, pvols PVMap, claims PVCMap) {
for pvcKey := range claims {
deletePersistentVolumeClaim(c, pvcKey.Name, ns)
DeletePersistentVolumeClaim(c, pvcKey.Name, ns)
delete(claims, pvcKey)
}
for pvKey := range pvols {
deletePersistentVolume(c, pvKey)
DeletePersistentVolume(c, pvKey)
delete(pvols, pvKey)
}
}
// Delete the PV.
func deletePersistentVolume(c clientset.Interface, pvName string) {
func DeletePersistentVolume(c clientset.Interface, pvName string) {
if c != nil && len(pvName) > 0 {
framework.Logf("Deleting PersistentVolume %v", pvName)
Logf("Deleting PersistentVolume %v", pvName)
err := c.Core().PersistentVolumes().Delete(pvName, nil)
if err != nil && !apierrs.IsNotFound(err) {
Expect(err).NotTo(HaveOccurred())
@ -108,9 +94,9 @@ func deletePersistentVolume(c clientset.Interface, pvName string) {
}
// Delete the Claim
func deletePersistentVolumeClaim(c clientset.Interface, pvcName string, ns string) {
func DeletePersistentVolumeClaim(c clientset.Interface, pvcName string, ns string) {
if c != nil && len(pvcName) > 0 {
framework.Logf("Deleting PersistentVolumeClaim %v", pvcName)
Logf("Deleting PersistentVolumeClaim %v", pvcName)
err := c.Core().PersistentVolumeClaims(ns).Delete(pvcName, nil)
if err != nil && !apierrs.IsNotFound(err) {
Expect(err).NotTo(HaveOccurred())
@ -121,19 +107,19 @@ func deletePersistentVolumeClaim(c clientset.Interface, pvcName string, ns strin
// Delete the PVC and wait for the PV to enter its expected phase. Validate that the PV
// has been reclaimed (assumption here about reclaimPolicy). Caller tells this func which
// phase value to expect for the pv bound to the to-be-deleted claim.
func deletePVCandValidatePV(c clientset.Interface, ns string, pvc *v1.PersistentVolumeClaim, pv *v1.PersistentVolume, expectPVPhase v1.PersistentVolumePhase) {
func DeletePVCandValidatePV(c clientset.Interface, ns string, pvc *v1.PersistentVolumeClaim, pv *v1.PersistentVolume, expectPVPhase v1.PersistentVolumePhase) {
pvname := pvc.Spec.VolumeName
framework.Logf("Deleting PVC %v to trigger reclamation of PV %v", pvc.Name, pvname)
deletePersistentVolumeClaim(c, pvc.Name, ns)
Logf("Deleting PVC %v to trigger reclamation of PV %v", pvc.Name, pvname)
DeletePersistentVolumeClaim(c, pvc.Name, ns)
// Check that the PVC is really deleted.
pvc, err := c.Core().PersistentVolumeClaims(ns).Get(pvc.Name, metav1.GetOptions{})
Expect(apierrs.IsNotFound(err)).To(BeTrue())
// Wait for the PV's phase to return to be `expectPVPhase`
framework.Logf("Waiting for reclaim process to complete.")
err = framework.WaitForPersistentVolumePhase(expectPVPhase, c, pv.Name, 1*time.Second, 300*time.Second)
Logf("Waiting for reclaim process to complete.")
err = WaitForPersistentVolumePhase(expectPVPhase, c, pv.Name, 1*time.Second, 300*time.Second)
Expect(err).NotTo(HaveOccurred())
// examine the pv's ClaimRef and UID and compare to expected values
@ -149,7 +135,7 @@ func deletePVCandValidatePV(c clientset.Interface, ns string, pvc *v1.Persistent
Expect(cr.UID).NotTo(BeEmpty())
}
framework.Logf("PV %v now in %q phase", pv.Name, expectPVPhase)
Logf("PV %v now in %q phase", pv.Name, expectPVPhase)
}
// Wraps deletePVCandValidatePV() by calling the function in a loop over the PV map. Only
@ -157,7 +143,7 @@ func deletePVCandValidatePV(c clientset.Interface, ns string, pvc *v1.Persistent
// Bound).
// Note: if there are more claims than pvs then some of the remaining claims will bind to
// the just-made-available pvs.
func deletePVCandValidatePVGroup(c clientset.Interface, ns string, pvols pvmap, claims pvcmap, expectPVPhase v1.PersistentVolumePhase) {
func DeletePVCandValidatePVGroup(c clientset.Interface, ns string, pvols PVMap, claims PVCMap, expectPVPhase v1.PersistentVolumePhase) {
var boundPVs, deletedPVCs int
@ -175,7 +161,7 @@ func deletePVCandValidatePVGroup(c clientset.Interface, ns string, pvols pvmap,
Expect(found).To(BeTrue())
pvc, err := c.Core().PersistentVolumeClaims(ns).Get(cr.Name, metav1.GetOptions{})
Expect(apierrs.IsNotFound(err)).To(BeFalse())
deletePVCandValidatePV(c, ns, pvc, pv, expectPVPhase)
DeletePVCandValidatePV(c, ns, pvc, pv, expectPVPhase)
delete(claims, pvcKey)
deletedPVCs++
}
@ -192,7 +178,7 @@ func createPV(c clientset.Interface, pv *v1.PersistentVolume) *v1.PersistentVolu
}
// create the PVC resource. Fails test on error.
func createPVC(c clientset.Interface, ns string, pvc *v1.PersistentVolumeClaim) *v1.PersistentVolumeClaim {
func CreatePVC(c clientset.Interface, ns string, pvc *v1.PersistentVolumeClaim) *v1.PersistentVolumeClaim {
pvc, err := c.Core().PersistentVolumeClaims(ns).Create(pvc)
Expect(err).NotTo(HaveOccurred())
@ -205,22 +191,22 @@ func createPVC(c clientset.Interface, ns string, pvc *v1.PersistentVolumeClaim)
// Note: in the pre-bind case the real PVC name, which is generated, is not
// known until after the PVC is instantiated. This is why the pvc is created
// before the pv.
func createPVCPV(c clientset.Interface, pvConfig persistentVolumeConfig, ns string, preBind bool) (*v1.PersistentVolume, *v1.PersistentVolumeClaim) {
func CreatePVCPV(c clientset.Interface, pvConfig PersistentVolumeConfig, ns string, preBind bool) (*v1.PersistentVolume, *v1.PersistentVolumeClaim) {
var preBindMsg string
// make the pvc definition first
pvc := makePersistentVolumeClaim(ns)
pvc := MakePersistentVolumeClaim(ns)
if preBind {
preBindMsg = " pre-bound"
pvConfig.prebind = pvc
pvConfig.Prebind = pvc
}
// make the pv spec
pv := makePersistentVolume(pvConfig)
By(fmt.Sprintf("Creating a PVC followed by a%s PV", preBindMsg))
// instantiate the pvc
pvc = createPVC(c, ns, pvc)
pvc = CreatePVC(c, ns, pvc)
// instantiate the pv, handle pre-binding by ClaimRef if needed
if preBind {
@ -238,17 +224,17 @@ func createPVCPV(c clientset.Interface, pvConfig persistentVolumeConfig, ns stri
// Note: in the pre-bind case the real PV name, which is generated, is not
// known until after the PV is instantiated. This is why the pv is created
// before the pvc.
func createPVPVC(c clientset.Interface, pvConfig persistentVolumeConfig, ns string, preBind bool) (*v1.PersistentVolume, *v1.PersistentVolumeClaim) {
func CreatePVPVC(c clientset.Interface, pvConfig PersistentVolumeConfig, ns string, preBind bool) (*v1.PersistentVolume, *v1.PersistentVolumeClaim) {
preBindMsg := ""
if preBind {
preBindMsg = " pre-bound"
}
framework.Logf("Creating a PV followed by a%s PVC", preBindMsg)
Logf("Creating a PV followed by a%s PVC", preBindMsg)
// make the pv and pvc definitions
pv := makePersistentVolume(pvConfig)
pvc := makePersistentVolumeClaim(ns)
pvc := MakePersistentVolumeClaim(ns)
// instantiate the pv
pv = createPV(c, pv)
@ -256,7 +242,7 @@ func createPVPVC(c clientset.Interface, pvConfig persistentVolumeConfig, ns stri
if preBind {
pvc.Spec.VolumeName = pv.Name
}
pvc = createPVC(c, ns, pvc)
pvc = CreatePVC(c, ns, pvc)
return pv, pvc
}
@ -264,13 +250,13 @@ func createPVPVC(c clientset.Interface, pvConfig persistentVolumeConfig, ns stri
// Create the desired number of PVs and PVCs and return them in separate maps. If the
// number of PVs != the number of PVCs then the min of those two counts is the number of
// PVs expected to bind.
func createPVsPVCs(numpvs, numpvcs int, c clientset.Interface, ns string, pvConfig persistentVolumeConfig) (pvmap, pvcmap) {
func CreatePVsPVCs(numpvs, numpvcs int, c clientset.Interface, ns string, pvConfig PersistentVolumeConfig) (PVMap, PVCMap) {
var i int
var pv *v1.PersistentVolume
var pvc *v1.PersistentVolumeClaim
pvMap := make(pvmap, numpvs)
pvcMap := make(pvcmap, numpvcs)
pvMap := make(PVMap, numpvs)
pvcMap := make(PVCMap, numpvcs)
var extraPVs, extraPVCs int
extraPVs = numpvs - numpvcs
@ -282,7 +268,7 @@ func createPVsPVCs(numpvs, numpvcs int, c clientset.Interface, ns string, pvConf
// create pvs and pvcs
for i = 0; i < pvsToCreate; i++ {
pv, pvc = createPVPVC(c, pvConfig, ns, false)
pv, pvc = CreatePVPVC(c, pvConfig, ns, false)
pvMap[pv.Name] = pvval{}
pvcMap[makePvcKey(ns, pvc.Name)] = pvcval{}
}
@ -294,8 +280,8 @@ func createPVsPVCs(numpvs, numpvcs int, c clientset.Interface, ns string, pvConf
pvMap[pv.Name] = pvval{}
}
for i = 0; i < extraPVCs; i++ {
pvc = makePersistentVolumeClaim(ns)
pvc = createPVC(c, ns, pvc)
pvc = MakePersistentVolumeClaim(ns)
pvc = CreatePVC(c, ns, pvc)
pvcMap[makePvcKey(ns, pvc.Name)] = pvcval{}
}
@ -303,16 +289,16 @@ func createPVsPVCs(numpvs, numpvcs int, c clientset.Interface, ns string, pvConf
}
// Wait for the pv and pvc to bind to each other.
func waitOnPVandPVC(c clientset.Interface, ns string, pv *v1.PersistentVolume, pvc *v1.PersistentVolumeClaim) {
func WaitOnPVandPVC(c clientset.Interface, ns string, pv *v1.PersistentVolume, pvc *v1.PersistentVolumeClaim) {
// Wait for newly created PVC to bind to the PV
framework.Logf("Waiting for PV %v to bind to PVC %v", pv.Name, pvc.Name)
err := framework.WaitForPersistentVolumeClaimPhase(v1.ClaimBound, c, ns, pvc.Name, 3*time.Second, 300*time.Second)
Logf("Waiting for PV %v to bind to PVC %v", pv.Name, pvc.Name)
err := WaitForPersistentVolumeClaimPhase(v1.ClaimBound, c, ns, pvc.Name, 3*time.Second, 300*time.Second)
Expect(err).NotTo(HaveOccurred())
// Wait for PersistentVolume.Status.Phase to be Bound, which it should be
// since the PVC is already bound.
err = framework.WaitForPersistentVolumePhase(v1.VolumeBound, c, pv.Name, 3*time.Second, 300*time.Second)
err = WaitForPersistentVolumePhase(v1.VolumeBound, c, pv.Name, 3*time.Second, 300*time.Second)
Expect(err).NotTo(HaveOccurred())
// Re-get the pv and pvc objects
@ -337,7 +323,7 @@ func waitOnPVandPVC(c clientset.Interface, ns string, pv *v1.PersistentVolume, p
// to situations where the maximum wait times are reached several times in succession,
// extending test time. Thus, it is recommended to keep the delta between PVs and PVCs
// small.
func waitAndVerifyBinds(c clientset.Interface, ns string, pvols pvmap, claims pvcmap, testExpected bool) {
func WaitAndVerifyBinds(c clientset.Interface, ns string, pvols PVMap, claims PVCMap, testExpected bool) {
var actualBinds int
expectedBinds := len(pvols)
@ -346,10 +332,10 @@ func waitAndVerifyBinds(c clientset.Interface, ns string, pvols pvmap, claims pv
}
for pvName := range pvols {
err := framework.WaitForPersistentVolumePhase(v1.VolumeBound, c, pvName, 3*time.Second, 180*time.Second)
err := WaitForPersistentVolumePhase(v1.VolumeBound, c, pvName, 3*time.Second, 180*time.Second)
if err != nil && len(pvols) > len(claims) {
framework.Logf("WARN: pv %v is not bound after max wait", pvName)
framework.Logf(" This may be ok since there are more pvs than pvcs")
Logf("WARN: pv %v is not bound after max wait", pvName)
Logf(" This may be ok since there are more pvs than pvcs")
continue
}
Expect(err).NotTo(HaveOccurred())
@ -363,7 +349,7 @@ func waitAndVerifyBinds(c clientset.Interface, ns string, pvols pvmap, claims pv
_, found := claims[pvcKey]
Expect(found).To(BeTrue())
err = framework.WaitForPersistentVolumeClaimPhase(v1.ClaimBound, c, ns, cr.Name, 3*time.Second, 180*time.Second)
err = WaitForPersistentVolumeClaimPhase(v1.ClaimBound, c, ns, cr.Name, 3*time.Second, 180*time.Second)
Expect(err).NotTo(HaveOccurred())
actualBinds++
}
@ -378,19 +364,19 @@ func waitAndVerifyBinds(c clientset.Interface, ns string, pvols pvmap, claims pv
func testPodSuccessOrFail(c clientset.Interface, ns string, pod *v1.Pod) {
By("Pod should terminate with exitcode 0 (success)")
err := framework.WaitForPodSuccessInNamespace(c, pod.Name, ns)
err := WaitForPodSuccessInNamespace(c, pod.Name, ns)
Expect(err).NotTo(HaveOccurred())
framework.Logf("Pod %v succeeded ", pod.Name)
Logf("Pod %v succeeded ", pod.Name)
}
// Deletes the passed-in pod and waits for the pod to be terminated. Resilient to the pod
// not existing.
func deletePodWithWait(f *framework.Framework, c clientset.Interface, pod *v1.Pod) {
func DeletePodWithWait(f *Framework, c clientset.Interface, pod *v1.Pod) {
if pod == nil {
return
}
framework.Logf("Deleting pod %v", pod.Name)
Logf("Deleting pod %v", pod.Name)
err := c.Core().Pods(pod.Namespace).Delete(pod.Name, nil)
if err != nil {
if apierrs.IsNotFound(err) {
@ -403,34 +389,34 @@ func deletePodWithWait(f *framework.Framework, c clientset.Interface, pod *v1.Po
err = f.WaitForPodTerminated(pod.Name, "")
Expect(err).To(HaveOccurred())
if !apierrs.IsNotFound(err) {
framework.Logf("Error! Expected IsNotFound error deleting pod %q, instead got: %v", pod.Name, err)
Logf("Error! Expected IsNotFound error deleting pod %q, instead got: %v", pod.Name, err)
Expect(apierrs.IsNotFound(err)).To(BeTrue())
}
framework.Logf("Ignore \"not found\" error above. Pod %v successfully deleted", pod.Name)
Logf("Ignore \"not found\" error above. Pod %v successfully deleted", pod.Name)
}
// Create the test pod, wait for (hopefully) success, and then delete the pod.
func createWaitAndDeletePod(f *framework.Framework, c clientset.Interface, ns string, claimName string) {
func CreateWaitAndDeletePod(f *Framework, c clientset.Interface, ns string, claimName string) {
framework.Logf("Creating nfs test pod")
Logf("Creating nfs test pod")
// Make pod spec
pod := makeWritePod(ns, claimName)
pod := MakeWritePod(ns, claimName)
// Instantiate pod (Create)
runPod, err := c.Core().Pods(ns).Create(pod)
Expect(err).NotTo(HaveOccurred())
Expect(runPod).NotTo(BeNil())
defer deletePodWithWait(f, c, runPod)
defer DeletePodWithWait(f, c, runPod)
// Wait for the test pod to complete its lifecycle
testPodSuccessOrFail(c, ns, runPod)
}
// Sanity check for GCE testing. Verify the persistent disk attached to the node.
func verifyGCEDiskAttached(diskName string, nodeName types.NodeName) bool {
gceCloud, err := getGCECloud()
func VerifyGCEDiskAttached(diskName string, nodeName types.NodeName) bool {
gceCloud, err := GetGCECloud()
Expect(err).NotTo(HaveOccurred())
isAttached, err := gceCloud.DiskIsAttached(diskName, nodeName)
Expect(err).NotTo(HaveOccurred())
@ -450,33 +436,33 @@ func makePvcKey(ns, name string) types.NamespacedName {
// (instantiated) and thus the PV's ClaimRef cannot be completely filled-in in
// this func. Therefore, the ClaimRef's name is added later in
// createPVCPV.
func makePersistentVolume(pvConfig persistentVolumeConfig) *v1.PersistentVolume {
func makePersistentVolume(pvConfig PersistentVolumeConfig) *v1.PersistentVolume {
// Specs are expected to match this test's PersistentVolumeClaim
var claimRef *v1.ObjectReference
// If the reclaimPolicy is not provided, assume Retain
if pvConfig.reclaimPolicy == "" {
pvConfig.reclaimPolicy = v1.PersistentVolumeReclaimRetain
if pvConfig.ReclaimPolicy == "" {
pvConfig.ReclaimPolicy = v1.PersistentVolumeReclaimRetain
}
if pvConfig.prebind != nil {
if pvConfig.Prebind != nil {
claimRef = &v1.ObjectReference{
Name: pvConfig.prebind.Name,
Namespace: pvConfig.prebind.Namespace,
Name: pvConfig.Prebind.Name,
Namespace: pvConfig.Prebind.Namespace,
}
}
return &v1.PersistentVolume{
ObjectMeta: metav1.ObjectMeta{
GenerateName: pvConfig.namePrefix,
GenerateName: pvConfig.NamePrefix,
Annotations: map[string]string{
volumehelper.VolumeGidAnnotationKey: "777",
},
},
Spec: v1.PersistentVolumeSpec{
PersistentVolumeReclaimPolicy: pvConfig.reclaimPolicy,
PersistentVolumeReclaimPolicy: pvConfig.ReclaimPolicy,
Capacity: v1.ResourceList{
v1.ResourceName(v1.ResourceStorage): resource.MustParse("2Gi"),
},
PersistentVolumeSource: pvConfig.pvSource,
PersistentVolumeSource: pvConfig.PVSource,
AccessModes: []v1.PersistentVolumeAccessMode{
v1.ReadWriteOnce,
v1.ReadOnlyMany,
@ -489,9 +475,9 @@ func makePersistentVolume(pvConfig persistentVolumeConfig) *v1.PersistentVolume
// Returns a PVC definition based on the namespace.
// Note: if this PVC is intended to be pre-bound to a PV, whose name is not
// known until the PV is instantiated, then the func createPVPVC will add
// known until the PV is instantiated, then the func CreatePVPVC will add
// pvc.Spec.VolumeName to this claim.
func makePersistentVolumeClaim(ns string) *v1.PersistentVolumeClaim {
func MakePersistentVolumeClaim(ns string) *v1.PersistentVolumeClaim {
// Specs are expected to match this test's PersistentVolume
return &v1.PersistentVolumeClaim{
@ -519,13 +505,13 @@ func makePersistentVolumeClaim(ns string) *v1.PersistentVolumeClaim {
// Returns a pod definition based on the namespace. The pod references the PVC's
// name.
func makeWritePod(ns string, pvcName string) *v1.Pod {
return makePod(ns, pvcName, "touch /mnt/SUCCESS && (id -G | grep -E '\\b777\\b')")
func MakeWritePod(ns string, pvcName string) *v1.Pod {
return MakePod(ns, pvcName, "touch /mnt/SUCCESS && (id -G | grep -E '\\b777\\b')")
}
// Returns a pod definition based on the namespace. The pod references the PVC's
// name. A slice of BASH commands can be supplied as args to be run by the pod
func makePod(ns string, pvcName string, command ...string) *v1.Pod {
func MakePod(ns string, pvcName string, command ...string) *v1.Pod {
if len(command) == 0 {
command = []string{"while true; do sleep 1; done"}
@ -574,13 +560,13 @@ func makePod(ns string, pvcName string, command ...string) *v1.Pod {
}
// Define and create a pod with a mounted PV. Pod runs infinite loop until killed.
func createClientPod(c clientset.Interface, ns string, pvc *v1.PersistentVolumeClaim) *v1.Pod {
clientPod := makePod(ns, pvc.Name)
func CreateClientPod(c clientset.Interface, ns string, pvc *v1.PersistentVolumeClaim) *v1.Pod {
clientPod := MakePod(ns, pvc.Name)
clientPod, err := c.Core().Pods(ns).Create(clientPod)
Expect(err).NotTo(HaveOccurred())
// Verify the pod is running before returning it
err = framework.WaitForPodRunningInNamespace(c, clientPod)
err = WaitForPodRunningInNamespace(c, clientPod)
Expect(err).NotTo(HaveOccurred())
clientPod, err = c.Core().Pods(ns).Get(clientPod.Name, metav1.GetOptions{})
Expect(apierrs.IsNotFound(err)).To(BeFalse())

View File

@ -4590,6 +4590,14 @@ func getPodLogsInternal(c clientset.Interface, namespace, podName, containerName
return string(logs), err
}
func GetGCECloud() (*gcecloud.GCECloud, error) {
gceCloud, ok := TestContext.CloudConfig.Provider.(*gcecloud.GCECloud)
if !ok {
return nil, fmt.Errorf("failed to convert CloudConfig.Provider to GCECloud: %#v", TestContext.CloudConfig.Provider)
}
return gceCloud, nil
}
// EnsureLoadBalancerResourcesDeleted ensures that cloud load balancer resources that were created
// are actually cleaned up. Currently only implemented for GCE/GKE.
func EnsureLoadBalancerResourcesDeleted(ip, portRange string) error {
@ -4600,9 +4608,9 @@ func EnsureLoadBalancerResourcesDeleted(ip, portRange string) error {
}
func ensureGCELoadBalancerResourcesDeleted(ip, portRange string) error {
gceCloud, ok := TestContext.CloudConfig.Provider.(*gcecloud.GCECloud)
if !ok {
return fmt.Errorf("failed to convert CloudConfig.Provider to GCECloud: %#v", TestContext.CloudConfig.Provider)
gceCloud, err := GetGCECloud()
if err != nil {
return err
}
project := TestContext.CloudConfig.ProjectID
region, err := gcecloud.GetGCERegion(TestContext.CloudConfig.Zone)
@ -5090,9 +5098,9 @@ func (p *E2ETestNodePreparer) CleanupNodes() error {
// the given name. The name is usually the UUID of the Service prefixed with an
// alpha-numeric character ('a') to work around cloudprovider rules.
func CleanupGCEResources(loadBalancerName string) (retErr error) {
gceCloud, ok := TestContext.CloudConfig.Provider.(*gcecloud.GCECloud)
if !ok {
return fmt.Errorf("failed to convert CloudConfig.Provider to GCECloud: %#v", TestContext.CloudConfig.Provider)
gceCloud, err := GetGCECloud()
if err != nil {
return err
}
if err := gceCloud.DeleteFirewall(loadBalancerName); err != nil &&
!IsGoogleAPIHTTPErrorCode(err, http.StatusNotFound) {

View File

@ -415,8 +415,8 @@ var _ = framework.KubeDescribe("kubelet", func() {
})
AfterEach(func() {
deletePodWithWait(f, c, pod)
deletePodWithWait(f, c, nfsServerPod)
framework.DeletePodWithWait(f, c, pod)
framework.DeletePodWithWait(f, c, nfsServerPod)
})
// execute It blocks from above table of tests
@ -427,11 +427,11 @@ var _ = framework.KubeDescribe("kubelet", func() {
pod = createPodUsingNfs(f, c, ns, nfsIP, t.podCmd)
By("Delete the NFS server pod")
deletePodWithWait(f, c, nfsServerPod)
framework.DeletePodWithWait(f, c, nfsServerPod)
nfsServerPod = nil
By("Delete the pod mounted to the NFS volume")
deletePodWithWait(f, c, pod)
framework.DeletePodWithWait(f, c, pod)
// pod object is now stale, but is intentionally not nil
By("Check if host running deleted pod has been cleaned up -- expect not")

View File

@ -589,7 +589,7 @@ func createPD() (string, error) {
if framework.TestContext.Provider == "gce" || framework.TestContext.Provider == "gke" {
pdName := fmt.Sprintf("%s-%s", framework.TestContext.Prefix, string(uuid.NewUUID()))
gceCloud, err := getGCECloud()
gceCloud, err := framework.GetGCECloud()
if err != nil {
return "", err
}
@ -624,7 +624,7 @@ func createPD() (string, error) {
func deletePD(pdName string) error {
if framework.TestContext.Provider == "gce" || framework.TestContext.Provider == "gke" {
gceCloud, err := getGCECloud()
gceCloud, err := framework.GetGCECloud()
if err != nil {
return err
}
@ -663,7 +663,7 @@ func deletePD(pdName string) error {
func detachPD(nodeName types.NodeName, pdName string) error {
if framework.TestContext.Provider == "gce" || framework.TestContext.Provider == "gke" {
gceCloud, err := getGCECloud()
gceCloud, err := framework.GetGCECloud()
if err != nil {
return err
}
@ -771,7 +771,7 @@ func testPDPod(diskNames []string, targetNode types.NodeName, readOnly bool, num
func waitForPDDetach(diskName string, nodeName types.NodeName) error {
if framework.TestContext.Provider == "gce" || framework.TestContext.Provider == "gke" {
framework.Logf("Waiting for GCE PD %q to detach from node %q.", diskName, nodeName)
gceCloud, err := getGCECloud()
gceCloud, err := framework.GetGCECloud()
if err != nil {
return err
}
@ -798,16 +798,6 @@ func waitForPDDetach(diskName string, nodeName types.NodeName) error {
return nil
}
func getGCECloud() (*gcecloud.GCECloud, error) {
gceCloud, ok := framework.TestContext.CloudConfig.Provider.(*gcecloud.GCECloud)
if !ok {
return nil, fmt.Errorf("failed to convert CloudConfig.Provider to GCECloud: %#v", framework.TestContext.CloudConfig.Provider)
}
return gceCloud, nil
}
func detachAndDeletePDs(diskName string, hosts []types.NodeName) {
for _, host := range hosts {
framework.Logf("Detaching GCE PD %q from node %q.", diskName, host)

View File

@ -54,7 +54,7 @@ var _ = framework.KubeDescribe("PersistentVolumes [Volume][Disruptive][Flaky]",
c clientset.Interface
ns string
nfsServerPod *v1.Pod
nfsPVconfig persistentVolumeConfig
nfsPVconfig framework.PersistentVolumeConfig
nfsServerIP, clientNodeIP string
clientNode *v1.Node
)
@ -72,9 +72,9 @@ var _ = framework.KubeDescribe("PersistentVolumes [Volume][Disruptive][Flaky]",
framework.Logf("[BeforeEach] Configuring PersistentVolume")
nfsServerIP = nfsServerPod.Status.PodIP
Expect(nfsServerIP).NotTo(BeEmpty())
nfsPVconfig = persistentVolumeConfig{
namePrefix: "nfs-",
pvSource: v1.PersistentVolumeSource{
nfsPVconfig = framework.PersistentVolumeConfig{
NamePrefix: "nfs-",
PVSource: v1.PersistentVolumeSource{
NFS: &v1.NFSVolumeSource{
Server: nfsServerIP,
Path: "/exports",
@ -98,7 +98,7 @@ var _ = framework.KubeDescribe("PersistentVolumes [Volume][Disruptive][Flaky]",
})
AfterEach(func() {
deletePodWithWait(f, c, nfsServerPod)
framework.DeletePodWithWait(f, c, nfsServerPod)
})
Context("when kubelet restarts", func() {
@ -175,7 +175,7 @@ func testVolumeUnmountsFromDeletedPod(c clientset.Interface, f *framework.Framew
By("Restarting the kubelet.")
kubeletCommand(kStop, c, clientPod)
deletePodWithWait(f, c, clientPod)
framework.DeletePodWithWait(f, c, clientPod)
kubeletCommand(kStart, c, clientPod)
By("Expecting the volume mount not to be found.")
@ -187,9 +187,9 @@ func testVolumeUnmountsFromDeletedPod(c clientset.Interface, f *framework.Framew
}
// initTestCase initializes spec resources (pv, pvc, and pod) and returns pointers to be consumed by the test
func initTestCase(f *framework.Framework, c clientset.Interface, pvConfig persistentVolumeConfig, ns, nodeName string) (*v1.Pod, *v1.PersistentVolume, *v1.PersistentVolumeClaim) {
pv, pvc := createPVPVC(c, pvConfig, ns, false)
pod := makePod(ns, pvc.Name)
func initTestCase(f *framework.Framework, c clientset.Interface, pvConfig framework.PersistentVolumeConfig, ns, nodeName string) (*v1.Pod, *v1.PersistentVolume, *v1.PersistentVolumeClaim) {
pv, pvc := framework.CreatePVPVC(c, pvConfig, ns, false)
pod := framework.MakePod(ns, pvc.Name)
pod.Spec.NodeName = nodeName
framework.Logf("Creating nfs client Pod %s on node %s", pod.Name, nodeName)
pod, err := c.Core().Pods(ns).Create(pod)
@ -208,9 +208,9 @@ func initTestCase(f *framework.Framework, c clientset.Interface, pvConfig persis
// tearDownTestCase destroy resources created by initTestCase.
func tearDownTestCase(c clientset.Interface, f *framework.Framework, ns string, pod *v1.Pod, pvc *v1.PersistentVolumeClaim, pv *v1.PersistentVolume) {
deletePodWithWait(f, c, pod)
deletePersistentVolumeClaim(c, pvc.Name, ns)
deletePersistentVolume(c, pv.Name)
framework.DeletePodWithWait(f, c, pod)
framework.DeletePersistentVolumeClaim(c, pvc.Name, ns)
framework.DeletePersistentVolume(c, pv.Name)
}
// kubeletCommand performs `start`, `restart`, or `stop` on the kubelet running on the node of the target pod.

View File

@ -38,7 +38,7 @@ var _ = framework.KubeDescribe("PersistentVolumes:vsphere", func() {
pv *v1.PersistentVolume
pvc *v1.PersistentVolumeClaim
clientPod *v1.Pod
pvConfig persistentVolumeConfig
pvConfig framework.PersistentVolumeConfig
vsp *vsphere.VSphere
err error
node types.NodeName
@ -69,23 +69,23 @@ var _ = framework.KubeDescribe("PersistentVolumes:vsphere", func() {
if volumePath == "" {
volumePath, err = createVSphereVolume(vsp, nil)
Expect(err).NotTo(HaveOccurred())
pvConfig = persistentVolumeConfig{
namePrefix: "vspherepv-",
pvSource: v1.PersistentVolumeSource{
pvConfig = framework.PersistentVolumeConfig{
NamePrefix: "vspherepv-",
PVSource: v1.PersistentVolumeSource{
VsphereVolume: &v1.VsphereVirtualDiskVolumeSource{
VolumePath: volumePath,
FSType: "ext4",
},
},
prebind: nil,
Prebind: nil,
}
}
By("Creating the PV and PVC")
pv, pvc = createPVPVC(c, pvConfig, ns, false)
waitOnPVandPVC(c, ns, pv, pvc)
pv, pvc = framework.CreatePVPVC(c, pvConfig, ns, false)
framework.WaitOnPVandPVC(c, ns, pv, pvc)
By("Creating the Client Pod")
clientPod = createClientPod(c, ns, pvc)
clientPod = framework.CreateClientPod(c, ns, pvc)
node := types.NodeName(clientPod.Spec.NodeName)
By("Verify disk should be attached to the node")
@ -100,15 +100,15 @@ var _ = framework.KubeDescribe("PersistentVolumes:vsphere", func() {
if clientPod != nil {
clientPod, err = c.CoreV1().Pods(ns).Get(clientPod.Name, metav1.GetOptions{})
if !apierrs.IsNotFound(err) {
deletePodWithWait(f, c, clientPod)
framework.DeletePodWithWait(f, c, clientPod)
}
}
if pv != nil {
deletePersistentVolume(c, pv.Name)
framework.DeletePersistentVolume(c, pv.Name)
}
if pvc != nil {
deletePersistentVolumeClaim(c, pvc.Name, ns)
framework.DeletePersistentVolumeClaim(c, pvc.Name, ns)
}
}
})
@ -136,7 +136,7 @@ var _ = framework.KubeDescribe("PersistentVolumes:vsphere", func() {
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")
deletePersistentVolumeClaim(c, pvc.Name, ns)
framework.DeletePersistentVolumeClaim(c, pvc.Name, ns)
pvc, err = c.CoreV1().PersistentVolumeClaims(ns).Get(pvc.Name, metav1.GetOptions{})
if !apierrs.IsNotFound(err) {
@ -144,7 +144,7 @@ var _ = framework.KubeDescribe("PersistentVolumes:vsphere", func() {
}
pvc = nil
By("Deleting the Pod")
deletePodWithWait(f, c, clientPod)
framework.DeletePodWithWait(f, c, clientPod)
})
@ -157,13 +157,13 @@ var _ = framework.KubeDescribe("PersistentVolumes:vsphere", func() {
*/
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")
deletePersistentVolume(c, pv.Name)
framework.DeletePersistentVolume(c, pv.Name)
pv, err = c.CoreV1().PersistentVolumes().Get(pv.Name, metav1.GetOptions{})
if !apierrs.IsNotFound(err) {
Expect(err).NotTo(HaveOccurred())
}
pv = nil
By("Deleting the pod")
deletePodWithWait(f, c, clientPod)
framework.DeletePodWithWait(f, c, clientPod)
})
})

View File

@ -35,16 +35,16 @@ func completeTest(f *framework.Framework, c clientset.Interface, ns string, pv *
// 1. verify that the PV and PVC have bound correctly
By("Validating the PV-PVC binding")
waitOnPVandPVC(c, ns, pv, pvc)
framework.WaitOnPVandPVC(c, ns, pv, pvc)
// 2. create the nfs writer pod, test if the write was successful,
// then delete the pod and verify that it was deleted
By("Checking pod has write access to PersistentVolume")
createWaitAndDeletePod(f, c, ns, pvc.Name)
framework.CreateWaitAndDeletePod(f, c, ns, pvc.Name)
// 3. delete the PVC, wait for PV to become "Released"
By("Deleting the PVC to invoke the reclaim policy.")
deletePVCandValidatePV(c, ns, pvc, pv, v1.VolumeReleased)
framework.DeletePVCandValidatePV(c, ns, pvc, pv, v1.VolumeReleased)
}
// Validate pairs of PVs and PVCs, create and verify writer pod, delete PVC and validate
@ -52,7 +52,7 @@ func completeTest(f *framework.Framework, c clientset.Interface, ns string, pv *
// Note: the PV is deleted in the AfterEach, not here.
// Note: this func is serialized, we wait for each pod to be deleted before creating the
// next pod. Adding concurrency is a TODO item.
func completeMultiTest(f *framework.Framework, c clientset.Interface, ns string, pvols pvmap, claims pvcmap, expectPhase v1.PersistentVolumePhase) {
func completeMultiTest(f *framework.Framework, c clientset.Interface, ns string, pvols framework.PVMap, claims framework.PVCMap, expectPhase v1.PersistentVolumePhase) {
// 1. verify each PV permits write access to a client pod
By("Checking pod has write access to PersistentVolumes")
@ -66,22 +66,22 @@ func completeMultiTest(f *framework.Framework, c clientset.Interface, ns string,
_, found := pvols[pvc.Spec.VolumeName]
Expect(found).To(BeTrue())
// TODO: currently a serialized test of each PV
createWaitAndDeletePod(f, c, pvcKey.Namespace, pvcKey.Name)
framework.CreateWaitAndDeletePod(f, c, pvcKey.Namespace, pvcKey.Name)
}
// 2. delete each PVC, wait for its bound PV to reach `expectedPhase`
By("Deleting PVCs to invoke recycler")
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 persistentVolumeConfig, isPrebound bool) (*v1.Pod, *v1.PersistentVolume, *v1.PersistentVolumeClaim) {
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 := createPVPVC(c, pvConfig, ns, isPrebound)
waitOnPVandPVC(c, ns, pv, pvc)
pv, pvc := framework.CreatePVPVC(c, pvConfig, ns, isPrebound)
framework.WaitOnPVandPVC(c, ns, pv, pvc)
By("Creating the Client Pod")
clientPod := createClientPod(c, ns, pvc)
clientPod := framework.CreateClientPod(c, ns, pvc)
return clientPod, pv, pvc
}
@ -119,7 +119,7 @@ var _ = framework.KubeDescribe("PersistentVolumes [Volume][Serial]", func() {
var (
nfsServerPod *v1.Pod
serverIP string
pvConfig persistentVolumeConfig
pvConfig framework.PersistentVolumeConfig
)
BeforeEach(func() {
@ -127,9 +127,9 @@ var _ = framework.KubeDescribe("PersistentVolumes [Volume][Serial]", func() {
nfsServerPod = initNFSserverPod(c, ns)
serverIP = nfsServerPod.Status.PodIP
framework.Logf("[BeforeEach] Configuring PersistentVolume")
pvConfig = persistentVolumeConfig{
namePrefix: "nfs-",
pvSource: v1.PersistentVolumeSource{
pvConfig = framework.PersistentVolumeConfig{
NamePrefix: "nfs-",
PVSource: v1.PersistentVolumeSource{
NFS: &v1.NFSVolumeSource{
Server: serverIP,
Path: "/exports",
@ -140,7 +140,7 @@ var _ = framework.KubeDescribe("PersistentVolumes [Volume][Serial]", func() {
})
AfterEach(func() {
deletePodWithWait(f, c, nfsServerPod)
framework.DeletePodWithWait(f, c, nfsServerPod)
})
Context("with Single PV - PVC pairs", func() {
@ -151,7 +151,7 @@ var _ = framework.KubeDescribe("PersistentVolumes [Volume][Serial]", func() {
// Note: this is the only code where the pv is deleted.
AfterEach(func() {
framework.Logf("AfterEach: Cleaning up test resources.")
pvPvcCleanup(c, ns, pv, pvc)
framework.PVPVCCleanup(c, ns, pv, pvc)
})
// Individual tests follow:
@ -160,7 +160,7 @@ var _ = framework.KubeDescribe("PersistentVolumes [Volume][Serial]", func() {
// contains the claim. Verify that the PV and PVC bind correctly, and
// that the pod can write to the nfs volume.
It("should create a non-pre-bound PV and PVC: test write access ", func() {
pv, pvc = createPVPVC(c, pvConfig, ns, false)
pv, pvc = framework.CreatePVPVC(c, pvConfig, ns, false)
completeTest(f, c, ns, pv, pvc)
})
@ -168,7 +168,7 @@ var _ = framework.KubeDescribe("PersistentVolumes [Volume][Serial]", func() {
// pod that contains the claim. Verify that the PV and PVC bind
// correctly, and that the pod can write to the nfs volume.
It("create a PVC and non-pre-bound PV: test write access", func() {
pv, pvc = createPVCPV(c, pvConfig, ns, false)
pv, pvc = framework.CreatePVCPV(c, pvConfig, ns, false)
completeTest(f, c, ns, pv, pvc)
})
@ -176,7 +176,7 @@ var _ = framework.KubeDescribe("PersistentVolumes [Volume][Serial]", func() {
// and a pod that contains the claim. Verify that the PV and PVC bind
// correctly, and that the pod can write to the nfs volume.
It("create a PVC and a pre-bound PV: test write access", func() {
pv, pvc = createPVCPV(c, pvConfig, ns, true)
pv, pvc = framework.CreatePVCPV(c, pvConfig, ns, true)
completeTest(f, c, ns, pv, pvc)
})
@ -184,7 +184,7 @@ var _ = framework.KubeDescribe("PersistentVolumes [Volume][Serial]", func() {
// and a pod that contains the claim. Verify that the PV and PVC bind
// correctly, and that the pod can write to the nfs volume.
It("create a PV and a pre-bound PVC: test write access", func() {
pv, pvc = createPVPVC(c, pvConfig, ns, true)
pv, pvc = framework.CreatePVPVC(c, pvConfig, ns, true)
completeTest(f, c, ns, pv, pvc)
})
})
@ -204,20 +204,20 @@ var _ = framework.KubeDescribe("PersistentVolumes [Volume][Serial]", func() {
const maxNumPVs = 10
const maxNumPVCs = 10
// create the pv and pvc maps to be reused in the It blocks
pvols := make(pvmap, maxNumPVs)
claims := make(pvcmap, maxNumPVCs)
pvols := make(framework.PVMap, maxNumPVs)
claims := make(framework.PVCMap, maxNumPVCs)
AfterEach(func() {
framework.Logf("AfterEach: deleting %v PVCs and %v PVs...", len(claims), len(pvols))
pvPvcMapCleanup(c, ns, pvols, claims)
framework.PVPVCMapCleanup(c, ns, pvols, claims)
})
// Create 2 PVs and 4 PVCs.
// Note: PVs are created before claims and no pre-binding
It("should create 2 PVs and 4 PVCs: test write access", func() {
numPVs, numPVCs := 2, 4
pvols, claims = createPVsPVCs(numPVs, numPVCs, c, ns, pvConfig)
waitAndVerifyBinds(c, ns, pvols, claims, true)
pvols, claims = framework.CreatePVsPVCs(numPVs, numPVCs, c, ns, pvConfig)
framework.WaitAndVerifyBinds(c, ns, pvols, claims, true)
completeMultiTest(f, c, ns, pvols, claims, v1.VolumeReleased)
})
@ -225,8 +225,8 @@ var _ = framework.KubeDescribe("PersistentVolumes [Volume][Serial]", func() {
// Note: PVs are created before claims and no pre-binding
It("should create 3 PVs and 3 PVCs: test write access", func() {
numPVs, numPVCs := 3, 3
pvols, claims = createPVsPVCs(numPVs, numPVCs, c, ns, pvConfig)
waitAndVerifyBinds(c, ns, pvols, claims, true)
pvols, claims = framework.CreatePVsPVCs(numPVs, numPVCs, c, ns, pvConfig)
framework.WaitAndVerifyBinds(c, ns, pvols, claims, true)
completeMultiTest(f, c, ns, pvols, claims, v1.VolumeReleased)
})
@ -234,8 +234,8 @@ var _ = framework.KubeDescribe("PersistentVolumes [Volume][Serial]", func() {
// Note: PVs are created before claims and no pre-binding.
It("should create 4 PVs and 2 PVCs: test write access", func() {
numPVs, numPVCs := 4, 2
pvols, claims = createPVsPVCs(numPVs, numPVCs, c, ns, pvConfig)
waitAndVerifyBinds(c, ns, pvols, claims, true)
pvols, claims = framework.CreatePVsPVCs(numPVs, numPVCs, c, ns, pvConfig)
framework.WaitAndVerifyBinds(c, ns, pvols, claims, true)
completeMultiTest(f, c, ns, pvols, claims, v1.VolumeReleased)
})
})
@ -248,14 +248,14 @@ var _ = framework.KubeDescribe("PersistentVolumes [Volume][Serial]", func() {
var pvc *v1.PersistentVolumeClaim
BeforeEach(func() {
pvConfig.reclaimPolicy = v1.PersistentVolumeReclaimRecycle
pv, pvc = createPVPVC(c, pvConfig, ns, false)
waitOnPVandPVC(c, ns, pv, pvc)
pvConfig.ReclaimPolicy = v1.PersistentVolumeReclaimRecycle
pv, pvc = framework.CreatePVPVC(c, pvConfig, ns, false)
framework.WaitOnPVandPVC(c, ns, pv, pvc)
})
AfterEach(func() {
framework.Logf("AfterEach: Cleaning up test resources.")
pvPvcCleanup(c, ns, pv, pvc)
framework.PVPVCCleanup(c, ns, pv, pvc)
})
// This It() tests a scenario where a PV is written to by a Pod, recycled, then the volume checked
@ -263,24 +263,24 @@ var _ = framework.KubeDescribe("PersistentVolumes [Volume][Serial]", func() {
// (and test) succeed.
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.")
pod := makeWritePod(ns, pvc.Name)
pod := framework.MakeWritePod(ns, pvc.Name)
pod, err := c.Core().Pods(ns).Create(pod)
Expect(err).NotTo(HaveOccurred())
err = framework.WaitForPodSuccessInNamespace(c, pod.Name, ns)
Expect(err).NotTo(HaveOccurred())
deletePVCandValidatePV(c, ns, pvc, pv, v1.VolumeAvailable)
framework.DeletePVCandValidatePV(c, ns, pvc, pv, v1.VolumeAvailable)
By("Re-mounting the volume.")
pvc = makePersistentVolumeClaim(ns)
pvc = createPVC(c, ns, pvc)
pvc = framework.MakePersistentVolumeClaim(ns)
pvc = framework.CreatePVC(c, ns, pvc)
err = framework.WaitForPersistentVolumeClaimPhase(v1.ClaimBound, c, ns, pvc.Name, 2*time.Second, 60*time.Second)
Expect(err).NotTo(HaveOccurred())
// If a file is detected in /mnt, fail the pod and do not restart it.
By("Verifying the mount has been cleaned.")
mount := pod.Spec.Containers[0].VolumeMounts[0].MountPath
pod = makePod(ns, pvc.Name, fmt.Sprintf("[ $(ls -A %s | wc -l) -eq 0 ] && exit 0 || exit 1", mount))
pod = framework.MakePod(ns, pvc.Name, fmt.Sprintf("[ $(ls -A %s | wc -l) -eq 0 ] && exit 0 || exit 1", mount))
pod, err = c.Core().Pods(ns).Create(pod)
Expect(err).NotTo(HaveOccurred())
@ -303,7 +303,7 @@ var _ = framework.KubeDescribe("PersistentVolumes [Volume][Serial]", func() {
pv *v1.PersistentVolume
pvc *v1.PersistentVolumeClaim
clientPod *v1.Pod
pvConfig persistentVolumeConfig
pvConfig framework.PersistentVolumeConfig
)
BeforeEach(func() {
@ -312,16 +312,16 @@ var _ = framework.KubeDescribe("PersistentVolumes [Volume][Serial]", func() {
if diskName == "" {
diskName, err = createPDWithRetry()
Expect(err).NotTo(HaveOccurred())
pvConfig = persistentVolumeConfig{
namePrefix: "gce-",
pvSource: v1.PersistentVolumeSource{
pvConfig = framework.PersistentVolumeConfig{
NamePrefix: "gce-",
PVSource: v1.PersistentVolumeSource{
GCEPersistentDisk: &v1.GCEPersistentDiskVolumeSource{
PDName: diskName,
FSType: "ext3",
ReadOnly: false,
},
},
prebind: nil,
Prebind: nil,
}
}
clientPod, pv, pvc = initializeGCETestSpec(c, ns, pvConfig, false)
@ -331,8 +331,8 @@ var _ = framework.KubeDescribe("PersistentVolumes [Volume][Serial]", func() {
AfterEach(func() {
framework.Logf("AfterEach: Cleaning up test resources")
if c != nil {
deletePodWithWait(f, c, clientPod)
pvPvcCleanup(c, ns, pv, pvc)
framework.DeletePodWithWait(f, c, clientPod)
framework.PVPVCCleanup(c, ns, pv, pvc)
clientPod = nil
pvc = nil
pv = nil
@ -351,11 +351,11 @@ var _ = framework.KubeDescribe("PersistentVolumes [Volume][Serial]", func() {
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")
deletePersistentVolumeClaim(c, pvc.Name, ns)
verifyGCEDiskAttached(diskName, node)
framework.DeletePersistentVolumeClaim(c, pvc.Name, ns)
framework.VerifyGCEDiskAttached(diskName, node)
By("Deleting the Pod")
deletePodWithWait(f, c, clientPod)
framework.DeletePodWithWait(f, c, clientPod)
By("Verifying Persistent Disk detach")
err = waitForPDDetach(diskName, node)
@ -367,11 +367,11 @@ var _ = framework.KubeDescribe("PersistentVolumes [Volume][Serial]", func() {
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")
deletePersistentVolume(c, pv.Name)
verifyGCEDiskAttached(diskName, node)
framework.DeletePersistentVolume(c, pv.Name)
framework.VerifyGCEDiskAttached(diskName, node)
By("Deleting the client pod")
deletePodWithWait(f, c, clientPod)
framework.DeletePodWithWait(f, c, clientPod)
By("Verifying Persistent Disk detaches")
err = waitForPDDetach(diskName, node)

View File

@ -119,14 +119,14 @@ var _ = framework.KubeDescribe("PersistentVolumes [Feature:ReclaimPolicy]", func
writeContentToVSpherePV(c, pvc, volumeFileContent)
By("Delete PVC")
deletePersistentVolumeClaim(c, pvc.Name, ns)
framework.DeletePersistentVolumeClaim(c, pvc.Name, ns)
pvc = nil
By("Verify PV is retained")
framework.Logf("Waiting for PV %v to become Released", pv.Name)
err = framework.WaitForPersistentVolumePhase(v1.VolumeReleased, c, pv.Name, 3*time.Second, 300*time.Second)
Expect(err).NotTo(HaveOccurred())
deletePersistentVolume(c, pv.Name)
framework.DeletePersistentVolume(c, pv.Name)
By("Creating the PV for same volume path")
pv = getVSpherePersistentVolumeSpec(volumePath, v1.PersistentVolumeReclaimRetain, nil)
@ -139,7 +139,7 @@ var _ = framework.KubeDescribe("PersistentVolumes [Feature:ReclaimPolicy]", func
Expect(err).NotTo(HaveOccurred())
By("wait for the pv and pvc to bind")
waitOnPVandPVC(c, ns, pv, pvc)
framework.WaitOnPVandPVC(c, ns, pv, pvc)
verifyContentOfVSpherePV(c, pvc, volumeFileContent)
})
@ -173,10 +173,10 @@ func testCleanupVSpherePersistentVolumeReclaim(vsp *vsphere.VSphere, c clientset
vsp.DeleteVolume(volumePath)
}
if pv != nil {
deletePersistentVolume(c, pv.Name)
framework.DeletePersistentVolume(c, pv.Name)
}
if pvc != nil {
deletePersistentVolumeClaim(c, pvc.Name, ns)
framework.DeletePersistentVolumeClaim(c, pvc.Name, ns)
}
}
@ -185,10 +185,10 @@ func deletePVCAfterBind(c clientset.Interface, ns string, pvc *v1.PersistentVolu
var err error
By("wait for the pv and pvc to bind")
waitOnPVandPVC(c, ns, pv, pvc)
framework.WaitOnPVandPVC(c, ns, pv, pvc)
By("delete pvc")
deletePersistentVolumeClaim(c, pvc.Name, ns)
framework.DeletePersistentVolumeClaim(c, pvc.Name, ns)
pvc, err = c.CoreV1().PersistentVolumeClaims(ns).Get(pvc.Name, metav1.GetOptions{})
if !apierrs.IsNotFound(err) {
Expect(err).NotTo(HaveOccurred())

View File

@ -81,14 +81,14 @@ var _ = framework.KubeDescribe("PersistentVolumes [Feature:LabelSelector]", func
Expect(err).NotTo(HaveOccurred())
By("wait for the pvc_ssd to bind with pv_ssd")
waitOnPVandPVC(c, ns, pv_ssd, pvc_ssd)
framework.WaitOnPVandPVC(c, ns, pv_ssd, pvc_ssd)
By("Verify status of pvc_vvol is pending")
err = framework.WaitForPersistentVolumeClaimPhase(v1.ClaimPending, c, ns, pvc_vvol.Name, 3*time.Second, 300*time.Second)
Expect(err).NotTo(HaveOccurred())
By("delete pvc_ssd")
deletePersistentVolumeClaim(c, pvc_ssd.Name, ns)
framework.DeletePersistentVolumeClaim(c, pvc_ssd.Name, ns)
By("verify pv_ssd is deleted")
err = framework.WaitForPersistentVolumeDeleted(c, pv_ssd.Name, 3*time.Second, 300*time.Second)
@ -96,7 +96,7 @@ var _ = framework.KubeDescribe("PersistentVolumes [Feature:LabelSelector]", func
volumePath = ""
By("delete pvc_vvol")
deletePersistentVolumeClaim(c, pvc_vvol.Name, ns)
framework.DeletePersistentVolumeClaim(c, pvc_vvol.Name, ns)
})
})
})
@ -139,12 +139,12 @@ func testCleanupVSpherePVClabelselector(c clientset.Interface, ns string, volume
vsp.DeleteVolume(volumePath)
}
if pvc_ssd != nil {
deletePersistentVolumeClaim(c, pvc_ssd.Name, ns)
framework.DeletePersistentVolumeClaim(c, pvc_ssd.Name, ns)
}
if pvc_vvol != nil {
deletePersistentVolumeClaim(c, pvc_vvol.Name, ns)
framework.DeletePersistentVolumeClaim(c, pvc_vvol.Name, ns)
}
if pv_ssd != nil {
deletePersistentVolume(c, pv_ssd.Name)
framework.DeletePersistentVolume(c, pv_ssd.Name)
}
}

View File

@ -143,7 +143,7 @@ var _ = framework.KubeDescribe("Dynamic provisioning", func() {
allZones := sets.NewString() // all zones in the project
managedZones := sets.NewString() // subset of allZones
gceCloud, err := getGCECloud()
gceCloud, err := framework.GetGCECloud()
Expect(err).NotTo(HaveOccurred())
// Get all k8s managed zones

View File

@ -21,6 +21,7 @@ import (
"time"
"fmt"
. "github.com/onsi/gomega"
"k8s.io/apimachinery/pkg/api/resource"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@ -84,24 +85,24 @@ func waitForVSphereDiskToDetach(vsp *vsphere.VSphere, volumePath string, nodeNam
// function to create vsphere volume spec with given VMDK volume path, Reclaim Policy and labels
func getVSpherePersistentVolumeSpec(volumePath string, persistentVolumeReclaimPolicy v1.PersistentVolumeReclaimPolicy, labels map[string]string) *v1.PersistentVolume {
var (
pvConfig persistentVolumeConfig
pvConfig framework.PersistentVolumeConfig
pv *v1.PersistentVolume
claimRef *v1.ObjectReference
)
pvConfig = persistentVolumeConfig{
namePrefix: "vspherepv-",
pvSource: v1.PersistentVolumeSource{
pvConfig = framework.PersistentVolumeConfig{
NamePrefix: "vspherepv-",
PVSource: v1.PersistentVolumeSource{
VsphereVolume: &v1.VsphereVirtualDiskVolumeSource{
VolumePath: volumePath,
FSType: "ext4",
},
},
prebind: nil,
Prebind: nil,
}
pv = &v1.PersistentVolume{
ObjectMeta: metav1.ObjectMeta{
GenerateName: pvConfig.namePrefix,
GenerateName: pvConfig.NamePrefix,
Annotations: map[string]string{
volumehelper.VolumeGidAnnotationKey: "777",
},
@ -111,7 +112,7 @@ func getVSpherePersistentVolumeSpec(volumePath string, persistentVolumeReclaimPo
Capacity: v1.ResourceList{
v1.ResourceName(v1.ResourceStorage): resource.MustParse("2Gi"),
},
PersistentVolumeSource: pvConfig.pvSource,
PersistentVolumeSource: pvConfig.PVSource,
AccessModes: []v1.PersistentVolumeAccessMode{
v1.ReadWriteOnce,
},