Document and improve defaulting for MakePersistentVolume, dedupe some manual PV creations

This commit is contained in:
David Zhu 2019-07-24 14:34:15 -07:00
parent a1f4c2ed21
commit 862ba3fc05
4 changed files with 71 additions and 77 deletions

View File

@ -78,14 +78,29 @@ type PVCMap map[types.NamespacedName]pvcval
// }, // },
// } // }
type PersistentVolumeConfig struct { type PersistentVolumeConfig struct {
PVSource v1.PersistentVolumeSource // [Optional] NamePrefix defaults to "pv-" if unset
Prebind *v1.PersistentVolumeClaim NamePrefix string
// [Optional] Labels contains information used to organize and categorize
// objects
Labels labels.Set
// PVSource contains the details of the underlying volume and must be set
PVSource v1.PersistentVolumeSource
// [Optional] Prebind lets you specify a PVC to bind this PV to before
// creation
Prebind *v1.PersistentVolumeClaim
// [Optiona] ReclaimPolicy defaults to "Reclaim" if unset
ReclaimPolicy v1.PersistentVolumeReclaimPolicy ReclaimPolicy v1.PersistentVolumeReclaimPolicy
NamePrefix string
Labels labels.Set
StorageClassName string StorageClassName string
NodeAffinity *v1.VolumeNodeAffinity // [Optional] NodeAffinity defines constraints that limit what nodes this
VolumeMode *v1.PersistentVolumeMode // volume can be accessed from.
NodeAffinity *v1.VolumeNodeAffinity
// [Optional] VolumeMode defaults to "Filesystem" if unset
VolumeMode *v1.PersistentVolumeMode
// [Optional] AccessModes defaults to RWO if unset
AccessModes []v1.PersistentVolumeAccessMode
// [Optional] Capacity is the storage capacity in Quantity format. Defaults
// to "2Gi" if unset
Capacity string
} }
// PersistentVolumeClaimConfig is consumed by MakePersistentVolumeClaim() to // PersistentVolumeClaimConfig is consumed by MakePersistentVolumeClaim() to
@ -582,17 +597,33 @@ func makePvcKey(ns, name string) types.NamespacedName {
// is added later in CreatePVCPV. // is added later in CreatePVCPV.
func MakePersistentVolume(pvConfig PersistentVolumeConfig) *v1.PersistentVolume { func MakePersistentVolume(pvConfig PersistentVolumeConfig) *v1.PersistentVolume {
var claimRef *v1.ObjectReference var claimRef *v1.ObjectReference
// If the reclaimPolicy is not provided, assume Retain
if len(pvConfig.AccessModes) == 0 {
pvConfig.AccessModes = append(pvConfig.AccessModes, v1.ReadWriteOnce)
}
if len(pvConfig.NamePrefix) == 0 {
pvConfig.NamePrefix = "pv-"
}
if pvConfig.ReclaimPolicy == "" { if pvConfig.ReclaimPolicy == "" {
e2elog.Logf("PV ReclaimPolicy unspecified, default: Retain")
pvConfig.ReclaimPolicy = v1.PersistentVolumeReclaimRetain pvConfig.ReclaimPolicy = v1.PersistentVolumeReclaimRetain
} }
if len(pvConfig.Capacity) == 0 {
pvConfig.Capacity = "2Gi"
}
if pvConfig.Prebind != nil { if pvConfig.Prebind != nil {
claimRef = &v1.ObjectReference{ claimRef = &v1.ObjectReference{
Name: pvConfig.Prebind.Name, Kind: "PersistentVolumeClaim",
Namespace: pvConfig.Prebind.Namespace, APIVersion: "v1",
Name: pvConfig.Prebind.Name,
Namespace: pvConfig.Prebind.Namespace,
UID: pvConfig.Prebind.UID,
} }
} }
return &v1.PersistentVolume{ return &v1.PersistentVolume{
ObjectMeta: metav1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
GenerateName: pvConfig.NamePrefix, GenerateName: pvConfig.NamePrefix,
@ -604,18 +635,14 @@ func MakePersistentVolume(pvConfig PersistentVolumeConfig) *v1.PersistentVolume
Spec: v1.PersistentVolumeSpec{ Spec: v1.PersistentVolumeSpec{
PersistentVolumeReclaimPolicy: pvConfig.ReclaimPolicy, PersistentVolumeReclaimPolicy: pvConfig.ReclaimPolicy,
Capacity: v1.ResourceList{ Capacity: v1.ResourceList{
v1.ResourceName(v1.ResourceStorage): resource.MustParse("2Gi"), v1.ResourceStorage: resource.MustParse(pvConfig.Capacity),
}, },
PersistentVolumeSource: pvConfig.PVSource, PersistentVolumeSource: pvConfig.PVSource,
AccessModes: []v1.PersistentVolumeAccessMode{ AccessModes: pvConfig.AccessModes,
v1.ReadWriteOnce, ClaimRef: claimRef,
v1.ReadOnlyMany, StorageClassName: pvConfig.StorageClassName,
v1.ReadWriteMany, NodeAffinity: pvConfig.NodeAffinity,
}, VolumeMode: pvConfig.VolumeMode,
ClaimRef: claimRef,
StorageClassName: pvConfig.StorageClassName,
NodeAffinity: pvConfig.NodeAffinity,
VolumeMode: pvConfig.VolumeMode,
}, },
} }
} }
@ -651,7 +678,7 @@ func MakePersistentVolumeClaim(cfg PersistentVolumeClaimConfig, ns string) *v1.P
AccessModes: cfg.AccessModes, AccessModes: cfg.AccessModes,
Resources: v1.ResourceRequirements{ Resources: v1.ResourceRequirements{
Requests: v1.ResourceList{ Requests: v1.ResourceList{
v1.ResourceName(v1.ResourceStorage): resource.MustParse(cfg.ClaimSize), v1.ResourceStorage: resource.MustParse(cfg.ClaimSize),
}, },
}, },
StorageClassName: cfg.StorageClassName, StorageClassName: cfg.StorageClassName,

View File

@ -33,7 +33,6 @@ import (
storagev1 "k8s.io/api/storage/v1" storagev1 "k8s.io/api/storage/v1"
storagev1beta1 "k8s.io/api/storage/v1beta1" storagev1beta1 "k8s.io/api/storage/v1beta1"
apierrs "k8s.io/apimachinery/pkg/api/errors" apierrs "k8s.io/apimachinery/pkg/api/errors"
"k8s.io/apimachinery/pkg/api/resource"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/runtime/schema"
"k8s.io/apimachinery/pkg/types" "k8s.io/apimachinery/pkg/types"
@ -658,31 +657,25 @@ var _ = utils.SIGDescribe("Dynamic Provisioning", func() {
framework.ExpectNoError(err) framework.ExpectNoError(err)
ginkgo.By("creating PV") ginkgo.By("creating PV")
pv := &v1.PersistentVolume{ pv := framework.MakePersistentVolume(framework.PersistentVolumeConfig{
ObjectMeta: metav1.ObjectMeta{ NamePrefix: "volume-idempotent-delete-",
GenerateName: "volume-idempotent-delete-", // Use Retain to keep the PV, the test will change it to Delete
// when the time comes.
ReclaimPolicy: v1.PersistentVolumeReclaimRetain,
AccessModes: []v1.PersistentVolumeAccessMode{
v1.ReadWriteOnce,
}, },
Spec: v1.PersistentVolumeSpec{ Capacity: "1Gi",
// Use Retain to keep the PV, the test will change it to Delete // PV is bound to non-existing PVC, so it's reclaim policy is
// when the time comes. // executed immediately
PersistentVolumeReclaimPolicy: v1.PersistentVolumeReclaimRetain, Prebind: &v1.PersistentVolumeClaim{
AccessModes: []v1.PersistentVolumeAccessMode{ ObjectMeta: metav1.ObjectMeta{
v1.ReadWriteOnce, Name: "dummy-claim-name",
}, Namespace: ns,
Capacity: v1.ResourceList{ UID: types.UID("01234567890"),
v1.ResourceName(v1.ResourceStorage): resource.MustParse("1Gi"),
},
// PV is bound to non-existing PVC, so it's reclaim policy is
// executed immediately
ClaimRef: &v1.ObjectReference{
Kind: "PersistentVolumeClaim",
APIVersion: "v1",
UID: types.UID("01234567890"),
Namespace: ns,
Name: "dummy-claim-name",
}, },
}, },
} })
switch framework.TestContext.Provider { switch framework.TestContext.Provider {
case "aws": case "aws":
pv.Spec.PersistentVolumeSource = v1.PersistentVolumeSource{ pv.Spec.PersistentVolumeSource = v1.PersistentVolumeSource{

View File

@ -39,7 +39,6 @@ go_library(
], ],
importpath = "k8s.io/kubernetes/test/e2e/storage/vsphere", importpath = "k8s.io/kubernetes/test/e2e/storage/vsphere",
deps = [ deps = [
"//pkg/volume/util:go_default_library",
"//staging/src/k8s.io/api/apps/v1:go_default_library", "//staging/src/k8s.io/api/apps/v1:go_default_library",
"//staging/src/k8s.io/api/core/v1:go_default_library", "//staging/src/k8s.io/api/core/v1:go_default_library",
"//staging/src/k8s.io/api/storage/v1:go_default_library", "//staging/src/k8s.io/api/storage/v1:go_default_library",

View File

@ -40,7 +40,6 @@ import (
"k8s.io/apimachinery/pkg/util/uuid" "k8s.io/apimachinery/pkg/util/uuid"
"k8s.io/apimachinery/pkg/util/wait" "k8s.io/apimachinery/pkg/util/wait"
clientset "k8s.io/client-go/kubernetes" clientset "k8s.io/client-go/kubernetes"
"k8s.io/kubernetes/pkg/volume/util"
"k8s.io/kubernetes/test/e2e/framework" "k8s.io/kubernetes/test/e2e/framework"
e2elog "k8s.io/kubernetes/test/e2e/framework/log" e2elog "k8s.io/kubernetes/test/e2e/framework/log"
e2essh "k8s.io/kubernetes/test/e2e/framework/ssh" e2essh "k8s.io/kubernetes/test/e2e/framework/ssh"
@ -156,12 +155,7 @@ func waitForVSphereDiskToDetach(volumePath string, nodeName string) error {
// function to create vsphere volume spec with given VMDK volume path, Reclaim Policy and labels // 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 { func getVSpherePersistentVolumeSpec(volumePath string, persistentVolumeReclaimPolicy v1.PersistentVolumeReclaimPolicy, labels map[string]string) *v1.PersistentVolume {
var ( return framework.MakePersistentVolume(framework.PersistentVolumeConfig{
pvConfig framework.PersistentVolumeConfig
pv *v1.PersistentVolume
claimRef *v1.ObjectReference
)
pvConfig = framework.PersistentVolumeConfig{
NamePrefix: "vspherepv-", NamePrefix: "vspherepv-",
PVSource: v1.PersistentVolumeSource{ PVSource: v1.PersistentVolumeSource{
VsphereVolume: &v1.VsphereVirtualDiskVolumeSource{ VsphereVolume: &v1.VsphereVirtualDiskVolumeSource{
@ -169,32 +163,13 @@ func getVSpherePersistentVolumeSpec(volumePath string, persistentVolumeReclaimPo
FSType: "ext4", FSType: "ext4",
}, },
}, },
Prebind: nil, ReclaimPolicy: persistentVolumeReclaimPolicy,
} Capacity: "2Gi",
AccessModes: []v1.PersistentVolumeAccessMode{
pv = &v1.PersistentVolume{ v1.ReadWriteOnce,
ObjectMeta: metav1.ObjectMeta{
GenerateName: pvConfig.NamePrefix,
Annotations: map[string]string{
util.VolumeGidAnnotationKey: "777",
},
}, },
Spec: v1.PersistentVolumeSpec{ Labels: labels,
PersistentVolumeReclaimPolicy: persistentVolumeReclaimPolicy, })
Capacity: v1.ResourceList{
v1.ResourceName(v1.ResourceStorage): resource.MustParse("2Gi"),
},
PersistentVolumeSource: pvConfig.PVSource,
AccessModes: []v1.PersistentVolumeAccessMode{
v1.ReadWriteOnce,
},
ClaimRef: claimRef,
},
}
if labels != nil {
pv.Labels = labels
}
return pv
} }
// function to get vsphere persistent volume spec with given selector labels. // function to get vsphere persistent volume spec with given selector labels.