mirror of https://github.com/k3s-io/k3s
Merge pull request #77703 from ddebroy/inline-mig-1
API changes to support migration of inline in-tree volumes to CSIk3s-v1.15.3
commit
b7fa33ec15
|
@ -15702,6 +15702,10 @@
|
||||||
"io.k8s.api.storage.v1.VolumeAttachmentSource": {
|
"io.k8s.api.storage.v1.VolumeAttachmentSource": {
|
||||||
"description": "VolumeAttachmentSource represents a volume that should be attached. Right now only PersistenVolumes can be attached via external attacher, in future we may allow also inline volumes in pods. Exactly one member can be set.",
|
"description": "VolumeAttachmentSource represents a volume that should be attached. Right now only PersistenVolumes can be attached via external attacher, in future we may allow also inline volumes in pods. Exactly one member can be set.",
|
||||||
"properties": {
|
"properties": {
|
||||||
|
"inlineVolumeSpec": {
|
||||||
|
"$ref": "#/definitions/io.k8s.api.core.v1.PersistentVolumeSpec",
|
||||||
|
"description": "inlineVolumeSpec contains all the information necessary to attach a persistent volume defined by a pod's inline VolumeSource. This field is populated only for the CSIMigration feature. It contains translated fields from a pod's inline VolumeSource to a PersistentVolumeSpec. This field is alpha-level and is only honored by servers that enabled the CSIMigration feature."
|
||||||
|
},
|
||||||
"persistentVolumeName": {
|
"persistentVolumeName": {
|
||||||
"description": "Name of the persistent volume to attach.",
|
"description": "Name of the persistent volume to attach.",
|
||||||
"type": "string"
|
"type": "string"
|
||||||
|
@ -15848,6 +15852,10 @@
|
||||||
"io.k8s.api.storage.v1alpha1.VolumeAttachmentSource": {
|
"io.k8s.api.storage.v1alpha1.VolumeAttachmentSource": {
|
||||||
"description": "VolumeAttachmentSource represents a volume that should be attached. Right now only PersistenVolumes can be attached via external attacher, in future we may allow also inline volumes in pods. Exactly one member can be set.",
|
"description": "VolumeAttachmentSource represents a volume that should be attached. Right now only PersistenVolumes can be attached via external attacher, in future we may allow also inline volumes in pods. Exactly one member can be set.",
|
||||||
"properties": {
|
"properties": {
|
||||||
|
"inlineVolumeSpec": {
|
||||||
|
"$ref": "#/definitions/io.k8s.api.core.v1.PersistentVolumeSpec",
|
||||||
|
"description": "inlineVolumeSpec contains all the information necessary to attach a persistent volume defined by a pod's inline VolumeSource. This field is populated only for the CSIMigration feature. It contains translated fields from a pod's inline VolumeSource to a PersistentVolumeSpec. This field is alpha-level and is only honored by servers that enabled the CSIMigration feature."
|
||||||
|
},
|
||||||
"persistentVolumeName": {
|
"persistentVolumeName": {
|
||||||
"description": "Name of the persistent volume to attach.",
|
"description": "Name of the persistent volume to attach.",
|
||||||
"type": "string"
|
"type": "string"
|
||||||
|
@ -16285,6 +16293,10 @@
|
||||||
"io.k8s.api.storage.v1beta1.VolumeAttachmentSource": {
|
"io.k8s.api.storage.v1beta1.VolumeAttachmentSource": {
|
||||||
"description": "VolumeAttachmentSource represents a volume that should be attached. Right now only PersistenVolumes can be attached via external attacher, in future we may allow also inline volumes in pods. Exactly one member can be set.",
|
"description": "VolumeAttachmentSource represents a volume that should be attached. Right now only PersistenVolumes can be attached via external attacher, in future we may allow also inline volumes in pods. Exactly one member can be set.",
|
||||||
"properties": {
|
"properties": {
|
||||||
|
"inlineVolumeSpec": {
|
||||||
|
"$ref": "#/definitions/io.k8s.api.core.v1.PersistentVolumeSpec",
|
||||||
|
"description": "inlineVolumeSpec contains all the information necessary to attach a persistent volume defined by a pod's inline VolumeSource. This field is populated only for the CSIMigration feature. It contains translated fields from a pod's inline VolumeSource to a PersistentVolumeSpec. This field is alpha-level and is only honored by servers that enabled the CSIMigration feature."
|
||||||
|
},
|
||||||
"persistentVolumeName": {
|
"persistentVolumeName": {
|
||||||
"description": "Name of the persistent volume to attach.",
|
"description": "Name of the persistent volume to attach.",
|
||||||
"type": "string"
|
"type": "string"
|
||||||
|
|
|
@ -146,6 +146,10 @@ func TestDefaulting(t *testing.T) {
|
||||||
{Group: "storage.k8s.io", Version: "v1beta1", Kind: "CSIDriverList"}: {},
|
{Group: "storage.k8s.io", Version: "v1beta1", Kind: "CSIDriverList"}: {},
|
||||||
{Group: "storage.k8s.io", Version: "v1", Kind: "StorageClass"}: {},
|
{Group: "storage.k8s.io", Version: "v1", Kind: "StorageClass"}: {},
|
||||||
{Group: "storage.k8s.io", Version: "v1", Kind: "StorageClassList"}: {},
|
{Group: "storage.k8s.io", Version: "v1", Kind: "StorageClassList"}: {},
|
||||||
|
{Group: "storage.k8s.io", Version: "v1", Kind: "VolumeAttachment"}: {},
|
||||||
|
{Group: "storage.k8s.io", Version: "v1", Kind: "VolumeAttachmentList"}: {},
|
||||||
|
{Group: "storage.k8s.io", Version: "v1beta1", Kind: "VolumeAttachment"}: {},
|
||||||
|
{Group: "storage.k8s.io", Version: "v1beta1", Kind: "VolumeAttachmentList"}: {},
|
||||||
{Group: "authentication.k8s.io", Version: "v1", Kind: "TokenRequest"}: {},
|
{Group: "authentication.k8s.io", Version: "v1", Kind: "TokenRequest"}: {},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -20,7 +20,7 @@ import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"reflect"
|
"reflect"
|
||||||
|
|
||||||
"k8s.io/api/core/v1"
|
v1 "k8s.io/api/core/v1"
|
||||||
|
|
||||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
"k8s.io/apimachinery/pkg/conversion"
|
"k8s.io/apimachinery/pkg/conversion"
|
||||||
|
@ -463,3 +463,13 @@ func dropInitContainerAnnotations(oldAnnotations map[string]string) map[string]s
|
||||||
}
|
}
|
||||||
return newAnnotations
|
return newAnnotations
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Convert_core_PersistentVolumeSpec_To_v1_PersistentVolumeSpec is defined outside the autogenerated file for use by other API packages
|
||||||
|
func Convert_core_PersistentVolumeSpec_To_v1_PersistentVolumeSpec(in *core.PersistentVolumeSpec, out *v1.PersistentVolumeSpec, s conversion.Scope) error {
|
||||||
|
return autoConvert_core_PersistentVolumeSpec_To_v1_PersistentVolumeSpec(in, out, s)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Convert_v1_PersistentVolumeSpec_To_core_PersistentVolumeSpec is defined outside the autogenerated file for use by other API packages
|
||||||
|
func Convert_v1_PersistentVolumeSpec_To_core_PersistentVolumeSpec(in *v1.PersistentVolumeSpec, out *core.PersistentVolumeSpec, s conversion.Scope) error {
|
||||||
|
return autoConvert_v1_PersistentVolumeSpec_To_core_PersistentVolumeSpec(in, out, s)
|
||||||
|
}
|
||||||
|
|
|
@ -2035,6 +2035,11 @@ func RegisterConversions(s *runtime.Scheme) error {
|
||||||
}); err != nil {
|
}); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
if err := s.AddConversionFunc((*core.PersistentVolumeSpec)(nil), (*v1.PersistentVolumeSpec)(nil), func(a, b interface{}, scope conversion.Scope) error {
|
||||||
|
return Convert_core_PersistentVolumeSpec_To_v1_PersistentVolumeSpec(a.(*core.PersistentVolumeSpec), b.(*v1.PersistentVolumeSpec), scope)
|
||||||
|
}); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
if err := s.AddConversionFunc((*core.PodSpec)(nil), (*v1.PodSpec)(nil), func(a, b interface{}, scope conversion.Scope) error {
|
if err := s.AddConversionFunc((*core.PodSpec)(nil), (*v1.PodSpec)(nil), func(a, b interface{}, scope conversion.Scope) error {
|
||||||
return Convert_core_PodSpec_To_v1_PodSpec(a.(*core.PodSpec), b.(*v1.PodSpec), scope)
|
return Convert_core_PodSpec_To_v1_PodSpec(a.(*core.PodSpec), b.(*v1.PodSpec), scope)
|
||||||
}); err != nil {
|
}); err != nil {
|
||||||
|
@ -2055,6 +2060,11 @@ func RegisterConversions(s *runtime.Scheme) error {
|
||||||
}); err != nil {
|
}); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
if err := s.AddConversionFunc((*v1.PersistentVolumeSpec)(nil), (*core.PersistentVolumeSpec)(nil), func(a, b interface{}, scope conversion.Scope) error {
|
||||||
|
return Convert_v1_PersistentVolumeSpec_To_core_PersistentVolumeSpec(a.(*v1.PersistentVolumeSpec), b.(*core.PersistentVolumeSpec), scope)
|
||||||
|
}); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
if err := s.AddConversionFunc((*v1.PodSpec)(nil), (*core.PodSpec)(nil), func(a, b interface{}, scope conversion.Scope) error {
|
if err := s.AddConversionFunc((*v1.PodSpec)(nil), (*core.PodSpec)(nil), func(a, b interface{}, scope conversion.Scope) error {
|
||||||
return Convert_v1_PodSpec_To_core_PodSpec(a.(*v1.PodSpec), b.(*core.PodSpec), scope)
|
return Convert_v1_PodSpec_To_core_PodSpec(a.(*v1.PodSpec), b.(*core.PodSpec), scope)
|
||||||
}); err != nil {
|
}); err != nil {
|
||||||
|
@ -5060,11 +5070,6 @@ func autoConvert_v1_PersistentVolumeSpec_To_core_PersistentVolumeSpec(in *v1.Per
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Convert_v1_PersistentVolumeSpec_To_core_PersistentVolumeSpec is an autogenerated conversion function.
|
|
||||||
func Convert_v1_PersistentVolumeSpec_To_core_PersistentVolumeSpec(in *v1.PersistentVolumeSpec, out *core.PersistentVolumeSpec, s conversion.Scope) error {
|
|
||||||
return autoConvert_v1_PersistentVolumeSpec_To_core_PersistentVolumeSpec(in, out, s)
|
|
||||||
}
|
|
||||||
|
|
||||||
func autoConvert_core_PersistentVolumeSpec_To_v1_PersistentVolumeSpec(in *core.PersistentVolumeSpec, out *v1.PersistentVolumeSpec, s conversion.Scope) error {
|
func autoConvert_core_PersistentVolumeSpec_To_v1_PersistentVolumeSpec(in *core.PersistentVolumeSpec, out *v1.PersistentVolumeSpec, s conversion.Scope) error {
|
||||||
out.Capacity = *(*v1.ResourceList)(unsafe.Pointer(&in.Capacity))
|
out.Capacity = *(*v1.ResourceList)(unsafe.Pointer(&in.Capacity))
|
||||||
if err := Convert_core_PersistentVolumeSource_To_v1_PersistentVolumeSource(&in.PersistentVolumeSource, &out.PersistentVolumeSource, s); err != nil {
|
if err := Convert_core_PersistentVolumeSource_To_v1_PersistentVolumeSource(&in.PersistentVolumeSource, &out.PersistentVolumeSource, s); err != nil {
|
||||||
|
@ -5080,11 +5085,6 @@ func autoConvert_core_PersistentVolumeSpec_To_v1_PersistentVolumeSpec(in *core.P
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Convert_core_PersistentVolumeSpec_To_v1_PersistentVolumeSpec is an autogenerated conversion function.
|
|
||||||
func Convert_core_PersistentVolumeSpec_To_v1_PersistentVolumeSpec(in *core.PersistentVolumeSpec, out *v1.PersistentVolumeSpec, s conversion.Scope) error {
|
|
||||||
return autoConvert_core_PersistentVolumeSpec_To_v1_PersistentVolumeSpec(in, out, s)
|
|
||||||
}
|
|
||||||
|
|
||||||
func autoConvert_v1_PersistentVolumeStatus_To_core_PersistentVolumeStatus(in *v1.PersistentVolumeStatus, out *core.PersistentVolumeStatus, s conversion.Scope) error {
|
func autoConvert_v1_PersistentVolumeStatus_To_core_PersistentVolumeStatus(in *v1.PersistentVolumeStatus, out *core.PersistentVolumeStatus, s conversion.Scope) error {
|
||||||
out.Phase = core.PersistentVolumePhase(in.Phase)
|
out.Phase = core.PersistentVolumePhase(in.Phase)
|
||||||
out.Message = in.Message
|
out.Message = in.Message
|
||||||
|
|
|
@ -705,11 +705,15 @@ func validateISCSIVolumeSource(iscsi *core.ISCSIVolumeSource, fldPath *field.Pat
|
||||||
return allErrs
|
return allErrs
|
||||||
}
|
}
|
||||||
|
|
||||||
func validateISCSIPersistentVolumeSource(iscsi *core.ISCSIPersistentVolumeSource, fldPath *field.Path) field.ErrorList {
|
func validateISCSIPersistentVolumeSource(iscsi *core.ISCSIPersistentVolumeSource, pvName string, fldPath *field.Path) field.ErrorList {
|
||||||
allErrs := field.ErrorList{}
|
allErrs := field.ErrorList{}
|
||||||
if len(iscsi.TargetPortal) == 0 {
|
if len(iscsi.TargetPortal) == 0 {
|
||||||
allErrs = append(allErrs, field.Required(fldPath.Child("targetPortal"), ""))
|
allErrs = append(allErrs, field.Required(fldPath.Child("targetPortal"), ""))
|
||||||
}
|
}
|
||||||
|
if iscsi.InitiatorName != nil && len(pvName+":"+iscsi.TargetPortal) > 64 {
|
||||||
|
tooLongErr := "Total length of <volume name>:<iscsi.targetPortal> must be under 64 characters if iscsi.initiatorName is specified."
|
||||||
|
allErrs = append(allErrs, field.Invalid(fldPath.Child("targetportal"), iscsi.TargetPortal, tooLongErr))
|
||||||
|
}
|
||||||
if len(iscsi.IQN) == 0 {
|
if len(iscsi.IQN) == 0 {
|
||||||
allErrs = append(allErrs, field.Required(fldPath.Child("iqn"), ""))
|
allErrs = append(allErrs, field.Required(fldPath.Child("iqn"), ""))
|
||||||
} else {
|
} else {
|
||||||
|
@ -1540,247 +1544,287 @@ var supportedDataSourceAPIGroupKinds = map[schema.GroupKind]bool{
|
||||||
{Group: "", Kind: "PersistentVolumeClaim"}: true,
|
{Group: "", Kind: "PersistentVolumeClaim"}: true,
|
||||||
}
|
}
|
||||||
|
|
||||||
func ValidatePersistentVolume(pv *core.PersistentVolume) field.ErrorList {
|
func ValidatePersistentVolumeSpec(pvSpec *core.PersistentVolumeSpec, pvName string, validateInlinePersistentVolumeSpec bool, fldPath *field.Path) field.ErrorList {
|
||||||
metaPath := field.NewPath("metadata")
|
allErrs := field.ErrorList{}
|
||||||
allErrs := ValidateObjectMeta(&pv.ObjectMeta, false, ValidatePersistentVolumeName, metaPath)
|
|
||||||
|
|
||||||
specPath := field.NewPath("spec")
|
if validateInlinePersistentVolumeSpec {
|
||||||
if len(pv.Spec.AccessModes) == 0 {
|
if pvSpec.ClaimRef != nil {
|
||||||
allErrs = append(allErrs, field.Required(specPath.Child("accessModes"), ""))
|
allErrs = append(allErrs, field.Forbidden(fldPath.Child("claimRef"), "may not be specified in the context of inline volumes"))
|
||||||
|
}
|
||||||
|
if len(pvSpec.Capacity) != 0 {
|
||||||
|
allErrs = append(allErrs, field.Forbidden(fldPath.Child("capacity"), "may not be specified in the context of inline volumes"))
|
||||||
|
}
|
||||||
|
if pvSpec.CSI == nil {
|
||||||
|
allErrs = append(allErrs, field.Required(fldPath.Child("csi"), "has to be specified in the context of inline volumes"))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
for _, mode := range pv.Spec.AccessModes {
|
|
||||||
|
if len(pvSpec.AccessModes) == 0 {
|
||||||
|
allErrs = append(allErrs, field.Required(fldPath.Child("accessModes"), ""))
|
||||||
|
}
|
||||||
|
for _, mode := range pvSpec.AccessModes {
|
||||||
if !supportedAccessModes.Has(string(mode)) {
|
if !supportedAccessModes.Has(string(mode)) {
|
||||||
allErrs = append(allErrs, field.NotSupported(specPath.Child("accessModes"), mode, supportedAccessModes.List()))
|
allErrs = append(allErrs, field.NotSupported(fldPath.Child("accessModes"), mode, supportedAccessModes.List()))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(pv.Spec.Capacity) == 0 {
|
if !validateInlinePersistentVolumeSpec {
|
||||||
allErrs = append(allErrs, field.Required(specPath.Child("capacity"), ""))
|
if len(pvSpec.Capacity) == 0 {
|
||||||
}
|
allErrs = append(allErrs, field.Required(fldPath.Child("capacity"), ""))
|
||||||
|
}
|
||||||
|
|
||||||
if _, ok := pv.Spec.Capacity[core.ResourceStorage]; !ok || len(pv.Spec.Capacity) > 1 {
|
if _, ok := pvSpec.Capacity[core.ResourceStorage]; !ok || len(pvSpec.Capacity) > 1 {
|
||||||
allErrs = append(allErrs, field.NotSupported(specPath.Child("capacity"), pv.Spec.Capacity, []string{string(core.ResourceStorage)}))
|
allErrs = append(allErrs, field.NotSupported(fldPath.Child("capacity"), pvSpec.Capacity, []string{string(core.ResourceStorage)}))
|
||||||
}
|
}
|
||||||
capPath := specPath.Child("capacity")
|
capPath := fldPath.Child("capacity")
|
||||||
for r, qty := range pv.Spec.Capacity {
|
for r, qty := range pvSpec.Capacity {
|
||||||
allErrs = append(allErrs, validateBasicResource(qty, capPath.Key(string(r)))...)
|
allErrs = append(allErrs, validateBasicResource(qty, capPath.Key(string(r)))...)
|
||||||
allErrs = append(allErrs, ValidatePositiveQuantityValue(qty, capPath.Key(string(r)))...)
|
allErrs = append(allErrs, ValidatePositiveQuantityValue(qty, capPath.Key(string(r)))...)
|
||||||
}
|
|
||||||
if len(string(pv.Spec.PersistentVolumeReclaimPolicy)) > 0 {
|
|
||||||
if !supportedReclaimPolicy.Has(string(pv.Spec.PersistentVolumeReclaimPolicy)) {
|
|
||||||
allErrs = append(allErrs, field.NotSupported(specPath.Child("persistentVolumeReclaimPolicy"), pv.Spec.PersistentVolumeReclaimPolicy, supportedReclaimPolicy.List()))
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
nodeAffinitySpecified, errs := validateVolumeNodeAffinity(pv.Spec.NodeAffinity, specPath.Child("nodeAffinity"))
|
if len(string(pvSpec.PersistentVolumeReclaimPolicy)) > 0 {
|
||||||
allErrs = append(allErrs, errs...)
|
if validateInlinePersistentVolumeSpec {
|
||||||
|
if pvSpec.PersistentVolumeReclaimPolicy != core.PersistentVolumeReclaimRetain {
|
||||||
numVolumes := 0
|
allErrs = append(allErrs, field.Forbidden(fldPath.Child("persistentVolumeReclaimPolicy"), "may only be "+string(core.PersistentVolumeReclaimRetain)+" in the context of inline volumes"))
|
||||||
if pv.Spec.HostPath != nil {
|
}
|
||||||
if numVolumes > 0 {
|
|
||||||
allErrs = append(allErrs, field.Forbidden(specPath.Child("hostPath"), "may not specify more than 1 volume type"))
|
|
||||||
} else {
|
} else {
|
||||||
numVolumes++
|
if !supportedReclaimPolicy.Has(string(pvSpec.PersistentVolumeReclaimPolicy)) {
|
||||||
allErrs = append(allErrs, validateHostPathVolumeSource(pv.Spec.HostPath, specPath.Child("hostPath"))...)
|
allErrs = append(allErrs, field.NotSupported(fldPath.Child("persistentVolumeReclaimPolicy"), pvSpec.PersistentVolumeReclaimPolicy, supportedReclaimPolicy.List()))
|
||||||
}
|
|
||||||
}
|
|
||||||
if pv.Spec.GCEPersistentDisk != nil {
|
|
||||||
if numVolumes > 0 {
|
|
||||||
allErrs = append(allErrs, field.Forbidden(specPath.Child("gcePersistentDisk"), "may not specify more than 1 volume type"))
|
|
||||||
} else {
|
|
||||||
numVolumes++
|
|
||||||
allErrs = append(allErrs, validateGCEPersistentDiskVolumeSource(pv.Spec.GCEPersistentDisk, specPath.Child("persistentDisk"))...)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if pv.Spec.AWSElasticBlockStore != nil {
|
|
||||||
if numVolumes > 0 {
|
|
||||||
allErrs = append(allErrs, field.Forbidden(specPath.Child("awsElasticBlockStore"), "may not specify more than 1 volume type"))
|
|
||||||
} else {
|
|
||||||
numVolumes++
|
|
||||||
allErrs = append(allErrs, validateAWSElasticBlockStoreVolumeSource(pv.Spec.AWSElasticBlockStore, specPath.Child("awsElasticBlockStore"))...)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if pv.Spec.Glusterfs != nil {
|
|
||||||
if numVolumes > 0 {
|
|
||||||
allErrs = append(allErrs, field.Forbidden(specPath.Child("glusterfs"), "may not specify more than 1 volume type"))
|
|
||||||
} else {
|
|
||||||
numVolumes++
|
|
||||||
allErrs = append(allErrs, validateGlusterfsPersistentVolumeSource(pv.Spec.Glusterfs, specPath.Child("glusterfs"))...)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if pv.Spec.Flocker != nil {
|
|
||||||
if numVolumes > 0 {
|
|
||||||
allErrs = append(allErrs, field.Forbidden(specPath.Child("flocker"), "may not specify more than 1 volume type"))
|
|
||||||
} else {
|
|
||||||
numVolumes++
|
|
||||||
allErrs = append(allErrs, validateFlockerVolumeSource(pv.Spec.Flocker, specPath.Child("flocker"))...)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if pv.Spec.NFS != nil {
|
|
||||||
if numVolumes > 0 {
|
|
||||||
allErrs = append(allErrs, field.Forbidden(specPath.Child("nfs"), "may not specify more than 1 volume type"))
|
|
||||||
} else {
|
|
||||||
numVolumes++
|
|
||||||
allErrs = append(allErrs, validateNFSVolumeSource(pv.Spec.NFS, specPath.Child("nfs"))...)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if pv.Spec.RBD != nil {
|
|
||||||
if numVolumes > 0 {
|
|
||||||
allErrs = append(allErrs, field.Forbidden(specPath.Child("rbd"), "may not specify more than 1 volume type"))
|
|
||||||
} else {
|
|
||||||
numVolumes++
|
|
||||||
allErrs = append(allErrs, validateRBDPersistentVolumeSource(pv.Spec.RBD, specPath.Child("rbd"))...)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if pv.Spec.Quobyte != nil {
|
|
||||||
if numVolumes > 0 {
|
|
||||||
allErrs = append(allErrs, field.Forbidden(specPath.Child("quobyte"), "may not specify more than 1 volume type"))
|
|
||||||
} else {
|
|
||||||
numVolumes++
|
|
||||||
allErrs = append(allErrs, validateQuobyteVolumeSource(pv.Spec.Quobyte, specPath.Child("quobyte"))...)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if pv.Spec.CephFS != nil {
|
|
||||||
if numVolumes > 0 {
|
|
||||||
allErrs = append(allErrs, field.Forbidden(specPath.Child("cephFS"), "may not specify more than 1 volume type"))
|
|
||||||
} else {
|
|
||||||
numVolumes++
|
|
||||||
allErrs = append(allErrs, validateCephFSPersistentVolumeSource(pv.Spec.CephFS, specPath.Child("cephfs"))...)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if pv.Spec.ISCSI != nil {
|
|
||||||
if numVolumes > 0 {
|
|
||||||
allErrs = append(allErrs, field.Forbidden(specPath.Child("iscsi"), "may not specify more than 1 volume type"))
|
|
||||||
} else {
|
|
||||||
numVolumes++
|
|
||||||
allErrs = append(allErrs, validateISCSIPersistentVolumeSource(pv.Spec.ISCSI, specPath.Child("iscsi"))...)
|
|
||||||
}
|
|
||||||
if pv.Spec.ISCSI.InitiatorName != nil && len(pv.ObjectMeta.Name+":"+pv.Spec.ISCSI.TargetPortal) > 64 {
|
|
||||||
tooLongErr := "Total length of <volume name>:<iscsi.targetPortal> must be under 64 characters if iscsi.initiatorName is specified."
|
|
||||||
allErrs = append(allErrs, field.Invalid(metaPath.Child("name"), pv.ObjectMeta.Name, tooLongErr))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if pv.Spec.Cinder != nil {
|
|
||||||
if numVolumes > 0 {
|
|
||||||
allErrs = append(allErrs, field.Forbidden(specPath.Child("cinder"), "may not specify more than 1 volume type"))
|
|
||||||
} else {
|
|
||||||
numVolumes++
|
|
||||||
allErrs = append(allErrs, validateCinderPersistentVolumeSource(pv.Spec.Cinder, specPath.Child("cinder"))...)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if pv.Spec.FC != nil {
|
|
||||||
if numVolumes > 0 {
|
|
||||||
allErrs = append(allErrs, field.Forbidden(specPath.Child("fc"), "may not specify more than 1 volume type"))
|
|
||||||
} else {
|
|
||||||
numVolumes++
|
|
||||||
allErrs = append(allErrs, validateFCVolumeSource(pv.Spec.FC, specPath.Child("fc"))...)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if pv.Spec.FlexVolume != nil {
|
|
||||||
numVolumes++
|
|
||||||
allErrs = append(allErrs, validateFlexPersistentVolumeSource(pv.Spec.FlexVolume, specPath.Child("flexVolume"))...)
|
|
||||||
}
|
|
||||||
if pv.Spec.AzureFile != nil {
|
|
||||||
if numVolumes > 0 {
|
|
||||||
allErrs = append(allErrs, field.Forbidden(specPath.Child("azureFile"), "may not specify more than 1 volume type"))
|
|
||||||
|
|
||||||
} else {
|
|
||||||
numVolumes++
|
|
||||||
allErrs = append(allErrs, validateAzureFilePV(pv.Spec.AzureFile, specPath.Child("azureFile"))...)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if pv.Spec.VsphereVolume != nil {
|
|
||||||
if numVolumes > 0 {
|
|
||||||
allErrs = append(allErrs, field.Forbidden(specPath.Child("vsphereVolume"), "may not specify more than 1 volume type"))
|
|
||||||
} else {
|
|
||||||
numVolumes++
|
|
||||||
allErrs = append(allErrs, validateVsphereVolumeSource(pv.Spec.VsphereVolume, specPath.Child("vsphereVolume"))...)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if pv.Spec.PhotonPersistentDisk != nil {
|
|
||||||
if numVolumes > 0 {
|
|
||||||
allErrs = append(allErrs, field.Forbidden(specPath.Child("photonPersistentDisk"), "may not specify more than 1 volume type"))
|
|
||||||
} else {
|
|
||||||
numVolumes++
|
|
||||||
allErrs = append(allErrs, validatePhotonPersistentDiskVolumeSource(pv.Spec.PhotonPersistentDisk, specPath.Child("photonPersistentDisk"))...)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if pv.Spec.PortworxVolume != nil {
|
|
||||||
if numVolumes > 0 {
|
|
||||||
allErrs = append(allErrs, field.Forbidden(specPath.Child("portworxVolume"), "may not specify more than 1 volume type"))
|
|
||||||
} else {
|
|
||||||
numVolumes++
|
|
||||||
allErrs = append(allErrs, validatePortworxVolumeSource(pv.Spec.PortworxVolume, specPath.Child("portworxVolume"))...)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if pv.Spec.AzureDisk != nil {
|
|
||||||
if numVolumes > 0 {
|
|
||||||
allErrs = append(allErrs, field.Forbidden(specPath.Child("azureDisk"), "may not specify more than 1 volume type"))
|
|
||||||
} else {
|
|
||||||
numVolumes++
|
|
||||||
allErrs = append(allErrs, validateAzureDisk(pv.Spec.AzureDisk, specPath.Child("azureDisk"))...)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if pv.Spec.ScaleIO != nil {
|
|
||||||
if numVolumes > 0 {
|
|
||||||
allErrs = append(allErrs, field.Forbidden(specPath.Child("scaleIO"), "may not specify more than 1 volume type"))
|
|
||||||
} else {
|
|
||||||
numVolumes++
|
|
||||||
allErrs = append(allErrs, validateScaleIOPersistentVolumeSource(pv.Spec.ScaleIO, specPath.Child("scaleIO"))...)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if pv.Spec.Local != nil {
|
|
||||||
if numVolumes > 0 {
|
|
||||||
allErrs = append(allErrs, field.Forbidden(specPath.Child("local"), "may not specify more than 1 volume type"))
|
|
||||||
} else {
|
|
||||||
numVolumes++
|
|
||||||
allErrs = append(allErrs, validateLocalVolumeSource(pv.Spec.Local, specPath.Child("local"))...)
|
|
||||||
|
|
||||||
// NodeAffinity is required
|
|
||||||
if !nodeAffinitySpecified {
|
|
||||||
allErrs = append(allErrs, field.Required(metaPath.Child("annotations"), "Local volume requires node affinity"))
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if pv.Spec.StorageOS != nil {
|
|
||||||
|
var nodeAffinitySpecified bool
|
||||||
|
var errs field.ErrorList
|
||||||
|
if pvSpec.NodeAffinity != nil {
|
||||||
|
if validateInlinePersistentVolumeSpec {
|
||||||
|
allErrs = append(allErrs, field.Forbidden(fldPath.Child("nodeAffinity"), "may not be specified in the context of inline volumes"))
|
||||||
|
} else {
|
||||||
|
nodeAffinitySpecified, errs = validateVolumeNodeAffinity(pvSpec.NodeAffinity, fldPath.Child("nodeAffinity"))
|
||||||
|
allErrs = append(allErrs, errs...)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
numVolumes := 0
|
||||||
|
if pvSpec.HostPath != nil {
|
||||||
if numVolumes > 0 {
|
if numVolumes > 0 {
|
||||||
allErrs = append(allErrs, field.Forbidden(specPath.Child("storageos"), "may not specify more than 1 volume type"))
|
allErrs = append(allErrs, field.Forbidden(fldPath.Child("hostPath"), "may not specify more than 1 volume type"))
|
||||||
} else {
|
} else {
|
||||||
numVolumes++
|
numVolumes++
|
||||||
allErrs = append(allErrs, validateStorageOSPersistentVolumeSource(pv.Spec.StorageOS, specPath.Child("storageos"))...)
|
allErrs = append(allErrs, validateHostPathVolumeSource(pvSpec.HostPath, fldPath.Child("hostPath"))...)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if pvSpec.GCEPersistentDisk != nil {
|
||||||
|
if numVolumes > 0 {
|
||||||
|
allErrs = append(allErrs, field.Forbidden(fldPath.Child("gcePersistentDisk"), "may not specify more than 1 volume type"))
|
||||||
|
} else {
|
||||||
|
numVolumes++
|
||||||
|
allErrs = append(allErrs, validateGCEPersistentDiskVolumeSource(pvSpec.GCEPersistentDisk, fldPath.Child("persistentDisk"))...)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if pvSpec.AWSElasticBlockStore != nil {
|
||||||
|
if numVolumes > 0 {
|
||||||
|
allErrs = append(allErrs, field.Forbidden(fldPath.Child("awsElasticBlockStore"), "may not specify more than 1 volume type"))
|
||||||
|
} else {
|
||||||
|
numVolumes++
|
||||||
|
allErrs = append(allErrs, validateAWSElasticBlockStoreVolumeSource(pvSpec.AWSElasticBlockStore, fldPath.Child("awsElasticBlockStore"))...)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if pvSpec.Glusterfs != nil {
|
||||||
|
if numVolumes > 0 {
|
||||||
|
allErrs = append(allErrs, field.Forbidden(fldPath.Child("glusterfs"), "may not specify more than 1 volume type"))
|
||||||
|
} else {
|
||||||
|
numVolumes++
|
||||||
|
allErrs = append(allErrs, validateGlusterfsPersistentVolumeSource(pvSpec.Glusterfs, fldPath.Child("glusterfs"))...)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if pvSpec.Flocker != nil {
|
||||||
|
if numVolumes > 0 {
|
||||||
|
allErrs = append(allErrs, field.Forbidden(fldPath.Child("flocker"), "may not specify more than 1 volume type"))
|
||||||
|
} else {
|
||||||
|
numVolumes++
|
||||||
|
allErrs = append(allErrs, validateFlockerVolumeSource(pvSpec.Flocker, fldPath.Child("flocker"))...)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if pvSpec.NFS != nil {
|
||||||
|
if numVolumes > 0 {
|
||||||
|
allErrs = append(allErrs, field.Forbidden(fldPath.Child("nfs"), "may not specify more than 1 volume type"))
|
||||||
|
} else {
|
||||||
|
numVolumes++
|
||||||
|
allErrs = append(allErrs, validateNFSVolumeSource(pvSpec.NFS, fldPath.Child("nfs"))...)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if pvSpec.RBD != nil {
|
||||||
|
if numVolumes > 0 {
|
||||||
|
allErrs = append(allErrs, field.Forbidden(fldPath.Child("rbd"), "may not specify more than 1 volume type"))
|
||||||
|
} else {
|
||||||
|
numVolumes++
|
||||||
|
allErrs = append(allErrs, validateRBDPersistentVolumeSource(pvSpec.RBD, fldPath.Child("rbd"))...)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if pvSpec.Quobyte != nil {
|
||||||
|
if numVolumes > 0 {
|
||||||
|
allErrs = append(allErrs, field.Forbidden(fldPath.Child("quobyte"), "may not specify more than 1 volume type"))
|
||||||
|
} else {
|
||||||
|
numVolumes++
|
||||||
|
allErrs = append(allErrs, validateQuobyteVolumeSource(pvSpec.Quobyte, fldPath.Child("quobyte"))...)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if pvSpec.CephFS != nil {
|
||||||
|
if numVolumes > 0 {
|
||||||
|
allErrs = append(allErrs, field.Forbidden(fldPath.Child("cephFS"), "may not specify more than 1 volume type"))
|
||||||
|
} else {
|
||||||
|
numVolumes++
|
||||||
|
allErrs = append(allErrs, validateCephFSPersistentVolumeSource(pvSpec.CephFS, fldPath.Child("cephfs"))...)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if pvSpec.ISCSI != nil {
|
||||||
|
if numVolumes > 0 {
|
||||||
|
allErrs = append(allErrs, field.Forbidden(fldPath.Child("iscsi"), "may not specify more than 1 volume type"))
|
||||||
|
} else {
|
||||||
|
numVolumes++
|
||||||
|
allErrs = append(allErrs, validateISCSIPersistentVolumeSource(pvSpec.ISCSI, pvName, fldPath.Child("iscsi"))...)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if pvSpec.Cinder != nil {
|
||||||
|
if numVolumes > 0 {
|
||||||
|
allErrs = append(allErrs, field.Forbidden(fldPath.Child("cinder"), "may not specify more than 1 volume type"))
|
||||||
|
} else {
|
||||||
|
numVolumes++
|
||||||
|
allErrs = append(allErrs, validateCinderPersistentVolumeSource(pvSpec.Cinder, fldPath.Child("cinder"))...)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if pvSpec.FC != nil {
|
||||||
|
if numVolumes > 0 {
|
||||||
|
allErrs = append(allErrs, field.Forbidden(fldPath.Child("fc"), "may not specify more than 1 volume type"))
|
||||||
|
} else {
|
||||||
|
numVolumes++
|
||||||
|
allErrs = append(allErrs, validateFCVolumeSource(pvSpec.FC, fldPath.Child("fc"))...)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if pvSpec.FlexVolume != nil {
|
||||||
|
numVolumes++
|
||||||
|
allErrs = append(allErrs, validateFlexPersistentVolumeSource(pvSpec.FlexVolume, fldPath.Child("flexVolume"))...)
|
||||||
|
}
|
||||||
|
if pvSpec.AzureFile != nil {
|
||||||
|
if numVolumes > 0 {
|
||||||
|
allErrs = append(allErrs, field.Forbidden(fldPath.Child("azureFile"), "may not specify more than 1 volume type"))
|
||||||
|
|
||||||
|
} else {
|
||||||
|
numVolumes++
|
||||||
|
allErrs = append(allErrs, validateAzureFilePV(pvSpec.AzureFile, fldPath.Child("azureFile"))...)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if pv.Spec.CSI != nil {
|
if pvSpec.VsphereVolume != nil {
|
||||||
if numVolumes > 0 {
|
if numVolumes > 0 {
|
||||||
allErrs = append(allErrs, field.Forbidden(specPath.Child("csi"), "may not specify more than 1 volume type"))
|
allErrs = append(allErrs, field.Forbidden(fldPath.Child("vsphereVolume"), "may not specify more than 1 volume type"))
|
||||||
} else {
|
} else {
|
||||||
numVolumes++
|
numVolumes++
|
||||||
allErrs = append(allErrs, validateCSIPersistentVolumeSource(pv.Spec.CSI, specPath.Child("csi"))...)
|
allErrs = append(allErrs, validateVsphereVolumeSource(pvSpec.VsphereVolume, fldPath.Child("vsphereVolume"))...)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if pvSpec.PhotonPersistentDisk != nil {
|
||||||
|
if numVolumes > 0 {
|
||||||
|
allErrs = append(allErrs, field.Forbidden(fldPath.Child("photonPersistentDisk"), "may not specify more than 1 volume type"))
|
||||||
|
} else {
|
||||||
|
numVolumes++
|
||||||
|
allErrs = append(allErrs, validatePhotonPersistentDiskVolumeSource(pvSpec.PhotonPersistentDisk, fldPath.Child("photonPersistentDisk"))...)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if pvSpec.PortworxVolume != nil {
|
||||||
|
if numVolumes > 0 {
|
||||||
|
allErrs = append(allErrs, field.Forbidden(fldPath.Child("portworxVolume"), "may not specify more than 1 volume type"))
|
||||||
|
} else {
|
||||||
|
numVolumes++
|
||||||
|
allErrs = append(allErrs, validatePortworxVolumeSource(pvSpec.PortworxVolume, fldPath.Child("portworxVolume"))...)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if pvSpec.AzureDisk != nil {
|
||||||
|
if numVolumes > 0 {
|
||||||
|
allErrs = append(allErrs, field.Forbidden(fldPath.Child("azureDisk"), "may not specify more than 1 volume type"))
|
||||||
|
} else {
|
||||||
|
numVolumes++
|
||||||
|
allErrs = append(allErrs, validateAzureDisk(pvSpec.AzureDisk, fldPath.Child("azureDisk"))...)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if pvSpec.ScaleIO != nil {
|
||||||
|
if numVolumes > 0 {
|
||||||
|
allErrs = append(allErrs, field.Forbidden(fldPath.Child("scaleIO"), "may not specify more than 1 volume type"))
|
||||||
|
} else {
|
||||||
|
numVolumes++
|
||||||
|
allErrs = append(allErrs, validateScaleIOPersistentVolumeSource(pvSpec.ScaleIO, fldPath.Child("scaleIO"))...)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if pvSpec.Local != nil {
|
||||||
|
if numVolumes > 0 {
|
||||||
|
allErrs = append(allErrs, field.Forbidden(fldPath.Child("local"), "may not specify more than 1 volume type"))
|
||||||
|
} else {
|
||||||
|
numVolumes++
|
||||||
|
allErrs = append(allErrs, validateLocalVolumeSource(pvSpec.Local, fldPath.Child("local"))...)
|
||||||
|
// NodeAffinity is required
|
||||||
|
if !nodeAffinitySpecified {
|
||||||
|
allErrs = append(allErrs, field.Required(fldPath.Child("nodeAffinity"), "Local volume requires node affinity"))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if pvSpec.StorageOS != nil {
|
||||||
|
if numVolumes > 0 {
|
||||||
|
allErrs = append(allErrs, field.Forbidden(fldPath.Child("storageos"), "may not specify more than 1 volume type"))
|
||||||
|
} else {
|
||||||
|
numVolumes++
|
||||||
|
allErrs = append(allErrs, validateStorageOSPersistentVolumeSource(pvSpec.StorageOS, fldPath.Child("storageos"))...)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if pvSpec.CSI != nil {
|
||||||
|
if numVolumes > 0 {
|
||||||
|
allErrs = append(allErrs, field.Forbidden(fldPath.Child("csi"), "may not specify more than 1 volume type"))
|
||||||
|
} else {
|
||||||
|
numVolumes++
|
||||||
|
allErrs = append(allErrs, validateCSIPersistentVolumeSource(pvSpec.CSI, fldPath.Child("csi"))...)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if numVolumes == 0 {
|
if numVolumes == 0 {
|
||||||
allErrs = append(allErrs, field.Required(specPath, "must specify a volume type"))
|
allErrs = append(allErrs, field.Required(fldPath, "must specify a volume type"))
|
||||||
}
|
}
|
||||||
|
|
||||||
// do not allow hostPath mounts of '/' to have a 'recycle' reclaim policy
|
// do not allow hostPath mounts of '/' to have a 'recycle' reclaim policy
|
||||||
if pv.Spec.HostPath != nil && path.Clean(pv.Spec.HostPath.Path) == "/" && pv.Spec.PersistentVolumeReclaimPolicy == core.PersistentVolumeReclaimRecycle {
|
if pvSpec.HostPath != nil && path.Clean(pvSpec.HostPath.Path) == "/" && pvSpec.PersistentVolumeReclaimPolicy == core.PersistentVolumeReclaimRecycle {
|
||||||
allErrs = append(allErrs, field.Forbidden(specPath.Child("persistentVolumeReclaimPolicy"), "may not be 'recycle' for a hostPath mount of '/'"))
|
allErrs = append(allErrs, field.Forbidden(fldPath.Child("persistentVolumeReclaimPolicy"), "may not be 'recycle' for a hostPath mount of '/'"))
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(pv.Spec.StorageClassName) > 0 {
|
if len(pvSpec.StorageClassName) > 0 {
|
||||||
for _, msg := range ValidateClassName(pv.Spec.StorageClassName, false) {
|
if validateInlinePersistentVolumeSpec {
|
||||||
allErrs = append(allErrs, field.Invalid(specPath.Child("storageClassName"), pv.Spec.StorageClassName, msg))
|
allErrs = append(allErrs, field.Forbidden(fldPath.Child("storageClassName"), "may not be specified in the context of inline volumes"))
|
||||||
|
} else {
|
||||||
|
for _, msg := range ValidateClassName(pvSpec.StorageClassName, false) {
|
||||||
|
allErrs = append(allErrs, field.Invalid(fldPath.Child("storageClassName"), pvSpec.StorageClassName, msg))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if pv.Spec.VolumeMode != nil && !supportedVolumeModes.Has(string(*pv.Spec.VolumeMode)) {
|
if pvSpec.VolumeMode != nil {
|
||||||
allErrs = append(allErrs, field.NotSupported(specPath.Child("volumeMode"), *pv.Spec.VolumeMode, supportedVolumeModes.List()))
|
if validateInlinePersistentVolumeSpec {
|
||||||
|
if *pvSpec.VolumeMode != core.PersistentVolumeFilesystem {
|
||||||
|
allErrs = append(allErrs, field.Forbidden(fldPath.Child("volumeMode"), "may not specify volumeMode other than "+string(core.PersistentVolumeFilesystem)+" in the context of inline volumes"))
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if !supportedVolumeModes.Has(string(*pvSpec.VolumeMode)) {
|
||||||
|
allErrs = append(allErrs, field.NotSupported(fldPath.Child("volumeMode"), *pvSpec.VolumeMode, supportedVolumeModes.List()))
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return allErrs
|
return allErrs
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func ValidatePersistentVolume(pv *core.PersistentVolume) field.ErrorList {
|
||||||
|
metaPath := field.NewPath("metadata")
|
||||||
|
allErrs := ValidateObjectMeta(&pv.ObjectMeta, false, ValidatePersistentVolumeName, metaPath)
|
||||||
|
allErrs = append(allErrs, ValidatePersistentVolumeSpec(&pv.Spec, pv.ObjectMeta.Name, false, field.NewPath("spec"))...)
|
||||||
|
return allErrs
|
||||||
|
}
|
||||||
|
|
||||||
// ValidatePersistentVolumeUpdate tests to see if the update is legal for an end user to make.
|
// ValidatePersistentVolumeUpdate tests to see if the update is legal for an end user to make.
|
||||||
// newPv is updated with fields that cannot be changed.
|
// newPv is updated with fields that cannot be changed.
|
||||||
func ValidatePersistentVolumeUpdate(newPv, oldPv *core.PersistentVolume) field.ErrorList {
|
func ValidatePersistentVolumeUpdate(newPv, oldPv *core.PersistentVolume) field.ErrorList {
|
||||||
|
|
|
@ -426,6 +426,147 @@ func TestValidatePersistentVolumes(t *testing.T) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestValidatePersistentVolumeSpec(t *testing.T) {
|
||||||
|
fsmode := core.PersistentVolumeFilesystem
|
||||||
|
blockmode := core.PersistentVolumeBlock
|
||||||
|
scenarios := map[string]struct {
|
||||||
|
isExpectedFailure bool
|
||||||
|
isInlineSpec bool
|
||||||
|
pvSpec *core.PersistentVolumeSpec
|
||||||
|
}{
|
||||||
|
"pv-pvspec-valid": {
|
||||||
|
isExpectedFailure: false,
|
||||||
|
isInlineSpec: false,
|
||||||
|
pvSpec: &core.PersistentVolumeSpec{
|
||||||
|
Capacity: core.ResourceList{
|
||||||
|
core.ResourceName(core.ResourceStorage): resource.MustParse("10G"),
|
||||||
|
},
|
||||||
|
StorageClassName: "testclass",
|
||||||
|
PersistentVolumeReclaimPolicy: core.PersistentVolumeReclaimRecycle,
|
||||||
|
AccessModes: []core.PersistentVolumeAccessMode{core.ReadWriteOnce},
|
||||||
|
PersistentVolumeSource: core.PersistentVolumeSource{
|
||||||
|
HostPath: &core.HostPathVolumeSource{
|
||||||
|
Path: "/foo",
|
||||||
|
Type: newHostPathType(string(core.HostPathDirectory)),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
VolumeMode: &fsmode,
|
||||||
|
NodeAffinity: simpleVolumeNodeAffinity("foo", "bar"),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"inline-pvspec-with-capacity": {
|
||||||
|
isExpectedFailure: true,
|
||||||
|
isInlineSpec: true,
|
||||||
|
pvSpec: &core.PersistentVolumeSpec{
|
||||||
|
Capacity: core.ResourceList{
|
||||||
|
core.ResourceName(core.ResourceStorage): resource.MustParse("10G"),
|
||||||
|
},
|
||||||
|
PersistentVolumeSource: core.PersistentVolumeSource{
|
||||||
|
CSI: &core.CSIPersistentVolumeSource{Driver: "test-driver", VolumeHandle: "test-123", ReadOnly: true},
|
||||||
|
},
|
||||||
|
AccessModes: []core.PersistentVolumeAccessMode{core.ReadWriteOnce},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"inline-pvspec-with-sc": {
|
||||||
|
isExpectedFailure: true,
|
||||||
|
isInlineSpec: true,
|
||||||
|
pvSpec: &core.PersistentVolumeSpec{
|
||||||
|
PersistentVolumeSource: core.PersistentVolumeSource{
|
||||||
|
CSI: &core.CSIPersistentVolumeSource{Driver: "test-driver", VolumeHandle: "test-123", ReadOnly: true},
|
||||||
|
},
|
||||||
|
AccessModes: []core.PersistentVolumeAccessMode{core.ReadWriteOnce},
|
||||||
|
StorageClassName: "testclass",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"inline-pvspec-with-non-fs-volume-mode": {
|
||||||
|
isExpectedFailure: true,
|
||||||
|
isInlineSpec: true,
|
||||||
|
pvSpec: &core.PersistentVolumeSpec{
|
||||||
|
PersistentVolumeSource: core.PersistentVolumeSource{
|
||||||
|
CSI: &core.CSIPersistentVolumeSource{Driver: "test-driver", VolumeHandle: "test-123", ReadOnly: true},
|
||||||
|
},
|
||||||
|
AccessModes: []core.PersistentVolumeAccessMode{core.ReadWriteOnce},
|
||||||
|
VolumeMode: &blockmode,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"inline-pvspec-with-non-retain-reclaim-policy": {
|
||||||
|
isExpectedFailure: true,
|
||||||
|
isInlineSpec: true,
|
||||||
|
pvSpec: &core.PersistentVolumeSpec{
|
||||||
|
PersistentVolumeReclaimPolicy: core.PersistentVolumeReclaimRecycle,
|
||||||
|
PersistentVolumeSource: core.PersistentVolumeSource{
|
||||||
|
CSI: &core.CSIPersistentVolumeSource{Driver: "test-driver", VolumeHandle: "test-123", ReadOnly: true},
|
||||||
|
},
|
||||||
|
AccessModes: []core.PersistentVolumeAccessMode{core.ReadWriteOnce},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"inline-pvspec-with-node-affinity": {
|
||||||
|
isExpectedFailure: true,
|
||||||
|
isInlineSpec: true,
|
||||||
|
pvSpec: &core.PersistentVolumeSpec{
|
||||||
|
PersistentVolumeSource: core.PersistentVolumeSource{
|
||||||
|
CSI: &core.CSIPersistentVolumeSource{Driver: "test-driver", VolumeHandle: "test-123", ReadOnly: true},
|
||||||
|
},
|
||||||
|
AccessModes: []core.PersistentVolumeAccessMode{core.ReadWriteOnce},
|
||||||
|
NodeAffinity: simpleVolumeNodeAffinity("foo", "bar"),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"inline-pvspec-with-non-csi-source": {
|
||||||
|
isExpectedFailure: true,
|
||||||
|
isInlineSpec: true,
|
||||||
|
pvSpec: &core.PersistentVolumeSpec{
|
||||||
|
PersistentVolumeSource: core.PersistentVolumeSource{
|
||||||
|
HostPath: &core.HostPathVolumeSource{
|
||||||
|
Path: "/foo",
|
||||||
|
Type: newHostPathType(string(core.HostPathDirectory)),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
AccessModes: []core.PersistentVolumeAccessMode{core.ReadWriteOnce},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"inline-pvspec-valid-with-access-modes-and-mount-options": {
|
||||||
|
isExpectedFailure: false,
|
||||||
|
isInlineSpec: true,
|
||||||
|
pvSpec: &core.PersistentVolumeSpec{
|
||||||
|
PersistentVolumeSource: core.PersistentVolumeSource{
|
||||||
|
CSI: &core.CSIPersistentVolumeSource{Driver: "test-driver", VolumeHandle: "test-123", ReadOnly: true},
|
||||||
|
},
|
||||||
|
AccessModes: []core.PersistentVolumeAccessMode{core.ReadWriteOnce},
|
||||||
|
MountOptions: []string{"soft", "read-write"},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"inline-pvspec-valid-with-access-modes": {
|
||||||
|
isExpectedFailure: false,
|
||||||
|
isInlineSpec: true,
|
||||||
|
pvSpec: &core.PersistentVolumeSpec{
|
||||||
|
PersistentVolumeSource: core.PersistentVolumeSource{
|
||||||
|
CSI: &core.CSIPersistentVolumeSource{Driver: "test-driver", VolumeHandle: "test-123", ReadOnly: true},
|
||||||
|
},
|
||||||
|
AccessModes: []core.PersistentVolumeAccessMode{core.ReadWriteOnce},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"inline-pvspec-with-missing-acess-modes": {
|
||||||
|
isExpectedFailure: true,
|
||||||
|
isInlineSpec: true,
|
||||||
|
pvSpec: &core.PersistentVolumeSpec{
|
||||||
|
PersistentVolumeSource: core.PersistentVolumeSource{
|
||||||
|
CSI: &core.CSIPersistentVolumeSource{Driver: "test-driver", VolumeHandle: "test-123", ReadOnly: true},
|
||||||
|
},
|
||||||
|
MountOptions: []string{"soft", "read-write"},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
for name, scenario := range scenarios {
|
||||||
|
errs := ValidatePersistentVolumeSpec(scenario.pvSpec, "", scenario.isInlineSpec, field.NewPath("field"))
|
||||||
|
if len(errs) == 0 && scenario.isExpectedFailure {
|
||||||
|
t.Errorf("Unexpected success for scenario: %s", name)
|
||||||
|
}
|
||||||
|
if len(errs) > 0 && !scenario.isExpectedFailure {
|
||||||
|
t.Errorf("Unexpected failure for scenario: %s - %+v", name, errs)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestValidatePersistentVolumeSourceUpdate(t *testing.T) {
|
func TestValidatePersistentVolumeSourceUpdate(t *testing.T) {
|
||||||
validVolume := testVolume("foo", "", core.PersistentVolumeSpec{
|
validVolume := testVolume("foo", "", core.PersistentVolumeSpec{
|
||||||
Capacity: core.ResourceList{
|
Capacity: core.ResourceList{
|
||||||
|
|
|
@ -145,15 +145,22 @@ type VolumeAttachmentSpec struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
// VolumeAttachmentSource represents a volume that should be attached.
|
// VolumeAttachmentSource represents a volume that should be attached.
|
||||||
// Right now only PersistenVolumes can be attached via external attacher,
|
// Right now persistent volumes as well as inline volumes (only in
|
||||||
// in future we may allow also inline volumes in pods.
|
// CSI Migration scenarios) can be attached via external attacher.
|
||||||
// Exactly one member can be set.
|
// Exactly one member can be set.
|
||||||
type VolumeAttachmentSource struct {
|
type VolumeAttachmentSource struct {
|
||||||
// Name of the persistent volume to attach.
|
// Name of the persistent volume to attach.
|
||||||
// +optional
|
// +optional
|
||||||
PersistentVolumeName *string
|
PersistentVolumeName *string
|
||||||
|
|
||||||
// Placeholder for *VolumeSource to accommodate inline volumes in pods.
|
// inlineVolumeSpec contains all the information necessary to attach
|
||||||
|
// a persistent volume defined by a pod's inline VolumeSource. This field
|
||||||
|
// is populated only for the CSIMigration feature. It contains
|
||||||
|
// translated fields from a pod's inline VolumeSource to a
|
||||||
|
// PersistentVolumeSpec. This field is alpha-level and is only
|
||||||
|
// honored by servers that enabled the CSIMigration feature.
|
||||||
|
// +optional
|
||||||
|
InlineVolumeSpec *api.PersistentVolumeSpec
|
||||||
}
|
}
|
||||||
|
|
||||||
// The status of a VolumeAttachment request.
|
// The status of a VolumeAttachment request.
|
||||||
|
|
|
@ -18,6 +18,7 @@ go_library(
|
||||||
importpath = "k8s.io/kubernetes/pkg/apis/storage/v1",
|
importpath = "k8s.io/kubernetes/pkg/apis/storage/v1",
|
||||||
deps = [
|
deps = [
|
||||||
"//pkg/apis/core:go_default_library",
|
"//pkg/apis/core:go_default_library",
|
||||||
|
"//pkg/apis/core/v1:go_default_library",
|
||||||
"//pkg/apis/storage:go_default_library",
|
"//pkg/apis/storage: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",
|
||||||
|
|
|
@ -28,6 +28,7 @@ import (
|
||||||
conversion "k8s.io/apimachinery/pkg/conversion"
|
conversion "k8s.io/apimachinery/pkg/conversion"
|
||||||
runtime "k8s.io/apimachinery/pkg/runtime"
|
runtime "k8s.io/apimachinery/pkg/runtime"
|
||||||
core "k8s.io/kubernetes/pkg/apis/core"
|
core "k8s.io/kubernetes/pkg/apis/core"
|
||||||
|
apiscorev1 "k8s.io/kubernetes/pkg/apis/core/v1"
|
||||||
storage "k8s.io/kubernetes/pkg/apis/storage"
|
storage "k8s.io/kubernetes/pkg/apis/storage"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -211,7 +212,17 @@ func Convert_storage_VolumeAttachment_To_v1_VolumeAttachment(in *storage.VolumeA
|
||||||
|
|
||||||
func autoConvert_v1_VolumeAttachmentList_To_storage_VolumeAttachmentList(in *v1.VolumeAttachmentList, out *storage.VolumeAttachmentList, s conversion.Scope) error {
|
func autoConvert_v1_VolumeAttachmentList_To_storage_VolumeAttachmentList(in *v1.VolumeAttachmentList, out *storage.VolumeAttachmentList, s conversion.Scope) error {
|
||||||
out.ListMeta = in.ListMeta
|
out.ListMeta = in.ListMeta
|
||||||
out.Items = *(*[]storage.VolumeAttachment)(unsafe.Pointer(&in.Items))
|
if in.Items != nil {
|
||||||
|
in, out := &in.Items, &out.Items
|
||||||
|
*out = make([]storage.VolumeAttachment, len(*in))
|
||||||
|
for i := range *in {
|
||||||
|
if err := Convert_v1_VolumeAttachment_To_storage_VolumeAttachment(&(*in)[i], &(*out)[i], s); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
out.Items = nil
|
||||||
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -222,7 +233,17 @@ func Convert_v1_VolumeAttachmentList_To_storage_VolumeAttachmentList(in *v1.Volu
|
||||||
|
|
||||||
func autoConvert_storage_VolumeAttachmentList_To_v1_VolumeAttachmentList(in *storage.VolumeAttachmentList, out *v1.VolumeAttachmentList, s conversion.Scope) error {
|
func autoConvert_storage_VolumeAttachmentList_To_v1_VolumeAttachmentList(in *storage.VolumeAttachmentList, out *v1.VolumeAttachmentList, s conversion.Scope) error {
|
||||||
out.ListMeta = in.ListMeta
|
out.ListMeta = in.ListMeta
|
||||||
out.Items = *(*[]v1.VolumeAttachment)(unsafe.Pointer(&in.Items))
|
if in.Items != nil {
|
||||||
|
in, out := &in.Items, &out.Items
|
||||||
|
*out = make([]v1.VolumeAttachment, len(*in))
|
||||||
|
for i := range *in {
|
||||||
|
if err := Convert_storage_VolumeAttachment_To_v1_VolumeAttachment(&(*in)[i], &(*out)[i], s); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
out.Items = nil
|
||||||
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -233,6 +254,15 @@ func Convert_storage_VolumeAttachmentList_To_v1_VolumeAttachmentList(in *storage
|
||||||
|
|
||||||
func autoConvert_v1_VolumeAttachmentSource_To_storage_VolumeAttachmentSource(in *v1.VolumeAttachmentSource, out *storage.VolumeAttachmentSource, s conversion.Scope) error {
|
func autoConvert_v1_VolumeAttachmentSource_To_storage_VolumeAttachmentSource(in *v1.VolumeAttachmentSource, out *storage.VolumeAttachmentSource, s conversion.Scope) error {
|
||||||
out.PersistentVolumeName = (*string)(unsafe.Pointer(in.PersistentVolumeName))
|
out.PersistentVolumeName = (*string)(unsafe.Pointer(in.PersistentVolumeName))
|
||||||
|
if in.InlineVolumeSpec != nil {
|
||||||
|
in, out := &in.InlineVolumeSpec, &out.InlineVolumeSpec
|
||||||
|
*out = new(core.PersistentVolumeSpec)
|
||||||
|
if err := apiscorev1.Convert_v1_PersistentVolumeSpec_To_core_PersistentVolumeSpec(*in, *out, s); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
out.InlineVolumeSpec = nil
|
||||||
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -243,6 +273,15 @@ func Convert_v1_VolumeAttachmentSource_To_storage_VolumeAttachmentSource(in *v1.
|
||||||
|
|
||||||
func autoConvert_storage_VolumeAttachmentSource_To_v1_VolumeAttachmentSource(in *storage.VolumeAttachmentSource, out *v1.VolumeAttachmentSource, s conversion.Scope) error {
|
func autoConvert_storage_VolumeAttachmentSource_To_v1_VolumeAttachmentSource(in *storage.VolumeAttachmentSource, out *v1.VolumeAttachmentSource, s conversion.Scope) error {
|
||||||
out.PersistentVolumeName = (*string)(unsafe.Pointer(in.PersistentVolumeName))
|
out.PersistentVolumeName = (*string)(unsafe.Pointer(in.PersistentVolumeName))
|
||||||
|
if in.InlineVolumeSpec != nil {
|
||||||
|
in, out := &in.InlineVolumeSpec, &out.InlineVolumeSpec
|
||||||
|
*out = new(corev1.PersistentVolumeSpec)
|
||||||
|
if err := apiscorev1.Convert_core_PersistentVolumeSpec_To_v1_PersistentVolumeSpec(*in, *out, s); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
out.InlineVolumeSpec = nil
|
||||||
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -23,6 +23,7 @@ package v1
|
||||||
import (
|
import (
|
||||||
v1 "k8s.io/api/storage/v1"
|
v1 "k8s.io/api/storage/v1"
|
||||||
runtime "k8s.io/apimachinery/pkg/runtime"
|
runtime "k8s.io/apimachinery/pkg/runtime"
|
||||||
|
corev1 "k8s.io/kubernetes/pkg/apis/core/v1"
|
||||||
)
|
)
|
||||||
|
|
||||||
// RegisterDefaults adds defaulters functions to the given scheme.
|
// RegisterDefaults adds defaulters functions to the given scheme.
|
||||||
|
@ -31,6 +32,8 @@ import (
|
||||||
func RegisterDefaults(scheme *runtime.Scheme) error {
|
func RegisterDefaults(scheme *runtime.Scheme) error {
|
||||||
scheme.AddTypeDefaultingFunc(&v1.StorageClass{}, func(obj interface{}) { SetObjectDefaults_StorageClass(obj.(*v1.StorageClass)) })
|
scheme.AddTypeDefaultingFunc(&v1.StorageClass{}, func(obj interface{}) { SetObjectDefaults_StorageClass(obj.(*v1.StorageClass)) })
|
||||||
scheme.AddTypeDefaultingFunc(&v1.StorageClassList{}, func(obj interface{}) { SetObjectDefaults_StorageClassList(obj.(*v1.StorageClassList)) })
|
scheme.AddTypeDefaultingFunc(&v1.StorageClassList{}, func(obj interface{}) { SetObjectDefaults_StorageClassList(obj.(*v1.StorageClassList)) })
|
||||||
|
scheme.AddTypeDefaultingFunc(&v1.VolumeAttachment{}, func(obj interface{}) { SetObjectDefaults_VolumeAttachment(obj.(*v1.VolumeAttachment)) })
|
||||||
|
scheme.AddTypeDefaultingFunc(&v1.VolumeAttachmentList{}, func(obj interface{}) { SetObjectDefaults_VolumeAttachmentList(obj.(*v1.VolumeAttachmentList)) })
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -44,3 +47,31 @@ func SetObjectDefaults_StorageClassList(in *v1.StorageClassList) {
|
||||||
SetObjectDefaults_StorageClass(a)
|
SetObjectDefaults_StorageClass(a)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func SetObjectDefaults_VolumeAttachment(in *v1.VolumeAttachment) {
|
||||||
|
if in.Spec.Source.InlineVolumeSpec != nil {
|
||||||
|
corev1.SetDefaults_ResourceList(&in.Spec.Source.InlineVolumeSpec.Capacity)
|
||||||
|
if in.Spec.Source.InlineVolumeSpec.PersistentVolumeSource.HostPath != nil {
|
||||||
|
corev1.SetDefaults_HostPathVolumeSource(in.Spec.Source.InlineVolumeSpec.PersistentVolumeSource.HostPath)
|
||||||
|
}
|
||||||
|
if in.Spec.Source.InlineVolumeSpec.PersistentVolumeSource.RBD != nil {
|
||||||
|
corev1.SetDefaults_RBDPersistentVolumeSource(in.Spec.Source.InlineVolumeSpec.PersistentVolumeSource.RBD)
|
||||||
|
}
|
||||||
|
if in.Spec.Source.InlineVolumeSpec.PersistentVolumeSource.ISCSI != nil {
|
||||||
|
corev1.SetDefaults_ISCSIPersistentVolumeSource(in.Spec.Source.InlineVolumeSpec.PersistentVolumeSource.ISCSI)
|
||||||
|
}
|
||||||
|
if in.Spec.Source.InlineVolumeSpec.PersistentVolumeSource.AzureDisk != nil {
|
||||||
|
corev1.SetDefaults_AzureDiskVolumeSource(in.Spec.Source.InlineVolumeSpec.PersistentVolumeSource.AzureDisk)
|
||||||
|
}
|
||||||
|
if in.Spec.Source.InlineVolumeSpec.PersistentVolumeSource.ScaleIO != nil {
|
||||||
|
corev1.SetDefaults_ScaleIOPersistentVolumeSource(in.Spec.Source.InlineVolumeSpec.PersistentVolumeSource.ScaleIO)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func SetObjectDefaults_VolumeAttachmentList(in *v1.VolumeAttachmentList) {
|
||||||
|
for i := range in.Items {
|
||||||
|
a := &in.Items[i]
|
||||||
|
SetObjectDefaults_VolumeAttachment(a)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -11,7 +11,10 @@ go_library(
|
||||||
importpath = "k8s.io/kubernetes/pkg/apis/storage/v1alpha1",
|
importpath = "k8s.io/kubernetes/pkg/apis/storage/v1alpha1",
|
||||||
visibility = ["//visibility:public"],
|
visibility = ["//visibility:public"],
|
||||||
deps = [
|
deps = [
|
||||||
|
"//pkg/apis/core:go_default_library",
|
||||||
|
"//pkg/apis/core/v1:go_default_library",
|
||||||
"//pkg/apis/storage:go_default_library",
|
"//pkg/apis/storage:go_default_library",
|
||||||
|
"//staging/src/k8s.io/api/core/v1:go_default_library",
|
||||||
"//staging/src/k8s.io/api/storage/v1alpha1:go_default_library",
|
"//staging/src/k8s.io/api/storage/v1alpha1:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/conversion:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/conversion:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library",
|
||||||
|
|
|
@ -23,9 +23,12 @@ package v1alpha1
|
||||||
import (
|
import (
|
||||||
unsafe "unsafe"
|
unsafe "unsafe"
|
||||||
|
|
||||||
|
corev1 "k8s.io/api/core/v1"
|
||||||
v1alpha1 "k8s.io/api/storage/v1alpha1"
|
v1alpha1 "k8s.io/api/storage/v1alpha1"
|
||||||
conversion "k8s.io/apimachinery/pkg/conversion"
|
conversion "k8s.io/apimachinery/pkg/conversion"
|
||||||
runtime "k8s.io/apimachinery/pkg/runtime"
|
runtime "k8s.io/apimachinery/pkg/runtime"
|
||||||
|
core "k8s.io/kubernetes/pkg/apis/core"
|
||||||
|
v1 "k8s.io/kubernetes/pkg/apis/core/v1"
|
||||||
storage "k8s.io/kubernetes/pkg/apis/storage"
|
storage "k8s.io/kubernetes/pkg/apis/storage"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -133,7 +136,17 @@ func Convert_storage_VolumeAttachment_To_v1alpha1_VolumeAttachment(in *storage.V
|
||||||
|
|
||||||
func autoConvert_v1alpha1_VolumeAttachmentList_To_storage_VolumeAttachmentList(in *v1alpha1.VolumeAttachmentList, out *storage.VolumeAttachmentList, s conversion.Scope) error {
|
func autoConvert_v1alpha1_VolumeAttachmentList_To_storage_VolumeAttachmentList(in *v1alpha1.VolumeAttachmentList, out *storage.VolumeAttachmentList, s conversion.Scope) error {
|
||||||
out.ListMeta = in.ListMeta
|
out.ListMeta = in.ListMeta
|
||||||
out.Items = *(*[]storage.VolumeAttachment)(unsafe.Pointer(&in.Items))
|
if in.Items != nil {
|
||||||
|
in, out := &in.Items, &out.Items
|
||||||
|
*out = make([]storage.VolumeAttachment, len(*in))
|
||||||
|
for i := range *in {
|
||||||
|
if err := Convert_v1alpha1_VolumeAttachment_To_storage_VolumeAttachment(&(*in)[i], &(*out)[i], s); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
out.Items = nil
|
||||||
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -144,7 +157,17 @@ func Convert_v1alpha1_VolumeAttachmentList_To_storage_VolumeAttachmentList(in *v
|
||||||
|
|
||||||
func autoConvert_storage_VolumeAttachmentList_To_v1alpha1_VolumeAttachmentList(in *storage.VolumeAttachmentList, out *v1alpha1.VolumeAttachmentList, s conversion.Scope) error {
|
func autoConvert_storage_VolumeAttachmentList_To_v1alpha1_VolumeAttachmentList(in *storage.VolumeAttachmentList, out *v1alpha1.VolumeAttachmentList, s conversion.Scope) error {
|
||||||
out.ListMeta = in.ListMeta
|
out.ListMeta = in.ListMeta
|
||||||
out.Items = *(*[]v1alpha1.VolumeAttachment)(unsafe.Pointer(&in.Items))
|
if in.Items != nil {
|
||||||
|
in, out := &in.Items, &out.Items
|
||||||
|
*out = make([]v1alpha1.VolumeAttachment, len(*in))
|
||||||
|
for i := range *in {
|
||||||
|
if err := Convert_storage_VolumeAttachment_To_v1alpha1_VolumeAttachment(&(*in)[i], &(*out)[i], s); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
out.Items = nil
|
||||||
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -155,6 +178,15 @@ func Convert_storage_VolumeAttachmentList_To_v1alpha1_VolumeAttachmentList(in *s
|
||||||
|
|
||||||
func autoConvert_v1alpha1_VolumeAttachmentSource_To_storage_VolumeAttachmentSource(in *v1alpha1.VolumeAttachmentSource, out *storage.VolumeAttachmentSource, s conversion.Scope) error {
|
func autoConvert_v1alpha1_VolumeAttachmentSource_To_storage_VolumeAttachmentSource(in *v1alpha1.VolumeAttachmentSource, out *storage.VolumeAttachmentSource, s conversion.Scope) error {
|
||||||
out.PersistentVolumeName = (*string)(unsafe.Pointer(in.PersistentVolumeName))
|
out.PersistentVolumeName = (*string)(unsafe.Pointer(in.PersistentVolumeName))
|
||||||
|
if in.InlineVolumeSpec != nil {
|
||||||
|
in, out := &in.InlineVolumeSpec, &out.InlineVolumeSpec
|
||||||
|
*out = new(core.PersistentVolumeSpec)
|
||||||
|
if err := v1.Convert_v1_PersistentVolumeSpec_To_core_PersistentVolumeSpec(*in, *out, s); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
out.InlineVolumeSpec = nil
|
||||||
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -165,6 +197,15 @@ func Convert_v1alpha1_VolumeAttachmentSource_To_storage_VolumeAttachmentSource(i
|
||||||
|
|
||||||
func autoConvert_storage_VolumeAttachmentSource_To_v1alpha1_VolumeAttachmentSource(in *storage.VolumeAttachmentSource, out *v1alpha1.VolumeAttachmentSource, s conversion.Scope) error {
|
func autoConvert_storage_VolumeAttachmentSource_To_v1alpha1_VolumeAttachmentSource(in *storage.VolumeAttachmentSource, out *v1alpha1.VolumeAttachmentSource, s conversion.Scope) error {
|
||||||
out.PersistentVolumeName = (*string)(unsafe.Pointer(in.PersistentVolumeName))
|
out.PersistentVolumeName = (*string)(unsafe.Pointer(in.PersistentVolumeName))
|
||||||
|
if in.InlineVolumeSpec != nil {
|
||||||
|
in, out := &in.InlineVolumeSpec, &out.InlineVolumeSpec
|
||||||
|
*out = new(corev1.PersistentVolumeSpec)
|
||||||
|
if err := v1.Convert_core_PersistentVolumeSpec_To_v1_PersistentVolumeSpec(*in, *out, s); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
out.InlineVolumeSpec = nil
|
||||||
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -21,12 +21,44 @@ limitations under the License.
|
||||||
package v1alpha1
|
package v1alpha1
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
v1alpha1 "k8s.io/api/storage/v1alpha1"
|
||||||
runtime "k8s.io/apimachinery/pkg/runtime"
|
runtime "k8s.io/apimachinery/pkg/runtime"
|
||||||
|
v1 "k8s.io/kubernetes/pkg/apis/core/v1"
|
||||||
)
|
)
|
||||||
|
|
||||||
// RegisterDefaults adds defaulters functions to the given scheme.
|
// RegisterDefaults adds defaulters functions to the given scheme.
|
||||||
// Public to allow building arbitrary schemes.
|
// Public to allow building arbitrary schemes.
|
||||||
// All generated defaulters are covering - they call all nested defaulters.
|
// All generated defaulters are covering - they call all nested defaulters.
|
||||||
func RegisterDefaults(scheme *runtime.Scheme) error {
|
func RegisterDefaults(scheme *runtime.Scheme) error {
|
||||||
|
scheme.AddTypeDefaultingFunc(&v1alpha1.VolumeAttachment{}, func(obj interface{}) { SetObjectDefaults_VolumeAttachment(obj.(*v1alpha1.VolumeAttachment)) })
|
||||||
|
scheme.AddTypeDefaultingFunc(&v1alpha1.VolumeAttachmentList{}, func(obj interface{}) { SetObjectDefaults_VolumeAttachmentList(obj.(*v1alpha1.VolumeAttachmentList)) })
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func SetObjectDefaults_VolumeAttachment(in *v1alpha1.VolumeAttachment) {
|
||||||
|
if in.Spec.Source.InlineVolumeSpec != nil {
|
||||||
|
v1.SetDefaults_ResourceList(&in.Spec.Source.InlineVolumeSpec.Capacity)
|
||||||
|
if in.Spec.Source.InlineVolumeSpec.PersistentVolumeSource.HostPath != nil {
|
||||||
|
v1.SetDefaults_HostPathVolumeSource(in.Spec.Source.InlineVolumeSpec.PersistentVolumeSource.HostPath)
|
||||||
|
}
|
||||||
|
if in.Spec.Source.InlineVolumeSpec.PersistentVolumeSource.RBD != nil {
|
||||||
|
v1.SetDefaults_RBDPersistentVolumeSource(in.Spec.Source.InlineVolumeSpec.PersistentVolumeSource.RBD)
|
||||||
|
}
|
||||||
|
if in.Spec.Source.InlineVolumeSpec.PersistentVolumeSource.ISCSI != nil {
|
||||||
|
v1.SetDefaults_ISCSIPersistentVolumeSource(in.Spec.Source.InlineVolumeSpec.PersistentVolumeSource.ISCSI)
|
||||||
|
}
|
||||||
|
if in.Spec.Source.InlineVolumeSpec.PersistentVolumeSource.AzureDisk != nil {
|
||||||
|
v1.SetDefaults_AzureDiskVolumeSource(in.Spec.Source.InlineVolumeSpec.PersistentVolumeSource.AzureDisk)
|
||||||
|
}
|
||||||
|
if in.Spec.Source.InlineVolumeSpec.PersistentVolumeSource.ScaleIO != nil {
|
||||||
|
v1.SetDefaults_ScaleIOPersistentVolumeSource(in.Spec.Source.InlineVolumeSpec.PersistentVolumeSource.ScaleIO)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func SetObjectDefaults_VolumeAttachmentList(in *v1alpha1.VolumeAttachmentList) {
|
||||||
|
for i := range in.Items {
|
||||||
|
a := &in.Items[i]
|
||||||
|
SetObjectDefaults_VolumeAttachment(a)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -18,6 +18,7 @@ go_library(
|
||||||
importpath = "k8s.io/kubernetes/pkg/apis/storage/v1beta1",
|
importpath = "k8s.io/kubernetes/pkg/apis/storage/v1beta1",
|
||||||
deps = [
|
deps = [
|
||||||
"//pkg/apis/core:go_default_library",
|
"//pkg/apis/core:go_default_library",
|
||||||
|
"//pkg/apis/core/v1:go_default_library",
|
||||||
"//pkg/apis/storage:go_default_library",
|
"//pkg/apis/storage: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/v1beta1:go_default_library",
|
"//staging/src/k8s.io/api/storage/v1beta1:go_default_library",
|
||||||
|
|
|
@ -28,6 +28,7 @@ import (
|
||||||
conversion "k8s.io/apimachinery/pkg/conversion"
|
conversion "k8s.io/apimachinery/pkg/conversion"
|
||||||
runtime "k8s.io/apimachinery/pkg/runtime"
|
runtime "k8s.io/apimachinery/pkg/runtime"
|
||||||
core "k8s.io/kubernetes/pkg/apis/core"
|
core "k8s.io/kubernetes/pkg/apis/core"
|
||||||
|
corev1 "k8s.io/kubernetes/pkg/apis/core/v1"
|
||||||
storage "k8s.io/kubernetes/pkg/apis/storage"
|
storage "k8s.io/kubernetes/pkg/apis/storage"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -443,7 +444,17 @@ func Convert_storage_VolumeAttachment_To_v1beta1_VolumeAttachment(in *storage.Vo
|
||||||
|
|
||||||
func autoConvert_v1beta1_VolumeAttachmentList_To_storage_VolumeAttachmentList(in *v1beta1.VolumeAttachmentList, out *storage.VolumeAttachmentList, s conversion.Scope) error {
|
func autoConvert_v1beta1_VolumeAttachmentList_To_storage_VolumeAttachmentList(in *v1beta1.VolumeAttachmentList, out *storage.VolumeAttachmentList, s conversion.Scope) error {
|
||||||
out.ListMeta = in.ListMeta
|
out.ListMeta = in.ListMeta
|
||||||
out.Items = *(*[]storage.VolumeAttachment)(unsafe.Pointer(&in.Items))
|
if in.Items != nil {
|
||||||
|
in, out := &in.Items, &out.Items
|
||||||
|
*out = make([]storage.VolumeAttachment, len(*in))
|
||||||
|
for i := range *in {
|
||||||
|
if err := Convert_v1beta1_VolumeAttachment_To_storage_VolumeAttachment(&(*in)[i], &(*out)[i], s); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
out.Items = nil
|
||||||
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -454,7 +465,17 @@ func Convert_v1beta1_VolumeAttachmentList_To_storage_VolumeAttachmentList(in *v1
|
||||||
|
|
||||||
func autoConvert_storage_VolumeAttachmentList_To_v1beta1_VolumeAttachmentList(in *storage.VolumeAttachmentList, out *v1beta1.VolumeAttachmentList, s conversion.Scope) error {
|
func autoConvert_storage_VolumeAttachmentList_To_v1beta1_VolumeAttachmentList(in *storage.VolumeAttachmentList, out *v1beta1.VolumeAttachmentList, s conversion.Scope) error {
|
||||||
out.ListMeta = in.ListMeta
|
out.ListMeta = in.ListMeta
|
||||||
out.Items = *(*[]v1beta1.VolumeAttachment)(unsafe.Pointer(&in.Items))
|
if in.Items != nil {
|
||||||
|
in, out := &in.Items, &out.Items
|
||||||
|
*out = make([]v1beta1.VolumeAttachment, len(*in))
|
||||||
|
for i := range *in {
|
||||||
|
if err := Convert_storage_VolumeAttachment_To_v1beta1_VolumeAttachment(&(*in)[i], &(*out)[i], s); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
out.Items = nil
|
||||||
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -465,6 +486,15 @@ func Convert_storage_VolumeAttachmentList_To_v1beta1_VolumeAttachmentList(in *st
|
||||||
|
|
||||||
func autoConvert_v1beta1_VolumeAttachmentSource_To_storage_VolumeAttachmentSource(in *v1beta1.VolumeAttachmentSource, out *storage.VolumeAttachmentSource, s conversion.Scope) error {
|
func autoConvert_v1beta1_VolumeAttachmentSource_To_storage_VolumeAttachmentSource(in *v1beta1.VolumeAttachmentSource, out *storage.VolumeAttachmentSource, s conversion.Scope) error {
|
||||||
out.PersistentVolumeName = (*string)(unsafe.Pointer(in.PersistentVolumeName))
|
out.PersistentVolumeName = (*string)(unsafe.Pointer(in.PersistentVolumeName))
|
||||||
|
if in.InlineVolumeSpec != nil {
|
||||||
|
in, out := &in.InlineVolumeSpec, &out.InlineVolumeSpec
|
||||||
|
*out = new(core.PersistentVolumeSpec)
|
||||||
|
if err := corev1.Convert_v1_PersistentVolumeSpec_To_core_PersistentVolumeSpec(*in, *out, s); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
out.InlineVolumeSpec = nil
|
||||||
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -475,6 +505,15 @@ func Convert_v1beta1_VolumeAttachmentSource_To_storage_VolumeAttachmentSource(in
|
||||||
|
|
||||||
func autoConvert_storage_VolumeAttachmentSource_To_v1beta1_VolumeAttachmentSource(in *storage.VolumeAttachmentSource, out *v1beta1.VolumeAttachmentSource, s conversion.Scope) error {
|
func autoConvert_storage_VolumeAttachmentSource_To_v1beta1_VolumeAttachmentSource(in *storage.VolumeAttachmentSource, out *v1beta1.VolumeAttachmentSource, s conversion.Scope) error {
|
||||||
out.PersistentVolumeName = (*string)(unsafe.Pointer(in.PersistentVolumeName))
|
out.PersistentVolumeName = (*string)(unsafe.Pointer(in.PersistentVolumeName))
|
||||||
|
if in.InlineVolumeSpec != nil {
|
||||||
|
in, out := &in.InlineVolumeSpec, &out.InlineVolumeSpec
|
||||||
|
*out = new(v1.PersistentVolumeSpec)
|
||||||
|
if err := corev1.Convert_core_PersistentVolumeSpec_To_v1_PersistentVolumeSpec(*in, *out, s); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
out.InlineVolumeSpec = nil
|
||||||
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -23,6 +23,7 @@ package v1beta1
|
||||||
import (
|
import (
|
||||||
v1beta1 "k8s.io/api/storage/v1beta1"
|
v1beta1 "k8s.io/api/storage/v1beta1"
|
||||||
runtime "k8s.io/apimachinery/pkg/runtime"
|
runtime "k8s.io/apimachinery/pkg/runtime"
|
||||||
|
v1 "k8s.io/kubernetes/pkg/apis/core/v1"
|
||||||
)
|
)
|
||||||
|
|
||||||
// RegisterDefaults adds defaulters functions to the given scheme.
|
// RegisterDefaults adds defaulters functions to the given scheme.
|
||||||
|
@ -33,6 +34,8 @@ func RegisterDefaults(scheme *runtime.Scheme) error {
|
||||||
scheme.AddTypeDefaultingFunc(&v1beta1.CSIDriverList{}, func(obj interface{}) { SetObjectDefaults_CSIDriverList(obj.(*v1beta1.CSIDriverList)) })
|
scheme.AddTypeDefaultingFunc(&v1beta1.CSIDriverList{}, func(obj interface{}) { SetObjectDefaults_CSIDriverList(obj.(*v1beta1.CSIDriverList)) })
|
||||||
scheme.AddTypeDefaultingFunc(&v1beta1.StorageClass{}, func(obj interface{}) { SetObjectDefaults_StorageClass(obj.(*v1beta1.StorageClass)) })
|
scheme.AddTypeDefaultingFunc(&v1beta1.StorageClass{}, func(obj interface{}) { SetObjectDefaults_StorageClass(obj.(*v1beta1.StorageClass)) })
|
||||||
scheme.AddTypeDefaultingFunc(&v1beta1.StorageClassList{}, func(obj interface{}) { SetObjectDefaults_StorageClassList(obj.(*v1beta1.StorageClassList)) })
|
scheme.AddTypeDefaultingFunc(&v1beta1.StorageClassList{}, func(obj interface{}) { SetObjectDefaults_StorageClassList(obj.(*v1beta1.StorageClassList)) })
|
||||||
|
scheme.AddTypeDefaultingFunc(&v1beta1.VolumeAttachment{}, func(obj interface{}) { SetObjectDefaults_VolumeAttachment(obj.(*v1beta1.VolumeAttachment)) })
|
||||||
|
scheme.AddTypeDefaultingFunc(&v1beta1.VolumeAttachmentList{}, func(obj interface{}) { SetObjectDefaults_VolumeAttachmentList(obj.(*v1beta1.VolumeAttachmentList)) })
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -57,3 +60,31 @@ func SetObjectDefaults_StorageClassList(in *v1beta1.StorageClassList) {
|
||||||
SetObjectDefaults_StorageClass(a)
|
SetObjectDefaults_StorageClass(a)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func SetObjectDefaults_VolumeAttachment(in *v1beta1.VolumeAttachment) {
|
||||||
|
if in.Spec.Source.InlineVolumeSpec != nil {
|
||||||
|
v1.SetDefaults_ResourceList(&in.Spec.Source.InlineVolumeSpec.Capacity)
|
||||||
|
if in.Spec.Source.InlineVolumeSpec.PersistentVolumeSource.HostPath != nil {
|
||||||
|
v1.SetDefaults_HostPathVolumeSource(in.Spec.Source.InlineVolumeSpec.PersistentVolumeSource.HostPath)
|
||||||
|
}
|
||||||
|
if in.Spec.Source.InlineVolumeSpec.PersistentVolumeSource.RBD != nil {
|
||||||
|
v1.SetDefaults_RBDPersistentVolumeSource(in.Spec.Source.InlineVolumeSpec.PersistentVolumeSource.RBD)
|
||||||
|
}
|
||||||
|
if in.Spec.Source.InlineVolumeSpec.PersistentVolumeSource.ISCSI != nil {
|
||||||
|
v1.SetDefaults_ISCSIPersistentVolumeSource(in.Spec.Source.InlineVolumeSpec.PersistentVolumeSource.ISCSI)
|
||||||
|
}
|
||||||
|
if in.Spec.Source.InlineVolumeSpec.PersistentVolumeSource.AzureDisk != nil {
|
||||||
|
v1.SetDefaults_AzureDiskVolumeSource(in.Spec.Source.InlineVolumeSpec.PersistentVolumeSource.AzureDisk)
|
||||||
|
}
|
||||||
|
if in.Spec.Source.InlineVolumeSpec.PersistentVolumeSource.ScaleIO != nil {
|
||||||
|
v1.SetDefaults_ScaleIOPersistentVolumeSource(in.Spec.Source.InlineVolumeSpec.PersistentVolumeSource.ScaleIO)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func SetObjectDefaults_VolumeAttachmentList(in *v1beta1.VolumeAttachmentList) {
|
||||||
|
for i := range in.Items {
|
||||||
|
a := &in.Items[i]
|
||||||
|
SetObjectDefaults_VolumeAttachment(a)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -15,10 +15,12 @@ go_library(
|
||||||
"//pkg/apis/core/helper:go_default_library",
|
"//pkg/apis/core/helper:go_default_library",
|
||||||
"//pkg/apis/core/validation:go_default_library",
|
"//pkg/apis/core/validation:go_default_library",
|
||||||
"//pkg/apis/storage:go_default_library",
|
"//pkg/apis/storage:go_default_library",
|
||||||
|
"//pkg/features:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/util/validation:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/util/validation:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library",
|
||||||
|
"//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library",
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -29,7 +31,11 @@ go_test(
|
||||||
deps = [
|
deps = [
|
||||||
"//pkg/apis/core:go_default_library",
|
"//pkg/apis/core:go_default_library",
|
||||||
"//pkg/apis/storage:go_default_library",
|
"//pkg/apis/storage:go_default_library",
|
||||||
|
"//pkg/features:go_default_library",
|
||||||
|
"//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
|
||||||
|
"//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library",
|
||||||
|
"//staging/src/k8s.io/component-base/featuregate/testing:go_default_library",
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -28,7 +28,11 @@ import (
|
||||||
api "k8s.io/kubernetes/pkg/apis/core"
|
api "k8s.io/kubernetes/pkg/apis/core"
|
||||||
"k8s.io/kubernetes/pkg/apis/core/helper"
|
"k8s.io/kubernetes/pkg/apis/core/helper"
|
||||||
apivalidation "k8s.io/kubernetes/pkg/apis/core/validation"
|
apivalidation "k8s.io/kubernetes/pkg/apis/core/validation"
|
||||||
|
storagevalidation "k8s.io/kubernetes/pkg/apis/core/validation"
|
||||||
"k8s.io/kubernetes/pkg/apis/storage"
|
"k8s.io/kubernetes/pkg/apis/storage"
|
||||||
|
|
||||||
|
utilfeature "k8s.io/apiserver/pkg/util/feature"
|
||||||
|
"k8s.io/kubernetes/pkg/features"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
@ -168,8 +172,26 @@ func validateAttacher(attacher string, fldPath *field.Path) field.ErrorList {
|
||||||
// validateSource tests if the source is valid for VolumeAttachment.
|
// validateSource tests if the source is valid for VolumeAttachment.
|
||||||
func validateVolumeAttachmentSource(source *storage.VolumeAttachmentSource, fldPath *field.Path) field.ErrorList {
|
func validateVolumeAttachmentSource(source *storage.VolumeAttachmentSource, fldPath *field.Path) field.ErrorList {
|
||||||
allErrs := field.ErrorList{}
|
allErrs := field.ErrorList{}
|
||||||
if source.PersistentVolumeName == nil || len(*source.PersistentVolumeName) == 0 {
|
switch {
|
||||||
allErrs = append(allErrs, field.Required(fldPath, ""))
|
case source.InlineVolumeSpec == nil && source.PersistentVolumeName == nil:
|
||||||
|
if utilfeature.DefaultFeatureGate.Enabled(features.CSIMigration) {
|
||||||
|
allErrs = append(allErrs, field.Required(fldPath, "must specify exactly one of inlineVolumeSpec and persistentVolumeName"))
|
||||||
|
} else {
|
||||||
|
allErrs = append(allErrs, field.Required(fldPath, "must specify persistentVolumeName when CSIMigration feature is disabled"))
|
||||||
|
}
|
||||||
|
case source.InlineVolumeSpec != nil && source.PersistentVolumeName != nil:
|
||||||
|
allErrs = append(allErrs, field.Forbidden(fldPath, "must specify exactly one of inlineVolumeSpec and persistentVolumeName"))
|
||||||
|
case source.PersistentVolumeName != nil:
|
||||||
|
if len(*source.PersistentVolumeName) == 0 {
|
||||||
|
// Invalid err
|
||||||
|
allErrs = append(allErrs, field.Required(fldPath.Child("persistentVolumeName"), "must specify non empty persistentVolumeName"))
|
||||||
|
}
|
||||||
|
case source.InlineVolumeSpec != nil:
|
||||||
|
if utilfeature.DefaultFeatureGate.Enabled(features.CSIMigration) {
|
||||||
|
allErrs = append(allErrs, storagevalidation.ValidatePersistentVolumeSpec(source.InlineVolumeSpec, "", true, fldPath.Child("inlineVolumeSpec"))...)
|
||||||
|
} else {
|
||||||
|
allErrs = append(allErrs, field.Forbidden(fldPath, "may not specify inlineVolumeSpec when CSIMigration feature is disabled"))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return allErrs
|
return allErrs
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,9 +21,13 @@ import (
|
||||||
"strings"
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
"k8s.io/apimachinery/pkg/api/resource"
|
||||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
|
utilfeature "k8s.io/apiserver/pkg/util/feature"
|
||||||
|
featuregatetesting "k8s.io/component-base/featuregate/testing"
|
||||||
api "k8s.io/kubernetes/pkg/apis/core"
|
api "k8s.io/kubernetes/pkg/apis/core"
|
||||||
"k8s.io/kubernetes/pkg/apis/storage"
|
"k8s.io/kubernetes/pkg/apis/storage"
|
||||||
|
"k8s.io/kubernetes/pkg/features"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
|
@ -32,6 +36,15 @@ var (
|
||||||
immediateMode2 = storage.VolumeBindingImmediate
|
immediateMode2 = storage.VolumeBindingImmediate
|
||||||
waitingMode = storage.VolumeBindingWaitForFirstConsumer
|
waitingMode = storage.VolumeBindingWaitForFirstConsumer
|
||||||
invalidMode = storage.VolumeBindingMode("foo")
|
invalidMode = storage.VolumeBindingMode("foo")
|
||||||
|
inlineSpec = api.PersistentVolumeSpec{
|
||||||
|
AccessModes: []api.PersistentVolumeAccessMode{api.ReadWriteOnce},
|
||||||
|
PersistentVolumeSource: api.PersistentVolumeSource{
|
||||||
|
CSI: &api.CSIPersistentVolumeSource{
|
||||||
|
Driver: "com.test.foo",
|
||||||
|
VolumeHandle: "foobar",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestValidateStorageClass(t *testing.T) {
|
func TestValidateStorageClass(t *testing.T) {
|
||||||
|
@ -138,9 +151,10 @@ func TestValidateStorageClass(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestVolumeAttachmentValidation(t *testing.T) {
|
func TestVolumeAttachmentValidation(t *testing.T) {
|
||||||
|
defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.CSIMigration, true)()
|
||||||
volumeName := "pv-name"
|
volumeName := "pv-name"
|
||||||
empty := ""
|
empty := ""
|
||||||
successCases := []storage.VolumeAttachment{
|
migrationEnabledSuccessCases := []storage.VolumeAttachment{
|
||||||
{
|
{
|
||||||
ObjectMeta: metav1.ObjectMeta{Name: "foo"},
|
ObjectMeta: metav1.ObjectMeta{Name: "foo"},
|
||||||
Spec: storage.VolumeAttachmentSpec{
|
Spec: storage.VolumeAttachmentSpec{
|
||||||
|
@ -151,6 +165,16 @@ func TestVolumeAttachmentValidation(t *testing.T) {
|
||||||
NodeName: "mynode",
|
NodeName: "mynode",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
ObjectMeta: metav1.ObjectMeta{Name: "foo-with-inlinespec"},
|
||||||
|
Spec: storage.VolumeAttachmentSpec{
|
||||||
|
Attacher: "myattacher",
|
||||||
|
Source: storage.VolumeAttachmentSource{
|
||||||
|
InlineVolumeSpec: &inlineSpec,
|
||||||
|
},
|
||||||
|
NodeName: "mynode",
|
||||||
|
},
|
||||||
|
},
|
||||||
{
|
{
|
||||||
ObjectMeta: metav1.ObjectMeta{Name: "foo-with-status"},
|
ObjectMeta: metav1.ObjectMeta{Name: "foo-with-status"},
|
||||||
Spec: storage.VolumeAttachmentSpec{
|
Spec: storage.VolumeAttachmentSpec{
|
||||||
|
@ -175,14 +199,38 @@ func TestVolumeAttachmentValidation(t *testing.T) {
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
ObjectMeta: metav1.ObjectMeta{Name: "foo-with-inlinespec-and-status"},
|
||||||
|
Spec: storage.VolumeAttachmentSpec{
|
||||||
|
Attacher: "myattacher",
|
||||||
|
Source: storage.VolumeAttachmentSource{
|
||||||
|
InlineVolumeSpec: &inlineSpec,
|
||||||
|
},
|
||||||
|
NodeName: "mynode",
|
||||||
|
},
|
||||||
|
Status: storage.VolumeAttachmentStatus{
|
||||||
|
Attached: true,
|
||||||
|
AttachmentMetadata: map[string]string{
|
||||||
|
"foo": "bar",
|
||||||
|
},
|
||||||
|
AttachError: &storage.VolumeError{
|
||||||
|
Time: metav1.Time{},
|
||||||
|
Message: "hello world",
|
||||||
|
},
|
||||||
|
DetachError: &storage.VolumeError{
|
||||||
|
Time: metav1.Time{},
|
||||||
|
Message: "hello world",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, volumeAttachment := range successCases {
|
for _, volumeAttachment := range migrationEnabledSuccessCases {
|
||||||
if errs := ValidateVolumeAttachment(&volumeAttachment); len(errs) != 0 {
|
if errs := ValidateVolumeAttachment(&volumeAttachment); len(errs) != 0 {
|
||||||
t.Errorf("expected success: %v", errs)
|
t.Errorf("expected success: %v %v", volumeAttachment, errs)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
errorCases := []storage.VolumeAttachment{
|
migrationEnabledErrorCases := []storage.VolumeAttachment{
|
||||||
{
|
{
|
||||||
// Empty attacher name
|
// Empty attacher name
|
||||||
ObjectMeta: metav1.ObjectMeta{Name: "foo"},
|
ObjectMeta: metav1.ObjectMeta{Name: "foo"},
|
||||||
|
@ -277,16 +325,105 @@ func TestVolumeAttachmentValidation(t *testing.T) {
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
// VolumeAttachmentSource with no PersistentVolumeName nor InlineSpec
|
||||||
|
ObjectMeta: metav1.ObjectMeta{Name: "foo"},
|
||||||
|
Spec: storage.VolumeAttachmentSpec{
|
||||||
|
Attacher: "myattacher",
|
||||||
|
NodeName: "node",
|
||||||
|
Source: storage.VolumeAttachmentSource{},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
// VolumeAttachmentSource with PersistentVolumeName and InlineSpec
|
||||||
|
ObjectMeta: metav1.ObjectMeta{Name: "foo"},
|
||||||
|
Spec: storage.VolumeAttachmentSpec{
|
||||||
|
Attacher: "myattacher",
|
||||||
|
NodeName: "node",
|
||||||
|
Source: storage.VolumeAttachmentSource{
|
||||||
|
PersistentVolumeName: &volumeName,
|
||||||
|
InlineVolumeSpec: &inlineSpec,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
// VolumeAttachmentSource with InlineSpec without CSI PV Source
|
||||||
|
ObjectMeta: metav1.ObjectMeta{Name: "foo"},
|
||||||
|
Spec: storage.VolumeAttachmentSpec{
|
||||||
|
Attacher: "myattacher",
|
||||||
|
NodeName: "node",
|
||||||
|
Source: storage.VolumeAttachmentSource{
|
||||||
|
PersistentVolumeName: &volumeName,
|
||||||
|
InlineVolumeSpec: &api.PersistentVolumeSpec{
|
||||||
|
Capacity: api.ResourceList{
|
||||||
|
api.ResourceName(api.ResourceStorage): resource.MustParse("10G"),
|
||||||
|
},
|
||||||
|
AccessModes: []api.PersistentVolumeAccessMode{api.ReadWriteOnce},
|
||||||
|
PersistentVolumeSource: api.PersistentVolumeSource{
|
||||||
|
FlexVolume: &api.FlexPersistentVolumeSource{
|
||||||
|
Driver: "kubernetes.io/blue",
|
||||||
|
FSType: "ext4",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
StorageClassName: "test-storage-class",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, volumeAttachment := range errorCases {
|
for _, volumeAttachment := range migrationEnabledErrorCases {
|
||||||
if errs := ValidateVolumeAttachment(&volumeAttachment); len(errs) == 0 {
|
if errs := ValidateVolumeAttachment(&volumeAttachment); len(errs) == 0 {
|
||||||
t.Errorf("Expected failure for test: %v", volumeAttachment)
|
t.Errorf("expected failure for test: %v", volumeAttachment)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// validate with CSIMigration disabled
|
||||||
|
defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.CSIMigration, false)()
|
||||||
|
|
||||||
|
migrationDisabledSuccessCases := []storage.VolumeAttachment{
|
||||||
|
{
|
||||||
|
// PVName specified with migration disabled
|
||||||
|
ObjectMeta: metav1.ObjectMeta{Name: "foo"},
|
||||||
|
Spec: storage.VolumeAttachmentSpec{
|
||||||
|
Attacher: "myattacher",
|
||||||
|
NodeName: "node",
|
||||||
|
Source: storage.VolumeAttachmentSource{
|
||||||
|
PersistentVolumeName: &volumeName,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
for _, volumeAttachment := range migrationDisabledSuccessCases {
|
||||||
|
if errs := ValidateVolumeAttachment(&volumeAttachment); len(errs) != 0 {
|
||||||
|
t.Errorf("expected success: %v %v", volumeAttachment, errs)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
migrationDisabledErrorCases := []storage.VolumeAttachment{
|
||||||
|
{
|
||||||
|
// InlineSpec specified with migration disabled
|
||||||
|
ObjectMeta: metav1.ObjectMeta{Name: "foo"},
|
||||||
|
Spec: storage.VolumeAttachmentSpec{
|
||||||
|
Attacher: "myattacher",
|
||||||
|
NodeName: "node",
|
||||||
|
Source: storage.VolumeAttachmentSource{
|
||||||
|
InlineVolumeSpec: &inlineSpec,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, volumeAttachment := range migrationDisabledErrorCases {
|
||||||
|
if errs := ValidateVolumeAttachment(&volumeAttachment); len(errs) == 0 {
|
||||||
|
t.Errorf("expected failure: %v %v", volumeAttachment, errs)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestVolumeAttachmentUpdateValidation(t *testing.T) {
|
func TestVolumeAttachmentUpdateValidation(t *testing.T) {
|
||||||
|
defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.CSIMigration, true)()
|
||||||
volumeName := "foo"
|
volumeName := "foo"
|
||||||
newVolumeName := "bar"
|
newVolumeName := "bar"
|
||||||
|
|
||||||
|
@ -294,21 +431,18 @@ func TestVolumeAttachmentUpdateValidation(t *testing.T) {
|
||||||
ObjectMeta: metav1.ObjectMeta{Name: "foo"},
|
ObjectMeta: metav1.ObjectMeta{Name: "foo"},
|
||||||
Spec: storage.VolumeAttachmentSpec{
|
Spec: storage.VolumeAttachmentSpec{
|
||||||
Attacher: "myattacher",
|
Attacher: "myattacher",
|
||||||
Source: storage.VolumeAttachmentSource{
|
Source: storage.VolumeAttachmentSource{},
|
||||||
PersistentVolumeName: &volumeName,
|
|
||||||
},
|
|
||||||
NodeName: "mynode",
|
NodeName: "mynode",
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
successCases := []storage.VolumeAttachment{
|
successCases := []storage.VolumeAttachment{
|
||||||
{
|
{
|
||||||
// no change
|
// no change
|
||||||
ObjectMeta: metav1.ObjectMeta{Name: "foo"},
|
ObjectMeta: metav1.ObjectMeta{Name: "foo"},
|
||||||
Spec: storage.VolumeAttachmentSpec{
|
Spec: storage.VolumeAttachmentSpec{
|
||||||
Attacher: "myattacher",
|
Attacher: "myattacher",
|
||||||
Source: storage.VolumeAttachmentSource{
|
Source: storage.VolumeAttachmentSource{},
|
||||||
PersistentVolumeName: &volumeName,
|
|
||||||
},
|
|
||||||
NodeName: "mynode",
|
NodeName: "mynode",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
@ -317,9 +451,7 @@ func TestVolumeAttachmentUpdateValidation(t *testing.T) {
|
||||||
ObjectMeta: metav1.ObjectMeta{Name: "foo"},
|
ObjectMeta: metav1.ObjectMeta{Name: "foo"},
|
||||||
Spec: storage.VolumeAttachmentSpec{
|
Spec: storage.VolumeAttachmentSpec{
|
||||||
Attacher: "myattacher",
|
Attacher: "myattacher",
|
||||||
Source: storage.VolumeAttachmentSource{
|
Source: storage.VolumeAttachmentSource{},
|
||||||
PersistentVolumeName: &volumeName,
|
|
||||||
},
|
|
||||||
NodeName: "mynode",
|
NodeName: "mynode",
|
||||||
},
|
},
|
||||||
Status: storage.VolumeAttachmentStatus{
|
Status: storage.VolumeAttachmentStatus{
|
||||||
|
@ -340,11 +472,29 @@ func TestVolumeAttachmentUpdateValidation(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, volumeAttachment := range successCases {
|
for _, volumeAttachment := range successCases {
|
||||||
|
volumeAttachment.Spec.Source = storage.VolumeAttachmentSource{}
|
||||||
|
old.Spec.Source = storage.VolumeAttachmentSource{}
|
||||||
|
// test scenarios with PersistentVolumeName set
|
||||||
|
volumeAttachment.Spec.Source.PersistentVolumeName = &volumeName
|
||||||
|
old.Spec.Source.PersistentVolumeName = &volumeName
|
||||||
|
if errs := ValidateVolumeAttachmentUpdate(&volumeAttachment, &old); len(errs) != 0 {
|
||||||
|
t.Errorf("expected success: %+v", errs)
|
||||||
|
}
|
||||||
|
|
||||||
|
volumeAttachment.Spec.Source = storage.VolumeAttachmentSource{}
|
||||||
|
old.Spec.Source = storage.VolumeAttachmentSource{}
|
||||||
|
// test scenarios with InlineVolumeSpec set
|
||||||
|
volumeAttachment.Spec.Source.InlineVolumeSpec = &inlineSpec
|
||||||
|
old.Spec.Source.InlineVolumeSpec = &inlineSpec
|
||||||
if errs := ValidateVolumeAttachmentUpdate(&volumeAttachment, &old); len(errs) != 0 {
|
if errs := ValidateVolumeAttachmentUpdate(&volumeAttachment, &old); len(errs) != 0 {
|
||||||
t.Errorf("expected success: %+v", errs)
|
t.Errorf("expected success: %+v", errs)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// reset old's source with volumeName in case it was left with something else by earlier tests
|
||||||
|
old.Spec.Source = storage.VolumeAttachmentSource{}
|
||||||
|
old.Spec.Source.PersistentVolumeName = &volumeName
|
||||||
|
|
||||||
errorCases := []storage.VolumeAttachment{
|
errorCases := []storage.VolumeAttachment{
|
||||||
{
|
{
|
||||||
// change attacher
|
// change attacher
|
||||||
|
@ -358,7 +508,7 @@ func TestVolumeAttachmentUpdateValidation(t *testing.T) {
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
// change volume
|
// change source volume name
|
||||||
ObjectMeta: metav1.ObjectMeta{Name: "foo"},
|
ObjectMeta: metav1.ObjectMeta{Name: "foo"},
|
||||||
Spec: storage.VolumeAttachmentSpec{
|
Spec: storage.VolumeAttachmentSpec{
|
||||||
Attacher: "myattacher",
|
Attacher: "myattacher",
|
||||||
|
@ -379,6 +529,17 @@ func TestVolumeAttachmentUpdateValidation(t *testing.T) {
|
||||||
NodeName: "anothernode",
|
NodeName: "anothernode",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
// change source
|
||||||
|
ObjectMeta: metav1.ObjectMeta{Name: "foo"},
|
||||||
|
Spec: storage.VolumeAttachmentSpec{
|
||||||
|
Attacher: "myattacher",
|
||||||
|
Source: storage.VolumeAttachmentSource{
|
||||||
|
InlineVolumeSpec: &inlineSpec,
|
||||||
|
},
|
||||||
|
NodeName: "mynode",
|
||||||
|
},
|
||||||
|
},
|
||||||
{
|
{
|
||||||
// add invalid status
|
// add invalid status
|
||||||
ObjectMeta: metav1.ObjectMeta{Name: "foo"},
|
ObjectMeta: metav1.ObjectMeta{Name: "foo"},
|
||||||
|
|
|
@ -377,6 +377,11 @@ func (in *VolumeAttachmentSource) DeepCopyInto(out *VolumeAttachmentSource) {
|
||||||
*out = new(string)
|
*out = new(string)
|
||||||
**out = **in
|
**out = **in
|
||||||
}
|
}
|
||||||
|
if in.InlineVolumeSpec != nil {
|
||||||
|
in, out := &in.InlineVolumeSpec, &out.InlineVolumeSpec
|
||||||
|
*out = new(core.PersistentVolumeSpec)
|
||||||
|
(*in).DeepCopyInto(*out)
|
||||||
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -12,6 +12,7 @@ go_library(
|
||||||
"//pkg/api/legacyscheme:go_default_library",
|
"//pkg/api/legacyscheme:go_default_library",
|
||||||
"//pkg/apis/storage:go_default_library",
|
"//pkg/apis/storage:go_default_library",
|
||||||
"//pkg/apis/storage/validation:go_default_library",
|
"//pkg/apis/storage/validation:go_default_library",
|
||||||
|
"//pkg/features:go_default_library",
|
||||||
"//staging/src/k8s.io/api/storage/v1beta1:go_default_library",
|
"//staging/src/k8s.io/api/storage/v1beta1:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library",
|
||||||
|
@ -19,6 +20,7 @@ go_library(
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library",
|
||||||
"//staging/src/k8s.io/apiserver/pkg/endpoints/request:go_default_library",
|
"//staging/src/k8s.io/apiserver/pkg/endpoints/request:go_default_library",
|
||||||
"//staging/src/k8s.io/apiserver/pkg/storage/names:go_default_library",
|
"//staging/src/k8s.io/apiserver/pkg/storage/names:go_default_library",
|
||||||
|
"//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library",
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -27,12 +29,17 @@ go_test(
|
||||||
srcs = ["strategy_test.go"],
|
srcs = ["strategy_test.go"],
|
||||||
embed = [":go_default_library"],
|
embed = [":go_default_library"],
|
||||||
deps = [
|
deps = [
|
||||||
|
"//pkg/apis/core:go_default_library",
|
||||||
"//pkg/apis/storage:go_default_library",
|
"//pkg/apis/storage:go_default_library",
|
||||||
|
"//pkg/features:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library",
|
||||||
|
"//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library",
|
||||||
"//staging/src/k8s.io/apiserver/pkg/endpoints/request:go_default_library",
|
"//staging/src/k8s.io/apiserver/pkg/endpoints/request:go_default_library",
|
||||||
|
"//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library",
|
||||||
|
"//staging/src/k8s.io/component-base/featuregate/testing:go_default_library",
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -26,9 +26,11 @@ import (
|
||||||
"k8s.io/apimachinery/pkg/util/validation/field"
|
"k8s.io/apimachinery/pkg/util/validation/field"
|
||||||
genericapirequest "k8s.io/apiserver/pkg/endpoints/request"
|
genericapirequest "k8s.io/apiserver/pkg/endpoints/request"
|
||||||
"k8s.io/apiserver/pkg/storage/names"
|
"k8s.io/apiserver/pkg/storage/names"
|
||||||
|
utilfeature "k8s.io/apiserver/pkg/util/feature"
|
||||||
"k8s.io/kubernetes/pkg/api/legacyscheme"
|
"k8s.io/kubernetes/pkg/api/legacyscheme"
|
||||||
"k8s.io/kubernetes/pkg/apis/storage"
|
"k8s.io/kubernetes/pkg/apis/storage"
|
||||||
"k8s.io/kubernetes/pkg/apis/storage/validation"
|
"k8s.io/kubernetes/pkg/apis/storage/validation"
|
||||||
|
"k8s.io/kubernetes/pkg/features"
|
||||||
)
|
)
|
||||||
|
|
||||||
// volumeAttachmentStrategy implements behavior for VolumeAttachment objects
|
// volumeAttachmentStrategy implements behavior for VolumeAttachment objects
|
||||||
|
@ -53,6 +55,8 @@ func (volumeAttachmentStrategy) PrepareForCreate(ctx context.Context, obj runtim
|
||||||
groupVersion = schema.GroupVersion{Group: requestInfo.APIGroup, Version: requestInfo.APIVersion}
|
groupVersion = schema.GroupVersion{Group: requestInfo.APIGroup, Version: requestInfo.APIVersion}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
volumeAttachment := obj.(*storage.VolumeAttachment)
|
||||||
|
|
||||||
switch groupVersion {
|
switch groupVersion {
|
||||||
case storageapiv1beta1.SchemeGroupVersion:
|
case storageapiv1beta1.SchemeGroupVersion:
|
||||||
// allow modification of status for v1beta1
|
// allow modification of status for v1beta1
|
||||||
|
@ -60,6 +64,11 @@ func (volumeAttachmentStrategy) PrepareForCreate(ctx context.Context, obj runtim
|
||||||
volumeAttachment := obj.(*storage.VolumeAttachment)
|
volumeAttachment := obj.(*storage.VolumeAttachment)
|
||||||
volumeAttachment.Status = storage.VolumeAttachmentStatus{}
|
volumeAttachment.Status = storage.VolumeAttachmentStatus{}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if !utilfeature.DefaultFeatureGate.Enabled(features.CSIMigration) {
|
||||||
|
volumeAttachment.Spec.Source.InlineVolumeSpec = nil
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (volumeAttachmentStrategy) Validate(ctx context.Context, obj runtime.Object) field.ErrorList {
|
func (volumeAttachmentStrategy) Validate(ctx context.Context, obj runtime.Object) field.ErrorList {
|
||||||
|
@ -98,15 +107,21 @@ func (volumeAttachmentStrategy) PrepareForUpdate(ctx context.Context, obj, old r
|
||||||
if requestInfo, found := genericapirequest.RequestInfoFrom(ctx); found {
|
if requestInfo, found := genericapirequest.RequestInfoFrom(ctx); found {
|
||||||
groupVersion = schema.GroupVersion{Group: requestInfo.APIGroup, Version: requestInfo.APIVersion}
|
groupVersion = schema.GroupVersion{Group: requestInfo.APIGroup, Version: requestInfo.APIVersion}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
newVolumeAttachment := obj.(*storage.VolumeAttachment)
|
||||||
|
oldVolumeAttachment := old.(*storage.VolumeAttachment)
|
||||||
|
|
||||||
switch groupVersion {
|
switch groupVersion {
|
||||||
case storageapiv1beta1.SchemeGroupVersion:
|
case storageapiv1beta1.SchemeGroupVersion:
|
||||||
// allow modification of Status via main resource for v1beta1
|
// allow modification of Status via main resource for v1beta1
|
||||||
default:
|
default:
|
||||||
newVolumeAttachment := obj.(*storage.VolumeAttachment)
|
|
||||||
oldVolumeAttachment := old.(*storage.VolumeAttachment)
|
|
||||||
newVolumeAttachment.Status = oldVolumeAttachment.Status
|
newVolumeAttachment.Status = oldVolumeAttachment.Status
|
||||||
// No need to increment Generation because we don't allow updates to spec
|
// No need to increment Generation because we don't allow updates to spec
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if !utilfeature.DefaultFeatureGate.Enabled(features.CSIMigration) && oldVolumeAttachment.Spec.Source.InlineVolumeSpec == nil {
|
||||||
|
newVolumeAttachment.Spec.Source.InlineVolumeSpec = nil
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (volumeAttachmentStrategy) ValidateUpdate(ctx context.Context, obj, old runtime.Object) field.ErrorList {
|
func (volumeAttachmentStrategy) ValidateUpdate(ctx context.Context, obj, old runtime.Object) field.ErrorList {
|
||||||
|
|
|
@ -20,11 +20,16 @@ import (
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
apiequality "k8s.io/apimachinery/pkg/api/equality"
|
apiequality "k8s.io/apimachinery/pkg/api/equality"
|
||||||
|
"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/util/diff"
|
"k8s.io/apimachinery/pkg/util/diff"
|
||||||
"k8s.io/apimachinery/pkg/util/validation/field"
|
"k8s.io/apimachinery/pkg/util/validation/field"
|
||||||
genericapirequest "k8s.io/apiserver/pkg/endpoints/request"
|
genericapirequest "k8s.io/apiserver/pkg/endpoints/request"
|
||||||
|
utilfeature "k8s.io/apiserver/pkg/util/feature"
|
||||||
|
featuregatetesting "k8s.io/component-base/featuregate/testing"
|
||||||
|
api "k8s.io/kubernetes/pkg/apis/core"
|
||||||
"k8s.io/kubernetes/pkg/apis/storage"
|
"k8s.io/kubernetes/pkg/apis/storage"
|
||||||
|
"k8s.io/kubernetes/pkg/features"
|
||||||
)
|
)
|
||||||
|
|
||||||
func getValidVolumeAttachment(name string) *storage.VolumeAttachment {
|
func getValidVolumeAttachment(name string) *storage.VolumeAttachment {
|
||||||
|
@ -42,6 +47,25 @@ func getValidVolumeAttachment(name string) *storage.VolumeAttachment {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func getValidVolumeAttachmentWithInlineSpec(name string) *storage.VolumeAttachment {
|
||||||
|
volumeAttachment := getValidVolumeAttachment(name)
|
||||||
|
volumeAttachment.Spec.Source.PersistentVolumeName = nil
|
||||||
|
volumeAttachment.Spec.Source.InlineVolumeSpec = &api.PersistentVolumeSpec{
|
||||||
|
Capacity: api.ResourceList{
|
||||||
|
api.ResourceName(api.ResourceStorage): resource.MustParse("10"),
|
||||||
|
},
|
||||||
|
AccessModes: []api.PersistentVolumeAccessMode{api.ReadWriteOnce},
|
||||||
|
PersistentVolumeSource: api.PersistentVolumeSource{
|
||||||
|
CSI: &api.CSIPersistentVolumeSource{
|
||||||
|
Driver: "com.test.foo",
|
||||||
|
VolumeHandle: name,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
MountOptions: []string{"soft"},
|
||||||
|
}
|
||||||
|
return volumeAttachment
|
||||||
|
}
|
||||||
|
|
||||||
func TestVolumeAttachmentStrategy(t *testing.T) {
|
func TestVolumeAttachmentStrategy(t *testing.T) {
|
||||||
ctx := genericapirequest.WithRequestInfo(genericapirequest.NewContext(), &genericapirequest.RequestInfo{
|
ctx := genericapirequest.WithRequestInfo(genericapirequest.NewContext(), &genericapirequest.RequestInfo{
|
||||||
APIGroup: "storage.k8s.io",
|
APIGroup: "storage.k8s.io",
|
||||||
|
@ -94,6 +118,46 @@ func TestVolumeAttachmentStrategy(t *testing.T) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestVolumeAttachmentStrategySourceInlineSpec(t *testing.T) {
|
||||||
|
ctx := genericapirequest.WithRequestInfo(genericapirequest.NewContext(), &genericapirequest.RequestInfo{
|
||||||
|
APIGroup: "storage.k8s.io",
|
||||||
|
APIVersion: "v1",
|
||||||
|
Resource: "volumeattachments",
|
||||||
|
})
|
||||||
|
|
||||||
|
volumeAttachment := getValidVolumeAttachmentWithInlineSpec("valid-attachment")
|
||||||
|
volumeAttachmentSaved := volumeAttachment.DeepCopy()
|
||||||
|
defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.CSIMigration, true)()
|
||||||
|
Strategy.PrepareForCreate(ctx, volumeAttachment)
|
||||||
|
if volumeAttachment.Spec.Source.InlineVolumeSpec == nil {
|
||||||
|
t.Errorf("InlineVolumeSpec unexpectedly set to nil during PrepareForCreate")
|
||||||
|
}
|
||||||
|
if !apiequality.Semantic.DeepEqual(volumeAttachmentSaved, volumeAttachment) {
|
||||||
|
t.Errorf("unexpected difference in object after creation: %v", diff.ObjectDiff(volumeAttachment, volumeAttachmentSaved))
|
||||||
|
}
|
||||||
|
Strategy.PrepareForUpdate(ctx, volumeAttachmentSaved, volumeAttachment)
|
||||||
|
if volumeAttachmentSaved.Spec.Source.InlineVolumeSpec == nil {
|
||||||
|
t.Errorf("InlineVolumeSpec unexpectedly set to nil during PrepareForUpdate")
|
||||||
|
}
|
||||||
|
defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.CSIMigration, false)()
|
||||||
|
Strategy.PrepareForUpdate(ctx, volumeAttachmentSaved, volumeAttachment)
|
||||||
|
if volumeAttachmentSaved.Spec.Source.InlineVolumeSpec == nil {
|
||||||
|
t.Errorf("InlineVolumeSpec unexpectedly set to nil during PrepareForUpdate")
|
||||||
|
}
|
||||||
|
|
||||||
|
volumeAttachment = getValidVolumeAttachmentWithInlineSpec("valid-attachment")
|
||||||
|
volumeAttachmentNew := volumeAttachment.DeepCopy()
|
||||||
|
defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.CSIMigration, false)()
|
||||||
|
Strategy.PrepareForCreate(ctx, volumeAttachment)
|
||||||
|
if volumeAttachment.Spec.Source.InlineVolumeSpec != nil {
|
||||||
|
t.Errorf("InlineVolumeSpec unexpectedly not dropped during PrepareForCreate")
|
||||||
|
}
|
||||||
|
Strategy.PrepareForUpdate(ctx, volumeAttachmentNew, volumeAttachment)
|
||||||
|
if volumeAttachmentNew.Spec.Source.InlineVolumeSpec != nil {
|
||||||
|
t.Errorf("InlineVolumeSpec unexpectedly not dropped during PrepareForUpdate")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestVolumeAttachmentStatusStrategy(t *testing.T) {
|
func TestVolumeAttachmentStatusStrategy(t *testing.T) {
|
||||||
ctx := genericapirequest.WithRequestInfo(genericapirequest.NewContext(), &genericapirequest.RequestInfo{
|
ctx := genericapirequest.WithRequestInfo(genericapirequest.NewContext(), &genericapirequest.RequestInfo{
|
||||||
APIGroup: "storage.k8s.io",
|
APIGroup: "storage.k8s.io",
|
||||||
|
|
|
@ -71,9 +71,27 @@ func (c *csiAttacher) Attach(spec *volume.Spec, nodeName types.NodeName) (string
|
||||||
}
|
}
|
||||||
|
|
||||||
node := string(nodeName)
|
node := string(nodeName)
|
||||||
pvName := spec.PersistentVolume.GetName()
|
|
||||||
attachID := getAttachmentName(pvSrc.VolumeHandle, pvSrc.Driver, node)
|
attachID := getAttachmentName(pvSrc.VolumeHandle, pvSrc.Driver, node)
|
||||||
|
|
||||||
|
var vaSrc storage.VolumeAttachmentSource
|
||||||
|
if spec.InlineVolumeSpecForCSIMigration {
|
||||||
|
// inline PV scenario - use PV spec to populate VA source.
|
||||||
|
// The volume spec will be populated by CSI translation API
|
||||||
|
// for inline volumes. This allows fields required by the CSI
|
||||||
|
// attacher such as AccessMode and MountOptions (in addition to
|
||||||
|
// fields in the CSI persistent volume source) to be populated
|
||||||
|
// as part of CSI translation for inline volumes.
|
||||||
|
vaSrc = storage.VolumeAttachmentSource{
|
||||||
|
InlineVolumeSpec: &spec.PersistentVolume.Spec,
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// regular PV scenario - use PV name to populate VA source
|
||||||
|
pvName := spec.PersistentVolume.GetName()
|
||||||
|
vaSrc = storage.VolumeAttachmentSource{
|
||||||
|
PersistentVolumeName: &pvName,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
attachment := &storage.VolumeAttachment{
|
attachment := &storage.VolumeAttachment{
|
||||||
ObjectMeta: meta.ObjectMeta{
|
ObjectMeta: meta.ObjectMeta{
|
||||||
Name: attachID,
|
Name: attachID,
|
||||||
|
@ -81,9 +99,7 @@ func (c *csiAttacher) Attach(spec *volume.Spec, nodeName types.NodeName) (string
|
||||||
Spec: storage.VolumeAttachmentSpec{
|
Spec: storage.VolumeAttachmentSpec{
|
||||||
NodeName: node,
|
NodeName: node,
|
||||||
Attacher: pvSrc.Driver,
|
Attacher: pvSrc.Driver,
|
||||||
Source: storage.VolumeAttachmentSource{
|
Source: vaSrc,
|
||||||
PersistentVolumeName: &pvName,
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -452,9 +452,10 @@ type VolumePluginMgr struct {
|
||||||
|
|
||||||
// Spec is an internal representation of a volume. All API volume types translate to Spec.
|
// Spec is an internal representation of a volume. All API volume types translate to Spec.
|
||||||
type Spec struct {
|
type Spec struct {
|
||||||
Volume *v1.Volume
|
Volume *v1.Volume
|
||||||
PersistentVolume *v1.PersistentVolume
|
PersistentVolume *v1.PersistentVolume
|
||||||
ReadOnly bool
|
ReadOnly bool
|
||||||
|
InlineVolumeSpecForCSIMigration bool
|
||||||
}
|
}
|
||||||
|
|
||||||
// Name returns the name of either Volume or PersistentVolume, one of which must not be nil.
|
// Name returns the name of either Volume or PersistentVolume, one of which must not be nil.
|
||||||
|
|
|
@ -1859,19 +1859,28 @@ func nodeUsingCSIPlugin(og *operationGenerator, spec *volume.Spec, nodeName type
|
||||||
}
|
}
|
||||||
|
|
||||||
func translateSpec(spec *volume.Spec) (*volume.Spec, error) {
|
func translateSpec(spec *volume.Spec) (*volume.Spec, error) {
|
||||||
|
var csiPV *v1.PersistentVolume
|
||||||
|
var err error
|
||||||
|
inlineVolume := false
|
||||||
if spec.PersistentVolume != nil {
|
if spec.PersistentVolume != nil {
|
||||||
// TranslateInTreePVToCSI will create a new PV
|
// TranslateInTreePVToCSI will create a new PV
|
||||||
csiPV, err := csilib.TranslateInTreePVToCSI(spec.PersistentVolume)
|
csiPV, err = csilib.TranslateInTreePVToCSI(spec.PersistentVolume)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("failed to translate in tree pv to CSI: %v", err)
|
return nil, fmt.Errorf("failed to translate in tree pv to CSI: %v", err)
|
||||||
}
|
}
|
||||||
return &volume.Spec{
|
|
||||||
PersistentVolume: csiPV,
|
|
||||||
ReadOnly: spec.ReadOnly,
|
|
||||||
}, nil
|
|
||||||
} else if spec.Volume != nil {
|
} else if spec.Volume != nil {
|
||||||
return &volume.Spec{}, goerrors.New("translation is not supported for in-line volumes yet")
|
// TranslateInTreeInlineVolumeToCSI will create a new PV
|
||||||
|
csiPV, err = csilib.TranslateInTreeInlineVolumeToCSI(spec.Volume)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("failed to translate in tree inline volume to CSI: %v", err)
|
||||||
|
}
|
||||||
|
inlineVolume = true
|
||||||
} else {
|
} else {
|
||||||
return &volume.Spec{}, goerrors.New("not a valid volume spec")
|
return &volume.Spec{}, goerrors.New("not a valid volume spec")
|
||||||
}
|
}
|
||||||
|
return &volume.Spec{
|
||||||
|
PersistentVolume: csiPV,
|
||||||
|
ReadOnly: spec.ReadOnly,
|
||||||
|
InlineVolumeSpecForCSIMigration: inlineVolume,
|
||||||
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -341,6 +341,16 @@ func (m *VolumeAttachmentSource) MarshalTo(dAtA []byte) (int, error) {
|
||||||
i = encodeVarintGenerated(dAtA, i, uint64(len(*m.PersistentVolumeName)))
|
i = encodeVarintGenerated(dAtA, i, uint64(len(*m.PersistentVolumeName)))
|
||||||
i += copy(dAtA[i:], *m.PersistentVolumeName)
|
i += copy(dAtA[i:], *m.PersistentVolumeName)
|
||||||
}
|
}
|
||||||
|
if m.InlineVolumeSpec != nil {
|
||||||
|
dAtA[i] = 0x12
|
||||||
|
i++
|
||||||
|
i = encodeVarintGenerated(dAtA, i, uint64(m.InlineVolumeSpec.Size()))
|
||||||
|
n7, err := m.InlineVolumeSpec.MarshalTo(dAtA[i:])
|
||||||
|
if err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
i += n7
|
||||||
|
}
|
||||||
return i, nil
|
return i, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -366,11 +376,11 @@ func (m *VolumeAttachmentSpec) MarshalTo(dAtA []byte) (int, error) {
|
||||||
dAtA[i] = 0x12
|
dAtA[i] = 0x12
|
||||||
i++
|
i++
|
||||||
i = encodeVarintGenerated(dAtA, i, uint64(m.Source.Size()))
|
i = encodeVarintGenerated(dAtA, i, uint64(m.Source.Size()))
|
||||||
n7, err := m.Source.MarshalTo(dAtA[i:])
|
n8, err := m.Source.MarshalTo(dAtA[i:])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, err
|
return 0, err
|
||||||
}
|
}
|
||||||
i += n7
|
i += n8
|
||||||
dAtA[i] = 0x1a
|
dAtA[i] = 0x1a
|
||||||
i++
|
i++
|
||||||
i = encodeVarintGenerated(dAtA, i, uint64(len(m.NodeName)))
|
i = encodeVarintGenerated(dAtA, i, uint64(len(m.NodeName)))
|
||||||
|
@ -427,21 +437,21 @@ func (m *VolumeAttachmentStatus) MarshalTo(dAtA []byte) (int, error) {
|
||||||
dAtA[i] = 0x1a
|
dAtA[i] = 0x1a
|
||||||
i++
|
i++
|
||||||
i = encodeVarintGenerated(dAtA, i, uint64(m.AttachError.Size()))
|
i = encodeVarintGenerated(dAtA, i, uint64(m.AttachError.Size()))
|
||||||
n8, err := m.AttachError.MarshalTo(dAtA[i:])
|
n9, err := m.AttachError.MarshalTo(dAtA[i:])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, err
|
return 0, err
|
||||||
}
|
}
|
||||||
i += n8
|
i += n9
|
||||||
}
|
}
|
||||||
if m.DetachError != nil {
|
if m.DetachError != nil {
|
||||||
dAtA[i] = 0x22
|
dAtA[i] = 0x22
|
||||||
i++
|
i++
|
||||||
i = encodeVarintGenerated(dAtA, i, uint64(m.DetachError.Size()))
|
i = encodeVarintGenerated(dAtA, i, uint64(m.DetachError.Size()))
|
||||||
n9, err := m.DetachError.MarshalTo(dAtA[i:])
|
n10, err := m.DetachError.MarshalTo(dAtA[i:])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, err
|
return 0, err
|
||||||
}
|
}
|
||||||
i += n9
|
i += n10
|
||||||
}
|
}
|
||||||
return i, nil
|
return i, nil
|
||||||
}
|
}
|
||||||
|
@ -464,11 +474,11 @@ func (m *VolumeError) MarshalTo(dAtA []byte) (int, error) {
|
||||||
dAtA[i] = 0xa
|
dAtA[i] = 0xa
|
||||||
i++
|
i++
|
||||||
i = encodeVarintGenerated(dAtA, i, uint64(m.Time.Size()))
|
i = encodeVarintGenerated(dAtA, i, uint64(m.Time.Size()))
|
||||||
n10, err := m.Time.MarshalTo(dAtA[i:])
|
n11, err := m.Time.MarshalTo(dAtA[i:])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, err
|
return 0, err
|
||||||
}
|
}
|
||||||
i += n10
|
i += n11
|
||||||
dAtA[i] = 0x12
|
dAtA[i] = 0x12
|
||||||
i++
|
i++
|
||||||
i = encodeVarintGenerated(dAtA, i, uint64(len(m.Message)))
|
i = encodeVarintGenerated(dAtA, i, uint64(len(m.Message)))
|
||||||
|
@ -573,6 +583,10 @@ func (m *VolumeAttachmentSource) Size() (n int) {
|
||||||
l = len(*m.PersistentVolumeName)
|
l = len(*m.PersistentVolumeName)
|
||||||
n += 1 + l + sovGenerated(uint64(l))
|
n += 1 + l + sovGenerated(uint64(l))
|
||||||
}
|
}
|
||||||
|
if m.InlineVolumeSpec != nil {
|
||||||
|
l = m.InlineVolumeSpec.Size()
|
||||||
|
n += 1 + l + sovGenerated(uint64(l))
|
||||||
|
}
|
||||||
return n
|
return n
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -701,6 +715,7 @@ func (this *VolumeAttachmentSource) String() string {
|
||||||
}
|
}
|
||||||
s := strings.Join([]string{`&VolumeAttachmentSource{`,
|
s := strings.Join([]string{`&VolumeAttachmentSource{`,
|
||||||
`PersistentVolumeName:` + valueToStringGenerated(this.PersistentVolumeName) + `,`,
|
`PersistentVolumeName:` + valueToStringGenerated(this.PersistentVolumeName) + `,`,
|
||||||
|
`InlineVolumeSpec:` + strings.Replace(fmt.Sprintf("%v", this.InlineVolumeSpec), "PersistentVolumeSpec", "k8s_io_api_core_v1.PersistentVolumeSpec", 1) + `,`,
|
||||||
`}`,
|
`}`,
|
||||||
}, "")
|
}, "")
|
||||||
return s
|
return s
|
||||||
|
@ -1548,6 +1563,39 @@ func (m *VolumeAttachmentSource) Unmarshal(dAtA []byte) error {
|
||||||
s := string(dAtA[iNdEx:postIndex])
|
s := string(dAtA[iNdEx:postIndex])
|
||||||
m.PersistentVolumeName = &s
|
m.PersistentVolumeName = &s
|
||||||
iNdEx = postIndex
|
iNdEx = postIndex
|
||||||
|
case 2:
|
||||||
|
if wireType != 2 {
|
||||||
|
return fmt.Errorf("proto: wrong wireType = %d for field InlineVolumeSpec", wireType)
|
||||||
|
}
|
||||||
|
var msglen int
|
||||||
|
for shift := uint(0); ; shift += 7 {
|
||||||
|
if shift >= 64 {
|
||||||
|
return ErrIntOverflowGenerated
|
||||||
|
}
|
||||||
|
if iNdEx >= l {
|
||||||
|
return io.ErrUnexpectedEOF
|
||||||
|
}
|
||||||
|
b := dAtA[iNdEx]
|
||||||
|
iNdEx++
|
||||||
|
msglen |= (int(b) & 0x7F) << shift
|
||||||
|
if b < 0x80 {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if msglen < 0 {
|
||||||
|
return ErrInvalidLengthGenerated
|
||||||
|
}
|
||||||
|
postIndex := iNdEx + msglen
|
||||||
|
if postIndex > l {
|
||||||
|
return io.ErrUnexpectedEOF
|
||||||
|
}
|
||||||
|
if m.InlineVolumeSpec == nil {
|
||||||
|
m.InlineVolumeSpec = &k8s_io_api_core_v1.PersistentVolumeSpec{}
|
||||||
|
}
|
||||||
|
if err := m.InlineVolumeSpec.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
iNdEx = postIndex
|
||||||
default:
|
default:
|
||||||
iNdEx = preIndex
|
iNdEx = preIndex
|
||||||
skippy, err := skipGenerated(dAtA[iNdEx:])
|
skippy, err := skipGenerated(dAtA[iNdEx:])
|
||||||
|
@ -2180,67 +2228,69 @@ func init() {
|
||||||
}
|
}
|
||||||
|
|
||||||
var fileDescriptorGenerated = []byte{
|
var fileDescriptorGenerated = []byte{
|
||||||
// 984 bytes of a gzipped FileDescriptorProto
|
// 1018 bytes of a gzipped FileDescriptorProto
|
||||||
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x56, 0x3d, 0x6f, 0x23, 0x45,
|
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x56, 0x3d, 0x6f, 0x23, 0xc5,
|
||||||
0x18, 0xce, 0xc6, 0xf9, 0x70, 0xc6, 0x09, 0x97, 0x0c, 0x01, 0x8c, 0x0b, 0x3b, 0x32, 0x05, 0xe6,
|
0x1b, 0xcf, 0xc6, 0x79, 0x71, 0xc6, 0xc9, 0xff, 0x9c, 0xf9, 0x07, 0x30, 0x2e, 0xec, 0xc8, 0x14,
|
||||||
0xe0, 0x76, 0x2f, 0xe1, 0x40, 0x27, 0x24, 0x90, 0xbc, 0x60, 0x09, 0xa4, 0xf8, 0x2e, 0x9a, 0x84,
|
0x98, 0x83, 0xdb, 0xbd, 0x84, 0x03, 0x9d, 0x90, 0x40, 0xf2, 0x82, 0x25, 0x4e, 0x8a, 0xef, 0xa2,
|
||||||
0x13, 0x42, 0x14, 0x4c, 0x76, 0xdf, 0xdb, 0x2c, 0xf6, 0xee, 0x2c, 0x33, 0x63, 0x43, 0x3a, 0x2a,
|
0x49, 0x38, 0x21, 0x44, 0xc1, 0x64, 0xf7, 0x61, 0xb3, 0x67, 0xef, 0xce, 0x32, 0x33, 0x36, 0xa4,
|
||||||
0x3a, 0x24, 0x68, 0xf9, 0x29, 0x94, 0x54, 0xa1, 0xbb, 0xf2, 0x2a, 0x8b, 0x2c, 0x35, 0x7f, 0x20,
|
0xa3, 0xa2, 0x43, 0x82, 0x96, 0x8f, 0x42, 0x49, 0x15, 0xba, 0x13, 0xd5, 0x55, 0x16, 0x59, 0x6a,
|
||||||
0x15, 0x9a, 0xd9, 0x89, 0xbd, 0xb1, 0xd7, 0x9c, 0xd3, 0x5c, 0xe7, 0xf7, 0xe3, 0x79, 0xde, 0xef,
|
0xbe, 0x40, 0x2a, 0x34, 0xb3, 0x13, 0x7b, 0x63, 0x6f, 0xc0, 0x69, 0xae, 0xf3, 0xf3, 0xf2, 0xfb,
|
||||||
0x59, 0xa3, 0x4f, 0x7a, 0x0f, 0x85, 0x1d, 0x32, 0xa7, 0x37, 0x38, 0x05, 0x1e, 0x83, 0x04, 0xe1,
|
0x3d, 0xef, 0xb3, 0x46, 0x1f, 0xf5, 0x1f, 0x0a, 0x3b, 0x64, 0x4e, 0x7f, 0x78, 0x02, 0x3c, 0x06,
|
||||||
0x0c, 0x21, 0xf6, 0x19, 0x77, 0x8c, 0x81, 0x26, 0xa1, 0x23, 0x24, 0xe3, 0x34, 0x00, 0x67, 0xb8,
|
0x09, 0xc2, 0x19, 0x41, 0xec, 0x33, 0xee, 0x18, 0x03, 0x4d, 0x42, 0x47, 0x48, 0xc6, 0x69, 0x00,
|
||||||
0xef, 0x04, 0x10, 0x03, 0xa7, 0x12, 0x7c, 0x3b, 0xe1, 0x4c, 0x32, 0xfc, 0x5a, 0xe6, 0x66, 0xd3,
|
0xce, 0x68, 0xcf, 0x09, 0x20, 0x06, 0x4e, 0x25, 0xf8, 0x76, 0xc2, 0x99, 0x64, 0xf8, 0x95, 0xcc,
|
||||||
0x24, 0xb4, 0x8d, 0x9b, 0x3d, 0xdc, 0xaf, 0xdd, 0x0b, 0x42, 0x79, 0x36, 0x38, 0xb5, 0x3d, 0x16,
|
0xcd, 0xa6, 0x49, 0x68, 0x1b, 0x37, 0x7b, 0xb4, 0x57, 0xbf, 0x17, 0x84, 0xf2, 0x74, 0x78, 0x62,
|
||||||
0x39, 0x01, 0x0b, 0x98, 0xa3, 0xbd, 0x4f, 0x07, 0x4f, 0xb5, 0xa4, 0x05, 0xfd, 0x2b, 0x63, 0xa9,
|
0x7b, 0x2c, 0x72, 0x02, 0x16, 0x30, 0x47, 0x7b, 0x9f, 0x0c, 0xbf, 0xd6, 0x92, 0x16, 0xf4, 0xaf,
|
||||||
0x35, 0x73, 0xc1, 0x3c, 0xc6, 0x8b, 0x22, 0xd5, 0x1e, 0x4c, 0x7c, 0x22, 0xea, 0x9d, 0x85, 0x31,
|
0x8c, 0xa5, 0xde, 0xca, 0x05, 0xf3, 0x18, 0x2f, 0x8a, 0x54, 0x7f, 0x30, 0xf5, 0x89, 0xa8, 0x77,
|
||||||
0xf0, 0x73, 0x27, 0xe9, 0x05, 0x4a, 0x21, 0x9c, 0x08, 0x24, 0x2d, 0x42, 0x39, 0xf3, 0x50, 0x7c,
|
0x1a, 0xc6, 0xc0, 0xcf, 0x9c, 0xa4, 0x1f, 0x28, 0x85, 0x70, 0x22, 0x90, 0xb4, 0x08, 0xe5, 0xdc,
|
||||||
0x10, 0xcb, 0x30, 0x82, 0x19, 0xc0, 0x87, 0x2f, 0x02, 0x08, 0xef, 0x0c, 0x22, 0x3a, 0x8d, 0x6b,
|
0x84, 0xe2, 0xc3, 0x58, 0x86, 0x11, 0xcc, 0x01, 0xde, 0xff, 0x2f, 0x80, 0xf0, 0x4e, 0x21, 0xa2,
|
||||||
0xfe, 0xb2, 0x86, 0x36, 0x8f, 0xb3, 0x06, 0x7c, 0xda, 0xa7, 0x42, 0xe0, 0x6f, 0x51, 0x59, 0x25,
|
0xb3, 0xb8, 0xd6, 0x8f, 0x6b, 0x68, 0xf3, 0x28, 0x6b, 0xc0, 0xc7, 0x03, 0x2a, 0x04, 0xfe, 0x0a,
|
||||||
0xe5, 0x53, 0x49, 0xab, 0xd6, 0x9e, 0xd5, 0xaa, 0x1c, 0xdc, 0xb7, 0x27, 0xcd, 0x1a, 0x73, 0xdb,
|
0x95, 0x55, 0x52, 0x3e, 0x95, 0xb4, 0x66, 0xed, 0x5a, 0xed, 0xca, 0xfe, 0x7d, 0x7b, 0xda, 0xac,
|
||||||
0x49, 0x2f, 0x50, 0x0a, 0x61, 0x2b, 0x6f, 0x7b, 0xb8, 0x6f, 0x3f, 0x3e, 0xfd, 0x0e, 0x3c, 0xd9,
|
0x09, 0xb7, 0x9d, 0xf4, 0x03, 0xa5, 0x10, 0xb6, 0xf2, 0xb6, 0x47, 0x7b, 0xf6, 0x93, 0x93, 0x67,
|
||||||
0x05, 0x49, 0x5d, 0x7c, 0x31, 0x6a, 0x2c, 0xa5, 0xa3, 0x06, 0x9a, 0xe8, 0xc8, 0x98, 0x15, 0x7f,
|
0xe0, 0xc9, 0x1e, 0x48, 0xea, 0xe2, 0xf3, 0x71, 0x73, 0x29, 0x1d, 0x37, 0xd1, 0x54, 0x47, 0x26,
|
||||||
0x80, 0x2a, 0x09, 0x67, 0xc3, 0x50, 0x84, 0x2c, 0x06, 0x5e, 0x5d, 0xde, 0xb3, 0x5a, 0x1b, 0xee,
|
0xac, 0xf8, 0x3d, 0x54, 0x49, 0x38, 0x1b, 0x85, 0x22, 0x64, 0x31, 0xf0, 0xda, 0xf2, 0xae, 0xd5,
|
||||||
0xab, 0x06, 0x52, 0x39, 0x9a, 0x98, 0x48, 0xde, 0x0f, 0x07, 0x08, 0x25, 0x94, 0xd3, 0x08, 0x24,
|
0xde, 0x70, 0xff, 0x6f, 0x20, 0x95, 0xc3, 0xa9, 0x89, 0xe4, 0xfd, 0x70, 0x80, 0x50, 0x42, 0x39,
|
||||||
0x70, 0x51, 0x2d, 0xed, 0x95, 0x5a, 0x95, 0x83, 0xf7, 0xed, 0xc2, 0x39, 0xda, 0xf9, 0x8a, 0xec,
|
0x8d, 0x40, 0x02, 0x17, 0xb5, 0xd2, 0x6e, 0xa9, 0x5d, 0xd9, 0x7f, 0xd7, 0x2e, 0x9c, 0xa3, 0x9d,
|
||||||
0xa3, 0x31, 0xaa, 0x13, 0x4b, 0x7e, 0x3e, 0xc9, 0x6e, 0x62, 0x20, 0x39, 0x6a, 0xdc, 0x43, 0x5b,
|
0xaf, 0xc8, 0x3e, 0x9c, 0xa0, 0xba, 0xb1, 0xe4, 0x67, 0xd3, 0xec, 0xa6, 0x06, 0x92, 0xa3, 0xc6,
|
||||||
0x1c, 0xbc, 0x3e, 0x0d, 0xa3, 0x23, 0xd6, 0x0f, 0xbd, 0xf3, 0xea, 0x8a, 0xce, 0xb0, 0x93, 0x8e,
|
0x7d, 0xb4, 0xc5, 0xc1, 0x1b, 0xd0, 0x30, 0x3a, 0x64, 0x83, 0xd0, 0x3b, 0xab, 0xad, 0xe8, 0x0c,
|
||||||
0x1a, 0x5b, 0x24, 0x6f, 0xb8, 0x1a, 0x35, 0xee, 0xcf, 0x6e, 0x80, 0x7d, 0x04, 0x5c, 0x84, 0x42,
|
0xbb, 0xe9, 0xb8, 0xb9, 0x45, 0xf2, 0x86, 0xcb, 0x71, 0xf3, 0xfe, 0xfc, 0x06, 0xd8, 0x87, 0xc0,
|
||||||
0x42, 0x2c, 0x9f, 0xb0, 0xfe, 0x20, 0x82, 0x1b, 0x18, 0x72, 0x93, 0x1b, 0x3f, 0x40, 0x9b, 0x11,
|
0x45, 0x28, 0x24, 0xc4, 0xf2, 0x29, 0x1b, 0x0c, 0x23, 0xb8, 0x86, 0x21, 0xd7, 0xb9, 0xf1, 0x03,
|
||||||
0x1b, 0xc4, 0xf2, 0x71, 0x22, 0x43, 0x16, 0x8b, 0xea, 0xea, 0x5e, 0xa9, 0xb5, 0xe1, 0x6e, 0xa7,
|
0xb4, 0x19, 0xb1, 0x61, 0x2c, 0x9f, 0x24, 0x32, 0x64, 0xb1, 0xa8, 0xad, 0xee, 0x96, 0xda, 0x1b,
|
||||||
0xa3, 0xc6, 0x66, 0x37, 0xa7, 0x27, 0x37, 0xbc, 0xf0, 0x21, 0xda, 0xa5, 0xfd, 0x3e, 0xfb, 0x21,
|
0x6e, 0x35, 0x1d, 0x37, 0x37, 0x7b, 0x39, 0x3d, 0xb9, 0xe6, 0x85, 0x0f, 0xd0, 0x0e, 0x1d, 0x0c,
|
||||||
0x0b, 0xd0, 0xf9, 0x31, 0xa1, 0xb1, 0xea, 0x52, 0x75, 0x6d, 0xcf, 0x6a, 0x95, 0xdd, 0x6a, 0x3a,
|
0xd8, 0xb7, 0x59, 0x80, 0xee, 0x77, 0x09, 0x8d, 0x55, 0x97, 0x6a, 0x6b, 0xbb, 0x56, 0xbb, 0xec,
|
||||||
0x6a, 0xec, 0xb6, 0x0b, 0xec, 0xa4, 0x10, 0x85, 0xbf, 0x42, 0x3b, 0x43, 0xad, 0x72, 0xc3, 0xd8,
|
0xd6, 0xd2, 0x71, 0x73, 0xa7, 0x53, 0x60, 0x27, 0x85, 0x28, 0xfc, 0x39, 0xda, 0x1e, 0x69, 0x95,
|
||||||
0x0f, 0xe3, 0xa0, 0xcb, 0x7c, 0xa8, 0xae, 0xeb, 0xa2, 0xef, 0xa6, 0xa3, 0xc6, 0xce, 0x93, 0x69,
|
0x1b, 0xc6, 0x7e, 0x18, 0x07, 0x3d, 0xe6, 0x43, 0x6d, 0x5d, 0x17, 0x7d, 0x37, 0x1d, 0x37, 0xb7,
|
||||||
0xe3, 0x55, 0x91, 0x92, 0xcc, 0x92, 0xe0, 0xef, 0xd1, 0x8e, 0x8e, 0x08, 0xfe, 0x09, 0x4b, 0x58,
|
0x9f, 0xce, 0x1a, 0x2f, 0x8b, 0x94, 0x64, 0x9e, 0x04, 0x7f, 0x83, 0xb6, 0x75, 0x44, 0xf0, 0x8f,
|
||||||
0x9f, 0x05, 0x21, 0x88, 0x6a, 0x59, 0x8f, 0xae, 0x95, 0x1f, 0x9d, 0x6a, 0x9d, 0x9a, 0x9b, 0xf1,
|
0x59, 0xc2, 0x06, 0x2c, 0x08, 0x41, 0xd4, 0xca, 0x7a, 0x74, 0xed, 0xfc, 0xe8, 0x54, 0xeb, 0xd4,
|
||||||
0x3a, 0x3f, 0x86, 0x3e, 0x78, 0x92, 0xf1, 0x13, 0xe0, 0x91, 0xfb, 0xa6, 0x99, 0xd7, 0x4e, 0x7b,
|
0xdc, 0x8c, 0xd7, 0xd9, 0x11, 0x0c, 0xc0, 0x93, 0x8c, 0x1f, 0x03, 0x8f, 0xdc, 0xd7, 0xcd, 0xbc,
|
||||||
0x9a, 0x8a, 0xcc, 0xb2, 0xd7, 0x3e, 0x46, 0x77, 0xa6, 0x06, 0x8e, 0xb7, 0x51, 0xa9, 0x07, 0xe7,
|
0xb6, 0x3b, 0xb3, 0x54, 0x64, 0x9e, 0xbd, 0xfe, 0x21, 0xba, 0x33, 0x33, 0x70, 0x5c, 0x45, 0xa5,
|
||||||
0x7a, 0x9b, 0x37, 0x88, 0xfa, 0x89, 0x77, 0xd1, 0xea, 0x90, 0xf6, 0x07, 0x90, 0x2d, 0x1f, 0xc9,
|
0x3e, 0x9c, 0xe9, 0x6d, 0xde, 0x20, 0xea, 0x27, 0xde, 0x41, 0xab, 0x23, 0x3a, 0x18, 0x42, 0xb6,
|
||||||
0x84, 0x8f, 0x96, 0x1f, 0x5a, 0xcd, 0x3f, 0x2c, 0xb4, 0x9d, 0xdf, 0x9e, 0xc3, 0x50, 0x48, 0xfc,
|
0x7c, 0x24, 0x13, 0x3e, 0x58, 0x7e, 0x68, 0xb5, 0x7e, 0xb5, 0x50, 0x35, 0xbf, 0x3d, 0x07, 0xa1,
|
||||||
0xcd, 0xcc, 0x4d, 0xd8, 0x8b, 0xdd, 0x84, 0x42, 0xeb, 0x8b, 0xd8, 0x36, 0x35, 0x94, 0xaf, 0x35,
|
0x90, 0xf8, 0xcb, 0xb9, 0x9b, 0xb0, 0x17, 0xbb, 0x09, 0x85, 0xd6, 0x17, 0x51, 0x35, 0x35, 0x94,
|
||||||
0xb9, 0x7b, 0xf8, 0x1c, 0xad, 0x86, 0x12, 0x22, 0x51, 0x5d, 0xd6, 0x8d, 0x79, 0x6b, 0x81, 0x9d,
|
0xaf, 0x34, 0xb9, 0x7b, 0xf8, 0x14, 0xad, 0x86, 0x12, 0x22, 0x51, 0x5b, 0xd6, 0x8d, 0x79, 0x63,
|
||||||
0x76, 0xb7, 0x0c, 0xdf, 0xea, 0x17, 0x0a, 0x49, 0x32, 0x82, 0xe6, 0xef, 0xcb, 0x68, 0x3b, 0x9b,
|
0x81, 0x9d, 0x76, 0xb7, 0x0c, 0xdf, 0xea, 0x23, 0x85, 0x24, 0x19, 0x41, 0xeb, 0x97, 0x65, 0x54,
|
||||||
0x4b, 0x5b, 0x4a, 0xea, 0x9d, 0x45, 0x10, 0xcb, 0x97, 0x70, 0xd0, 0x5d, 0xb4, 0x22, 0x12, 0xf0,
|
0xcd, 0xe6, 0xd2, 0x91, 0x92, 0x7a, 0xa7, 0x11, 0xc4, 0xf2, 0x25, 0x1c, 0x74, 0x0f, 0xad, 0x88,
|
||||||
0x74, 0x33, 0x2b, 0x07, 0xef, 0xce, 0xc9, 0x7f, 0x3a, 0xb1, 0xe3, 0x04, 0x3c, 0x77, 0xd3, 0x10,
|
0x04, 0x3c, 0xdd, 0xcc, 0xca, 0xfe, 0xdb, 0x37, 0xe4, 0x3f, 0x9b, 0xd8, 0x51, 0x02, 0x9e, 0xbb,
|
||||||
0xaf, 0x28, 0x89, 0x68, 0x1a, 0xfc, 0x25, 0x5a, 0x13, 0x92, 0xca, 0x81, 0x3a, 0x72, 0x45, 0x78,
|
0x69, 0x88, 0x57, 0x94, 0x44, 0x34, 0x0d, 0xfe, 0x0c, 0xad, 0x09, 0x49, 0xe5, 0x50, 0x1d, 0xb9,
|
||||||
0x6f, 0x51, 0x42, 0x0d, 0x72, 0x5f, 0x31, 0x94, 0x6b, 0x99, 0x4c, 0x0c, 0x59, 0xf3, 0x4f, 0x0b,
|
0x22, 0xbc, 0xb7, 0x28, 0xa1, 0x06, 0xb9, 0xff, 0x33, 0x94, 0x6b, 0x99, 0x4c, 0x0c, 0x59, 0xeb,
|
||||||
0xed, 0x4e, 0x43, 0x5e, 0xc2, 0x74, 0x0f, 0x6f, 0x4e, 0xf7, 0xed, 0x05, 0x8b, 0x99, 0x33, 0xe1,
|
0x37, 0x0b, 0xed, 0xcc, 0x42, 0x5e, 0xc2, 0x74, 0x0f, 0xae, 0x4f, 0xf7, 0xcd, 0x05, 0x8b, 0xb9,
|
||||||
0xa7, 0xe8, 0xf5, 0x99, 0xb2, 0xd9, 0x80, 0x7b, 0xa0, 0x9e, 0x84, 0x64, 0xea, 0xe1, 0x79, 0x44,
|
0x61, 0xc2, 0x7f, 0x58, 0xe8, 0xd5, 0xb9, 0xba, 0xd9, 0x90, 0x7b, 0xa0, 0xde, 0x84, 0x64, 0xe6,
|
||||||
0x23, 0xc8, 0xb6, 0x3e, 0x7b, 0x12, 0x8e, 0x0a, 0xec, 0xa4, 0x10, 0xd5, 0xfc, 0xab, 0xa0, 0x59,
|
0xe5, 0x79, 0x4c, 0x23, 0xc8, 0xd6, 0x3e, 0x7b, 0x13, 0x0e, 0x0b, 0xec, 0xa4, 0x10, 0x85, 0x9f,
|
||||||
0x6a, 0x44, 0xf8, 0x3d, 0x54, 0xa6, 0x5a, 0x03, 0xdc, 0x50, 0x8f, 0x8b, 0x6f, 0x1b, 0x3d, 0x19,
|
0xa1, 0x6a, 0x18, 0x0f, 0xc2, 0x18, 0x32, 0xdd, 0xd1, 0x74, 0xbe, 0x85, 0x87, 0x3b, 0xcb, 0xac,
|
||||||
0x7b, 0xe8, 0x51, 0xea, 0xf4, 0xcc, 0x6e, 0x2c, 0x3c, 0x4a, 0x0d, 0xca, 0x8d, 0x52, 0xcb, 0xc4,
|
0x87, 0xbb, 0x93, 0x8e, 0x9b, 0xd5, 0x47, 0x33, 0x2c, 0x64, 0x8e, 0xb7, 0xf5, 0x7b, 0xc1, 0x64,
|
||||||
0x90, 0xa9, 0x24, 0x62, 0xe6, 0x67, 0xf5, 0x95, 0x6e, 0x26, 0xf1, 0xc8, 0xe8, 0xc9, 0xd8, 0xa3,
|
0x94, 0x01, 0xbf, 0x83, 0xca, 0x54, 0x6b, 0x80, 0x9b, 0x32, 0x26, 0x9d, 0xee, 0x18, 0x3d, 0x99,
|
||||||
0xf9, 0x6f, 0xa9, 0xa0, 0x69, 0x7a, 0x27, 0x72, 0xd5, 0xf8, 0xba, 0x9a, 0xf2, 0x4c, 0x35, 0xfe,
|
0x78, 0xe8, 0xbd, 0xd1, 0xad, 0x30, 0x89, 0x2e, 0xbc, 0x37, 0x1a, 0x94, 0xdb, 0x1b, 0x2d, 0x13,
|
||||||
0xb8, 0x1a, 0x1f, 0xff, 0x66, 0x21, 0x4c, 0xc7, 0x14, 0xdd, 0xeb, 0x9d, 0xc9, 0x06, 0xdb, 0xb9,
|
0x43, 0xa6, 0x92, 0x88, 0x99, 0x9f, 0xf5, 0xb2, 0x74, 0x3d, 0x89, 0xc7, 0x46, 0x4f, 0x26, 0x1e,
|
||||||
0xd5, 0x96, 0xda, 0xed, 0x19, 0x9e, 0xec, 0xe3, 0x54, 0x33, 0xf1, 0xf1, 0xac, 0x03, 0x29, 0x08,
|
0xad, 0xbf, 0x4b, 0x05, 0x03, 0xd2, 0x0b, 0x98, 0xab, 0xc6, 0xd7, 0xd5, 0x94, 0xe7, 0xaa, 0xf1,
|
||||||
0x8e, 0x7d, 0x54, 0xc9, 0xb4, 0x1d, 0xce, 0x19, 0x37, 0x17, 0xd3, 0xfc, 0xdf, 0x5c, 0xb4, 0xa7,
|
0x27, 0xd5, 0xf8, 0xf8, 0x67, 0x0b, 0x61, 0x3a, 0xa1, 0xe8, 0x5d, 0x2d, 0x68, 0xb6, 0x45, 0xdd,
|
||||||
0x5b, 0x57, 0x1f, 0xdb, 0xf6, 0x04, 0x7a, 0x35, 0x6a, 0x54, 0x72, 0x76, 0x92, 0xa7, 0x55, 0x51,
|
0x5b, 0x9d, 0x84, 0xdd, 0x99, 0xe3, 0xc9, 0xbe, 0x84, 0x75, 0x13, 0x1f, 0xcf, 0x3b, 0x90, 0x82,
|
||||||
0x7c, 0x98, 0x44, 0x59, 0xb9, 0x5d, 0x94, 0xcf, 0x60, 0x7e, 0x94, 0x1c, 0x6d, 0xad, 0x83, 0xde,
|
0xe0, 0xd8, 0x47, 0x95, 0x4c, 0xdb, 0xe5, 0x9c, 0x71, 0x73, 0x9e, 0xad, 0x7f, 0xcd, 0x45, 0x7b,
|
||||||
0x98, 0xd3, 0x96, 0x5b, 0x3d, 0xe1, 0x3f, 0x5b, 0x28, 0x1f, 0x03, 0x1f, 0xa2, 0x15, 0xf5, 0x0f,
|
0xba, 0x0d, 0xf5, 0x65, 0xef, 0x4c, 0xa1, 0x97, 0xe3, 0x66, 0x25, 0x67, 0x27, 0x79, 0x5a, 0x15,
|
||||||
0xc8, 0xdc, 0xf6, 0xdd, 0xc5, 0x6e, 0xfb, 0x24, 0x8c, 0x60, 0xf2, 0x3a, 0x29, 0x89, 0x68, 0x16,
|
0xc5, 0x87, 0x69, 0x94, 0x95, 0xdb, 0x45, 0xf9, 0x04, 0x6e, 0x8e, 0x92, 0xa3, 0xad, 0x77, 0xd1,
|
||||||
0xfc, 0x0e, 0x5a, 0x8f, 0x40, 0x08, 0x1a, 0x98, 0xc8, 0xee, 0x1d, 0xe3, 0xb4, 0xde, 0xcd, 0xd4,
|
0x6b, 0x37, 0xb4, 0xe5, 0x56, 0xdf, 0x8b, 0x1f, 0x2c, 0x94, 0x8f, 0x81, 0x0f, 0xd0, 0x8a, 0xfa,
|
||||||
0xe4, 0xda, 0xee, 0xb6, 0x2e, 0x2e, 0xeb, 0x4b, 0xcf, 0x2e, 0xeb, 0x4b, 0xcf, 0x2f, 0xeb, 0x4b,
|
0xbb, 0x65, 0x1e, 0x92, 0xbb, 0x8b, 0x3d, 0x24, 0xc7, 0x61, 0x04, 0xd3, 0xa7, 0x50, 0x49, 0x44,
|
||||||
0x3f, 0xa5, 0x75, 0xeb, 0x22, 0xad, 0x5b, 0xcf, 0xd2, 0xba, 0xf5, 0x3c, 0xad, 0x5b, 0x7f, 0xa7,
|
0xb3, 0xe0, 0xb7, 0xd0, 0x7a, 0x04, 0x42, 0xd0, 0xc0, 0x44, 0x76, 0xef, 0x18, 0xa7, 0xf5, 0x5e,
|
||||||
0x75, 0xeb, 0xd7, 0x7f, 0xea, 0x4b, 0x5f, 0x2f, 0x0f, 0xf7, 0xff, 0x0b, 0x00, 0x00, 0xff, 0xff,
|
0xa6, 0x26, 0x57, 0x76, 0xb7, 0x7d, 0x7e, 0xd1, 0x58, 0x7a, 0x7e, 0xd1, 0x58, 0x7a, 0x71, 0xd1,
|
||||||
0x85, 0x2a, 0x88, 0xc0, 0xcf, 0x0a, 0x00, 0x00,
|
0x58, 0xfa, 0x3e, 0x6d, 0x58, 0xe7, 0x69, 0xc3, 0x7a, 0x9e, 0x36, 0xac, 0x17, 0x69, 0xc3, 0xfa,
|
||||||
|
0x33, 0x6d, 0x58, 0x3f, 0xfd, 0xd5, 0x58, 0xfa, 0x62, 0x79, 0xb4, 0xf7, 0x4f, 0x00, 0x00, 0x00,
|
||||||
|
0xff, 0xff, 0xe2, 0xd4, 0x42, 0x3d, 0x3c, 0x0b, 0x00, 0x00,
|
||||||
}
|
}
|
||||||
|
|
|
@ -128,6 +128,15 @@ message VolumeAttachmentSource {
|
||||||
// Name of the persistent volume to attach.
|
// Name of the persistent volume to attach.
|
||||||
// +optional
|
// +optional
|
||||||
optional string persistentVolumeName = 1;
|
optional string persistentVolumeName = 1;
|
||||||
|
|
||||||
|
// inlineVolumeSpec contains all the information necessary to attach
|
||||||
|
// a persistent volume defined by a pod's inline VolumeSource. This field
|
||||||
|
// is populated only for the CSIMigration feature. It contains
|
||||||
|
// translated fields from a pod's inline VolumeSource to a
|
||||||
|
// PersistentVolumeSpec. This field is alpha-level and is only
|
||||||
|
// honored by servers that enabled the CSIMigration feature.
|
||||||
|
// +optional
|
||||||
|
optional k8s.io.api.core.v1.PersistentVolumeSpec inlineVolumeSpec = 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
// VolumeAttachmentSpec is the specification of a VolumeAttachment request.
|
// VolumeAttachmentSpec is the specification of a VolumeAttachment request.
|
||||||
|
|
|
@ -166,7 +166,14 @@ type VolumeAttachmentSource struct {
|
||||||
// +optional
|
// +optional
|
||||||
PersistentVolumeName *string `json:"persistentVolumeName,omitempty" protobuf:"bytes,1,opt,name=persistentVolumeName"`
|
PersistentVolumeName *string `json:"persistentVolumeName,omitempty" protobuf:"bytes,1,opt,name=persistentVolumeName"`
|
||||||
|
|
||||||
// Placeholder for *VolumeSource to accommodate inline volumes in pods.
|
// inlineVolumeSpec contains all the information necessary to attach
|
||||||
|
// a persistent volume defined by a pod's inline VolumeSource. This field
|
||||||
|
// is populated only for the CSIMigration feature. It contains
|
||||||
|
// translated fields from a pod's inline VolumeSource to a
|
||||||
|
// PersistentVolumeSpec. This field is alpha-level and is only
|
||||||
|
// honored by servers that enabled the CSIMigration feature.
|
||||||
|
// +optional
|
||||||
|
InlineVolumeSpec *v1.PersistentVolumeSpec `json:"inlineVolumeSpec,omitempty" protobuf:"bytes,2,opt,name=inlineVolumeSpec"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// VolumeAttachmentStatus is the status of a VolumeAttachment request.
|
// VolumeAttachmentStatus is the status of a VolumeAttachment request.
|
||||||
|
|
|
@ -187,6 +187,11 @@ func (in *VolumeAttachmentSource) DeepCopyInto(out *VolumeAttachmentSource) {
|
||||||
*out = new(string)
|
*out = new(string)
|
||||||
**out = **in
|
**out = **in
|
||||||
}
|
}
|
||||||
|
if in.InlineVolumeSpec != nil {
|
||||||
|
in, out := &in.InlineVolumeSpec, &out.InlineVolumeSpec
|
||||||
|
*out = new(corev1.PersistentVolumeSpec)
|
||||||
|
(*in).DeepCopyInto(*out)
|
||||||
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -14,6 +14,7 @@ go_library(
|
||||||
importpath = "k8s.io/api/storage/v1alpha1",
|
importpath = "k8s.io/api/storage/v1alpha1",
|
||||||
visibility = ["//visibility:public"],
|
visibility = ["//visibility:public"],
|
||||||
deps = [
|
deps = [
|
||||||
|
"//staging/src/k8s.io/api/core/v1:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library",
|
||||||
"//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library",
|
"//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library",
|
||||||
|
|
|
@ -37,6 +37,8 @@ import proto "github.com/gogo/protobuf/proto"
|
||||||
import fmt "fmt"
|
import fmt "fmt"
|
||||||
import math "math"
|
import math "math"
|
||||||
|
|
||||||
|
import k8s_io_api_core_v1 "k8s.io/api/core/v1"
|
||||||
|
|
||||||
import github_com_gogo_protobuf_sortkeys "github.com/gogo/protobuf/sortkeys"
|
import github_com_gogo_protobuf_sortkeys "github.com/gogo/protobuf/sortkeys"
|
||||||
|
|
||||||
import strings "strings"
|
import strings "strings"
|
||||||
|
@ -188,6 +190,16 @@ func (m *VolumeAttachmentSource) MarshalTo(dAtA []byte) (int, error) {
|
||||||
i = encodeVarintGenerated(dAtA, i, uint64(len(*m.PersistentVolumeName)))
|
i = encodeVarintGenerated(dAtA, i, uint64(len(*m.PersistentVolumeName)))
|
||||||
i += copy(dAtA[i:], *m.PersistentVolumeName)
|
i += copy(dAtA[i:], *m.PersistentVolumeName)
|
||||||
}
|
}
|
||||||
|
if m.InlineVolumeSpec != nil {
|
||||||
|
dAtA[i] = 0x12
|
||||||
|
i++
|
||||||
|
i = encodeVarintGenerated(dAtA, i, uint64(m.InlineVolumeSpec.Size()))
|
||||||
|
n5, err := m.InlineVolumeSpec.MarshalTo(dAtA[i:])
|
||||||
|
if err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
i += n5
|
||||||
|
}
|
||||||
return i, nil
|
return i, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -213,11 +225,11 @@ func (m *VolumeAttachmentSpec) MarshalTo(dAtA []byte) (int, error) {
|
||||||
dAtA[i] = 0x12
|
dAtA[i] = 0x12
|
||||||
i++
|
i++
|
||||||
i = encodeVarintGenerated(dAtA, i, uint64(m.Source.Size()))
|
i = encodeVarintGenerated(dAtA, i, uint64(m.Source.Size()))
|
||||||
n5, err := m.Source.MarshalTo(dAtA[i:])
|
n6, err := m.Source.MarshalTo(dAtA[i:])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, err
|
return 0, err
|
||||||
}
|
}
|
||||||
i += n5
|
i += n6
|
||||||
dAtA[i] = 0x1a
|
dAtA[i] = 0x1a
|
||||||
i++
|
i++
|
||||||
i = encodeVarintGenerated(dAtA, i, uint64(len(m.NodeName)))
|
i = encodeVarintGenerated(dAtA, i, uint64(len(m.NodeName)))
|
||||||
|
@ -274,21 +286,21 @@ func (m *VolumeAttachmentStatus) MarshalTo(dAtA []byte) (int, error) {
|
||||||
dAtA[i] = 0x1a
|
dAtA[i] = 0x1a
|
||||||
i++
|
i++
|
||||||
i = encodeVarintGenerated(dAtA, i, uint64(m.AttachError.Size()))
|
i = encodeVarintGenerated(dAtA, i, uint64(m.AttachError.Size()))
|
||||||
n6, err := m.AttachError.MarshalTo(dAtA[i:])
|
n7, err := m.AttachError.MarshalTo(dAtA[i:])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, err
|
return 0, err
|
||||||
}
|
}
|
||||||
i += n6
|
i += n7
|
||||||
}
|
}
|
||||||
if m.DetachError != nil {
|
if m.DetachError != nil {
|
||||||
dAtA[i] = 0x22
|
dAtA[i] = 0x22
|
||||||
i++
|
i++
|
||||||
i = encodeVarintGenerated(dAtA, i, uint64(m.DetachError.Size()))
|
i = encodeVarintGenerated(dAtA, i, uint64(m.DetachError.Size()))
|
||||||
n7, err := m.DetachError.MarshalTo(dAtA[i:])
|
n8, err := m.DetachError.MarshalTo(dAtA[i:])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, err
|
return 0, err
|
||||||
}
|
}
|
||||||
i += n7
|
i += n8
|
||||||
}
|
}
|
||||||
return i, nil
|
return i, nil
|
||||||
}
|
}
|
||||||
|
@ -311,11 +323,11 @@ func (m *VolumeError) MarshalTo(dAtA []byte) (int, error) {
|
||||||
dAtA[i] = 0xa
|
dAtA[i] = 0xa
|
||||||
i++
|
i++
|
||||||
i = encodeVarintGenerated(dAtA, i, uint64(m.Time.Size()))
|
i = encodeVarintGenerated(dAtA, i, uint64(m.Time.Size()))
|
||||||
n8, err := m.Time.MarshalTo(dAtA[i:])
|
n9, err := m.Time.MarshalTo(dAtA[i:])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, err
|
return 0, err
|
||||||
}
|
}
|
||||||
i += n8
|
i += n9
|
||||||
dAtA[i] = 0x12
|
dAtA[i] = 0x12
|
||||||
i++
|
i++
|
||||||
i = encodeVarintGenerated(dAtA, i, uint64(len(m.Message)))
|
i = encodeVarintGenerated(dAtA, i, uint64(len(m.Message)))
|
||||||
|
@ -365,6 +377,10 @@ func (m *VolumeAttachmentSource) Size() (n int) {
|
||||||
l = len(*m.PersistentVolumeName)
|
l = len(*m.PersistentVolumeName)
|
||||||
n += 1 + l + sovGenerated(uint64(l))
|
n += 1 + l + sovGenerated(uint64(l))
|
||||||
}
|
}
|
||||||
|
if m.InlineVolumeSpec != nil {
|
||||||
|
l = m.InlineVolumeSpec.Size()
|
||||||
|
n += 1 + l + sovGenerated(uint64(l))
|
||||||
|
}
|
||||||
return n
|
return n
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -455,6 +471,7 @@ func (this *VolumeAttachmentSource) String() string {
|
||||||
}
|
}
|
||||||
s := strings.Join([]string{`&VolumeAttachmentSource{`,
|
s := strings.Join([]string{`&VolumeAttachmentSource{`,
|
||||||
`PersistentVolumeName:` + valueToStringGenerated(this.PersistentVolumeName) + `,`,
|
`PersistentVolumeName:` + valueToStringGenerated(this.PersistentVolumeName) + `,`,
|
||||||
|
`InlineVolumeSpec:` + strings.Replace(fmt.Sprintf("%v", this.InlineVolumeSpec), "PersistentVolumeSpec", "k8s_io_api_core_v1.PersistentVolumeSpec", 1) + `,`,
|
||||||
`}`,
|
`}`,
|
||||||
}, "")
|
}, "")
|
||||||
return s
|
return s
|
||||||
|
@ -823,6 +840,39 @@ func (m *VolumeAttachmentSource) Unmarshal(dAtA []byte) error {
|
||||||
s := string(dAtA[iNdEx:postIndex])
|
s := string(dAtA[iNdEx:postIndex])
|
||||||
m.PersistentVolumeName = &s
|
m.PersistentVolumeName = &s
|
||||||
iNdEx = postIndex
|
iNdEx = postIndex
|
||||||
|
case 2:
|
||||||
|
if wireType != 2 {
|
||||||
|
return fmt.Errorf("proto: wrong wireType = %d for field InlineVolumeSpec", wireType)
|
||||||
|
}
|
||||||
|
var msglen int
|
||||||
|
for shift := uint(0); ; shift += 7 {
|
||||||
|
if shift >= 64 {
|
||||||
|
return ErrIntOverflowGenerated
|
||||||
|
}
|
||||||
|
if iNdEx >= l {
|
||||||
|
return io.ErrUnexpectedEOF
|
||||||
|
}
|
||||||
|
b := dAtA[iNdEx]
|
||||||
|
iNdEx++
|
||||||
|
msglen |= (int(b) & 0x7F) << shift
|
||||||
|
if b < 0x80 {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if msglen < 0 {
|
||||||
|
return ErrInvalidLengthGenerated
|
||||||
|
}
|
||||||
|
postIndex := iNdEx + msglen
|
||||||
|
if postIndex > l {
|
||||||
|
return io.ErrUnexpectedEOF
|
||||||
|
}
|
||||||
|
if m.InlineVolumeSpec == nil {
|
||||||
|
m.InlineVolumeSpec = &k8s_io_api_core_v1.PersistentVolumeSpec{}
|
||||||
|
}
|
||||||
|
if err := m.InlineVolumeSpec.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
iNdEx = postIndex
|
||||||
default:
|
default:
|
||||||
iNdEx = preIndex
|
iNdEx = preIndex
|
||||||
skippy, err := skipGenerated(dAtA[iNdEx:])
|
skippy, err := skipGenerated(dAtA[iNdEx:])
|
||||||
|
@ -1455,49 +1505,52 @@ func init() {
|
||||||
}
|
}
|
||||||
|
|
||||||
var fileDescriptorGenerated = []byte{
|
var fileDescriptorGenerated = []byte{
|
||||||
// 704 bytes of a gzipped FileDescriptorProto
|
// 745 bytes of a gzipped FileDescriptorProto
|
||||||
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x94, 0x4d, 0x6f, 0xd3, 0x4c,
|
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x94, 0xcd, 0x6e, 0xd3, 0x40,
|
||||||
0x10, 0xc7, 0xe3, 0x24, 0x6d, 0xd3, 0xcd, 0xf3, 0x52, 0xad, 0xa2, 0xe7, 0x89, 0x82, 0xe4, 0x54,
|
0x10, 0xc7, 0xe3, 0x24, 0x6d, 0xd3, 0x0d, 0x1f, 0xd1, 0x2a, 0x82, 0x28, 0x48, 0x4e, 0x95, 0x53,
|
||||||
0x39, 0x15, 0x44, 0xd7, 0xa4, 0x20, 0x54, 0x71, 0x8b, 0xd5, 0x1e, 0x10, 0x6d, 0x41, 0x5b, 0xc4,
|
0x40, 0x74, 0x4d, 0x0a, 0x42, 0x15, 0xb7, 0x58, 0xed, 0xa1, 0xa2, 0x2d, 0x68, 0x8b, 0x38, 0x00,
|
||||||
0x01, 0x38, 0xb0, 0xb1, 0xa7, 0x8e, 0x9b, 0xfa, 0x45, 0xbb, 0xeb, 0x48, 0xbd, 0x71, 0xe2, 0xcc,
|
0x07, 0x36, 0xf6, 0xe2, 0xb8, 0x89, 0x3f, 0xe4, 0x5d, 0x47, 0xea, 0x8d, 0x13, 0x67, 0x6e, 0xbc,
|
||||||
0x8d, 0x6f, 0xc0, 0x67, 0xc9, 0x8d, 0x1e, 0x7b, 0x8a, 0xa8, 0xf9, 0x16, 0x5c, 0x40, 0x5e, 0x6f,
|
0x01, 0xcf, 0x92, 0x1b, 0x15, 0xa7, 0x9e, 0x22, 0x6a, 0xde, 0x82, 0x0b, 0x68, 0xd7, 0x9b, 0xc4,
|
||||||
0x5e, 0x68, 0x52, 0x68, 0x7b, 0xf3, 0xcc, 0xce, 0xfc, 0x66, 0xe6, 0xbf, 0xb3, 0x46, 0x3b, 0xfd,
|
0x24, 0x29, 0xb4, 0xbd, 0x79, 0x66, 0x67, 0x7e, 0x33, 0xf3, 0xdf, 0xf1, 0x82, 0x9d, 0xfe, 0x36,
|
||||||
0x6d, 0x41, 0xfc, 0xc8, 0xea, 0x27, 0x5d, 0xe0, 0x21, 0x48, 0x10, 0xd6, 0x00, 0x42, 0x37, 0xe2,
|
0x43, 0x6e, 0x60, 0xf4, 0xe3, 0x2e, 0x8d, 0x7c, 0xca, 0x29, 0x33, 0x86, 0xd4, 0xb7, 0x83, 0xc8,
|
||||||
0x96, 0x3e, 0x60, 0xb1, 0x6f, 0x09, 0x19, 0x71, 0xe6, 0x81, 0x35, 0x68, 0xb3, 0x93, 0xb8, 0xc7,
|
0x50, 0x07, 0x24, 0x74, 0x0d, 0xc6, 0x83, 0x88, 0x38, 0xd4, 0x18, 0xb6, 0xc9, 0x20, 0xec, 0x91,
|
||||||
0xda, 0x96, 0x07, 0x21, 0x70, 0x26, 0xc1, 0x25, 0x31, 0x8f, 0x64, 0x84, 0xef, 0xe4, 0xc1, 0x84,
|
0xb6, 0xe1, 0x50, 0x9f, 0x46, 0x84, 0x53, 0x1b, 0x85, 0x51, 0xc0, 0x03, 0x78, 0x2f, 0x0d, 0x46,
|
||||||
0xc5, 0x3e, 0xd1, 0xc1, 0x64, 0x1c, 0xdc, 0xd8, 0xf4, 0x7c, 0xd9, 0x4b, 0xba, 0xc4, 0x89, 0x02,
|
0x24, 0x74, 0x91, 0x0a, 0x46, 0x93, 0xe0, 0xfa, 0xa6, 0xe3, 0xf2, 0x5e, 0xdc, 0x45, 0x56, 0xe0,
|
||||||
0xcb, 0x8b, 0xbc, 0xc8, 0x52, 0x39, 0xdd, 0xe4, 0x48, 0x59, 0xca, 0x50, 0x5f, 0x39, 0xab, 0xf1,
|
0x19, 0x4e, 0xe0, 0x04, 0x86, 0xcc, 0xe9, 0xc6, 0x1f, 0xa4, 0x25, 0x0d, 0xf9, 0x95, 0xb2, 0xea,
|
||||||
0x68, 0x5a, 0x38, 0x60, 0x4e, 0xcf, 0x0f, 0x81, 0x9f, 0x5a, 0x71, 0xdf, 0xcb, 0x1c, 0xc2, 0x0a,
|
0xcd, 0x4c, 0x61, 0x2b, 0x88, 0x44, 0xd5, 0xf9, 0x7a, 0xf5, 0x27, 0xb3, 0x18, 0x8f, 0x58, 0x3d,
|
||||||
0x40, 0x32, 0x6b, 0x30, 0xd7, 0x41, 0xc3, 0xba, 0x2a, 0x8b, 0x27, 0xa1, 0xf4, 0x03, 0x98, 0x4b,
|
0xd7, 0xa7, 0xd1, 0x89, 0x11, 0xf6, 0x1d, 0xe1, 0x60, 0x86, 0x47, 0x39, 0x59, 0x96, 0x65, 0x5c,
|
||||||
0x78, 0xfc, 0xa7, 0x04, 0xe1, 0xf4, 0x20, 0x60, 0x97, 0xf3, 0x5a, 0x9f, 0x8b, 0x68, 0xed, 0x55,
|
0x94, 0x15, 0xc5, 0x3e, 0x77, 0x3d, 0xba, 0x90, 0xf0, 0xf4, 0x7f, 0x09, 0xcc, 0xea, 0x51, 0x8f,
|
||||||
0x74, 0x92, 0x04, 0xd0, 0x91, 0x92, 0x39, 0xbd, 0x00, 0x42, 0x89, 0xdf, 0xa1, 0x4a, 0xd6, 0x98,
|
0xcc, 0xe7, 0x35, 0xbf, 0xe6, 0x41, 0xe5, 0x75, 0x30, 0x88, 0x3d, 0xda, 0xe1, 0x9c, 0x58, 0x3d,
|
||||||
0xcb, 0x24, 0xab, 0x1b, 0xeb, 0xc6, 0x46, 0x75, 0xeb, 0x01, 0x99, 0x4a, 0x32, 0xe1, 0x93, 0xb8,
|
0x8f, 0xfa, 0x1c, 0xbe, 0x07, 0x25, 0xd1, 0x98, 0x4d, 0x38, 0xa9, 0x69, 0x1b, 0x5a, 0xab, 0xbc,
|
||||||
0xef, 0x65, 0x0e, 0x41, 0xb2, 0x68, 0x32, 0x68, 0x93, 0xe7, 0xdd, 0x63, 0x70, 0xe4, 0x3e, 0x48,
|
0xf5, 0x08, 0xcd, 0x64, 0x9b, 0xf2, 0x51, 0xd8, 0x77, 0x84, 0x83, 0x21, 0x11, 0x8d, 0x86, 0x6d,
|
||||||
0x66, 0xe3, 0xe1, 0xa8, 0x59, 0x48, 0x47, 0x4d, 0x34, 0xf5, 0xd1, 0x09, 0x15, 0x1f, 0xa2, 0xb2,
|
0xf4, 0xa2, 0x7b, 0x4c, 0x2d, 0x7e, 0x40, 0x39, 0x31, 0xe1, 0x68, 0xdc, 0xc8, 0x25, 0xe3, 0x06,
|
||||||
0x88, 0xc1, 0xa9, 0x17, 0x15, 0xbd, 0x4d, 0x7e, 0x23, 0x38, 0xb9, 0xdc, 0xde, 0x61, 0x0c, 0x8e,
|
0x98, 0xf9, 0xf0, 0x94, 0x0a, 0x8f, 0x40, 0x91, 0x85, 0xd4, 0xaa, 0xe5, 0x25, 0xbd, 0x8d, 0xfe,
|
||||||
0xfd, 0x97, 0xc6, 0x97, 0x33, 0x8b, 0x2a, 0x18, 0x7e, 0x83, 0x96, 0x85, 0x64, 0x32, 0x11, 0xf5,
|
0x71, 0x29, 0x68, 0xbe, 0xbd, 0xa3, 0x90, 0x5a, 0xe6, 0x0d, 0x85, 0x2f, 0x0a, 0x0b, 0x4b, 0x18,
|
||||||
0x92, 0xc2, 0x3e, 0xbc, 0x19, 0x56, 0xa5, 0xda, 0xff, 0x68, 0xf0, 0x72, 0x6e, 0x53, 0x8d, 0x6c,
|
0x7c, 0x0b, 0x56, 0x19, 0x27, 0x3c, 0x66, 0xb5, 0x82, 0xc4, 0x3e, 0xbe, 0x1a, 0x56, 0xa6, 0x9a,
|
||||||
0x0d, 0x0d, 0x54, 0xbb, 0x9c, 0xb2, 0xe7, 0x0b, 0x89, 0xdf, 0xce, 0x89, 0x45, 0xae, 0x27, 0x56,
|
0xb7, 0x14, 0x78, 0x35, 0xb5, 0xb1, 0x42, 0x36, 0x47, 0x1a, 0xa8, 0xce, 0xa7, 0xec, 0xbb, 0x8c,
|
||||||
0x96, 0xad, 0xa4, 0x5a, 0xd3, 0x25, 0x2b, 0x63, 0xcf, 0x8c, 0x50, 0x14, 0x2d, 0xf9, 0x12, 0x02,
|
0xc3, 0x77, 0x0b, 0x62, 0xa1, 0xcb, 0x89, 0x25, 0xb2, 0xa5, 0x54, 0x15, 0x55, 0xb2, 0x34, 0xf1,
|
||||||
0x51, 0x2f, 0xae, 0x97, 0x36, 0xaa, 0x5b, 0x9b, 0x37, 0x1a, 0xc9, 0xfe, 0x5b, 0x93, 0x97, 0x9e,
|
0x64, 0x84, 0xc2, 0x60, 0xc5, 0xe5, 0xd4, 0x63, 0xb5, 0xfc, 0x46, 0xa1, 0x55, 0xde, 0xda, 0xbc,
|
||||||
0x66, 0x0c, 0x9a, 0xa3, 0x5a, 0x47, 0xe8, 0xbf, 0xb9, 0xe1, 0xa3, 0x84, 0x3b, 0x80, 0xf7, 0x50,
|
0xd2, 0x48, 0xe6, 0x4d, 0x45, 0x5e, 0xd9, 0x13, 0x0c, 0x9c, 0xa2, 0x9a, 0xdf, 0x35, 0x70, 0x67,
|
||||||
0x2d, 0x06, 0x2e, 0x7c, 0x21, 0x21, 0x94, 0x79, 0xcc, 0x01, 0x0b, 0x40, 0xcd, 0xb5, 0x6a, 0xd7,
|
0x61, 0xfa, 0x20, 0x8e, 0x2c, 0x0a, 0xf7, 0x41, 0x35, 0xa4, 0x11, 0x73, 0x19, 0xa7, 0x3e, 0x4f,
|
||||||
0xd3, 0x51, 0xb3, 0xf6, 0x62, 0xc1, 0x39, 0x5d, 0x98, 0xd5, 0xfa, 0xb2, 0x40, 0xb2, 0xec, 0xba,
|
0x63, 0x0e, 0x89, 0x47, 0xe5, 0x60, 0xeb, 0x66, 0x2d, 0x19, 0x37, 0xaa, 0x2f, 0x97, 0x9c, 0xe3,
|
||||||
0xf0, 0x7d, 0x54, 0x61, 0xca, 0x03, 0x5c, 0xa3, 0x27, 0x12, 0x74, 0xb4, 0x9f, 0x4e, 0x22, 0xd4,
|
0xa5, 0x59, 0xf0, 0x18, 0x54, 0x5c, 0x7f, 0xe0, 0xfa, 0x34, 0xf5, 0x1d, 0xcd, 0x6e, 0xbc, 0x95,
|
||||||
0xb5, 0xaa, 0xf6, 0xf4, 0xb6, 0xdc, 0xf0, 0x5a, 0x55, 0xea, 0xcc, 0xb5, 0x2a, 0x9b, 0x6a, 0x64,
|
0x9d, 0x43, 0xfc, 0x3a, 0x42, 0x90, 0x79, 0xb2, 0xbc, 0xe8, 0x6a, 0x32, 0x6e, 0x54, 0xf6, 0xe6,
|
||||||
0xd6, 0x4a, 0x18, 0xb9, 0xf9, 0x94, 0xa5, 0x5f, 0x5b, 0x39, 0xd0, 0x7e, 0x3a, 0x89, 0x68, 0xfd,
|
0x28, 0x78, 0x81, 0xdb, 0xfc, 0xb6, 0xe4, 0x7e, 0xc4, 0x01, 0x7c, 0x08, 0x4a, 0x44, 0x7a, 0x68,
|
||||||
0x28, 0x2d, 0x90, 0x4e, 0xed, 0xc7, 0xcc, 0x4c, 0xae, 0x9a, 0xa9, 0x32, 0x37, 0x93, 0x3b, 0x99,
|
0xa4, 0xc6, 0x98, 0xea, 0xdd, 0x51, 0x7e, 0x3c, 0x8d, 0x90, 0x3b, 0x24, 0xa5, 0x50, 0x8d, 0x5e,
|
||||||
0xc9, 0xc5, 0x9f, 0x0c, 0x84, 0xd9, 0x04, 0xb1, 0x3f, 0xde, 0x9f, 0xfc, 0x92, 0x9f, 0xdd, 0x62,
|
0x71, 0x87, 0x64, 0x6a, 0x66, 0x87, 0xa4, 0x8d, 0x15, 0x52, 0xb4, 0xe2, 0x07, 0x76, 0xaa, 0x68,
|
||||||
0x6f, 0x49, 0x67, 0x8e, 0xb6, 0x1b, 0x4a, 0x7e, 0x6a, 0x37, 0x74, 0x17, 0x78, 0x3e, 0x80, 0x2e,
|
0xe1, 0xef, 0x56, 0x0e, 0x95, 0x1f, 0x4f, 0x23, 0x9a, 0xbf, 0x0b, 0x4b, 0xae, 0x49, 0x2e, 0x63,
|
||||||
0x68, 0x01, 0x1f, 0xa3, 0x6a, 0xee, 0xdd, 0xe5, 0x3c, 0xe2, 0xfa, 0x25, 0x6d, 0x5c, 0xa3, 0x23,
|
0x66, 0x26, 0x5b, 0xce, 0x54, 0x5a, 0x98, 0xc9, 0x9e, 0xce, 0x64, 0xc3, 0x2f, 0x1a, 0x80, 0x64,
|
||||||
0x15, 0x6f, 0x9b, 0xe9, 0xa8, 0x59, 0xed, 0x4c, 0x01, 0xdf, 0x47, 0xcd, 0xea, 0xcc, 0x39, 0x9d,
|
0x8a, 0x38, 0x98, 0x2c, 0x6b, 0xba, 0x51, 0xcf, 0xaf, 0xf1, 0x93, 0xa0, 0xce, 0x02, 0x6d, 0xd7,
|
||||||
0x85, 0x67, 0xb5, 0x5c, 0x98, 0xd6, 0x2a, 0xdf, 0xa6, 0xd6, 0x0e, 0x5c, 0x5d, 0x6b, 0x06, 0xde,
|
0xe7, 0xd1, 0x89, 0x59, 0x57, 0x5d, 0xc0, 0xc5, 0x00, 0xbc, 0xa4, 0x05, 0x78, 0x0c, 0xca, 0xa9,
|
||||||
0xd8, 0x45, 0xff, 0x5f, 0x21, 0x11, 0x5e, 0x43, 0xa5, 0x3e, 0x9c, 0xe6, 0x9b, 0x48, 0xb3, 0x4f,
|
0x77, 0x37, 0x8a, 0x82, 0x48, 0xfd, 0xb6, 0xad, 0x4b, 0x74, 0x24, 0xe3, 0x4d, 0x3d, 0x19, 0x37,
|
||||||
0x5c, 0x43, 0x4b, 0x03, 0x76, 0x92, 0xe4, 0x1b, 0xb7, 0x4a, 0x73, 0xe3, 0x49, 0x71, 0xdb, 0x68,
|
0xca, 0x9d, 0x19, 0xe0, 0xd7, 0xb8, 0x51, 0xce, 0x9c, 0xe3, 0x2c, 0x5c, 0xd4, 0xb2, 0xe9, 0xac,
|
||||||
0x7d, 0x30, 0xd0, 0x6c, 0x0d, 0xbc, 0x87, 0xca, 0xd9, 0xef, 0x55, 0xbf, 0xfc, 0x7b, 0xd7, 0x7b,
|
0x56, 0xf1, 0x3a, 0xb5, 0x76, 0xe8, 0xc5, 0xb5, 0x32, 0xf0, 0xfa, 0x2e, 0xb8, 0x7b, 0x81, 0x44,
|
||||||
0xf9, 0x2f, 0xfd, 0x00, 0xa6, 0x7f, 0xb0, 0xcc, 0xa2, 0x8a, 0x82, 0xef, 0xa2, 0x95, 0x00, 0x84,
|
0xb0, 0x02, 0x0a, 0x7d, 0x7a, 0x92, 0x6e, 0x22, 0x16, 0x9f, 0xb0, 0x0a, 0x56, 0x86, 0x64, 0x10,
|
||||||
0x60, 0x9e, 0xae, 0x6c, 0xff, 0xab, 0x83, 0x56, 0xf6, 0x73, 0x37, 0x1d, 0x9f, 0xdb, 0x64, 0x78,
|
0xa7, 0x1b, 0xb7, 0x8e, 0x53, 0xe3, 0x59, 0x7e, 0x5b, 0x6b, 0x7e, 0xd2, 0x40, 0xb6, 0x06, 0xdc,
|
||||||
0x61, 0x16, 0xce, 0x2e, 0xcc, 0xc2, 0xf9, 0x85, 0x59, 0x78, 0x9f, 0x9a, 0xc6, 0x30, 0x35, 0x8d,
|
0x07, 0x45, 0xf1, 0x96, 0xab, 0x67, 0xe6, 0xc1, 0xe5, 0x9e, 0x99, 0x57, 0xae, 0x47, 0x67, 0xcf,
|
||||||
0xb3, 0xd4, 0x34, 0xce, 0x53, 0xd3, 0xf8, 0x9a, 0x9a, 0xc6, 0xc7, 0x6f, 0x66, 0xe1, 0x75, 0x65,
|
0xa5, 0xb0, 0xb0, 0xa4, 0xc0, 0xfb, 0x60, 0xcd, 0xa3, 0x8c, 0x11, 0x47, 0x55, 0x36, 0x6f, 0xab,
|
||||||
0x2c, 0xdc, 0xcf, 0x00, 0x00, 0x00, 0xff, 0xff, 0x42, 0xba, 0xdb, 0x12, 0x1a, 0x07, 0x00, 0x00,
|
0xa0, 0xb5, 0x83, 0xd4, 0x8d, 0x27, 0xe7, 0x26, 0x1a, 0x9d, 0xeb, 0xb9, 0xd3, 0x73, 0x3d, 0x77,
|
||||||
|
0x76, 0xae, 0xe7, 0x3e, 0x26, 0xba, 0x36, 0x4a, 0x74, 0xed, 0x34, 0xd1, 0xb5, 0xb3, 0x44, 0xd7,
|
||||||
|
0x7e, 0x24, 0xba, 0xf6, 0xf9, 0xa7, 0x9e, 0x7b, 0x53, 0x9a, 0x08, 0xf7, 0x27, 0x00, 0x00, 0xff,
|
||||||
|
0xff, 0xe8, 0x45, 0xe3, 0xba, 0xab, 0x07, 0x00, 0x00,
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,6 +21,7 @@ syntax = 'proto2';
|
||||||
|
|
||||||
package k8s.io.api.storage.v1alpha1;
|
package k8s.io.api.storage.v1alpha1;
|
||||||
|
|
||||||
|
import "k8s.io/api/core/v1/generated.proto";
|
||||||
import "k8s.io/apimachinery/pkg/apis/meta/v1/generated.proto";
|
import "k8s.io/apimachinery/pkg/apis/meta/v1/generated.proto";
|
||||||
import "k8s.io/apimachinery/pkg/runtime/generated.proto";
|
import "k8s.io/apimachinery/pkg/runtime/generated.proto";
|
||||||
import "k8s.io/apimachinery/pkg/runtime/schema/generated.proto";
|
import "k8s.io/apimachinery/pkg/runtime/schema/generated.proto";
|
||||||
|
@ -68,6 +69,15 @@ message VolumeAttachmentSource {
|
||||||
// Name of the persistent volume to attach.
|
// Name of the persistent volume to attach.
|
||||||
// +optional
|
// +optional
|
||||||
optional string persistentVolumeName = 1;
|
optional string persistentVolumeName = 1;
|
||||||
|
|
||||||
|
// inlineVolumeSpec contains all the information necessary to attach
|
||||||
|
// a persistent volume defined by a pod's inline VolumeSource. This field
|
||||||
|
// is populated only for the CSIMigration feature. It contains
|
||||||
|
// translated fields from a pod's inline VolumeSource to a
|
||||||
|
// PersistentVolumeSpec. This field is alpha-level and is only
|
||||||
|
// honored by servers that enabled the CSIMigration feature.
|
||||||
|
// +optional
|
||||||
|
optional k8s.io.api.core.v1.PersistentVolumeSpec inlineVolumeSpec = 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
// VolumeAttachmentSpec is the specification of a VolumeAttachment request.
|
// VolumeAttachmentSpec is the specification of a VolumeAttachment request.
|
||||||
|
|
|
@ -16,7 +16,10 @@ limitations under the License.
|
||||||
|
|
||||||
package v1alpha1
|
package v1alpha1
|
||||||
|
|
||||||
import metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
import (
|
||||||
|
"k8s.io/api/core/v1"
|
||||||
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
|
)
|
||||||
|
|
||||||
// +genclient
|
// +genclient
|
||||||
// +genclient:nonNamespaced
|
// +genclient:nonNamespaced
|
||||||
|
@ -81,7 +84,14 @@ type VolumeAttachmentSource struct {
|
||||||
// +optional
|
// +optional
|
||||||
PersistentVolumeName *string `json:"persistentVolumeName,omitempty" protobuf:"bytes,1,opt,name=persistentVolumeName"`
|
PersistentVolumeName *string `json:"persistentVolumeName,omitempty" protobuf:"bytes,1,opt,name=persistentVolumeName"`
|
||||||
|
|
||||||
// Placeholder for *VolumeSource to accommodate inline volumes in pods.
|
// inlineVolumeSpec contains all the information necessary to attach
|
||||||
|
// a persistent volume defined by a pod's inline VolumeSource. This field
|
||||||
|
// is populated only for the CSIMigration feature. It contains
|
||||||
|
// translated fields from a pod's inline VolumeSource to a
|
||||||
|
// PersistentVolumeSpec. This field is alpha-level and is only
|
||||||
|
// honored by servers that enabled the CSIMigration feature.
|
||||||
|
// +optional
|
||||||
|
InlineVolumeSpec *v1.PersistentVolumeSpec `json:"inlineVolumeSpec,omitempty" protobuf:"bytes,2,opt,name=inlineVolumeSpec"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// VolumeAttachmentStatus is the status of a VolumeAttachment request.
|
// VolumeAttachmentStatus is the status of a VolumeAttachment request.
|
||||||
|
|
|
@ -21,6 +21,7 @@ limitations under the License.
|
||||||
package v1alpha1
|
package v1alpha1
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
v1 "k8s.io/api/core/v1"
|
||||||
runtime "k8s.io/apimachinery/pkg/runtime"
|
runtime "k8s.io/apimachinery/pkg/runtime"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -93,6 +94,11 @@ func (in *VolumeAttachmentSource) DeepCopyInto(out *VolumeAttachmentSource) {
|
||||||
*out = new(string)
|
*out = new(string)
|
||||||
**out = **in
|
**out = **in
|
||||||
}
|
}
|
||||||
|
if in.InlineVolumeSpec != nil {
|
||||||
|
in, out := &in.InlineVolumeSpec, &out.InlineVolumeSpec
|
||||||
|
*out = new(v1.PersistentVolumeSpec)
|
||||||
|
(*in).DeepCopyInto(*out)
|
||||||
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -636,6 +636,16 @@ func (m *VolumeAttachmentSource) MarshalTo(dAtA []byte) (int, error) {
|
||||||
i = encodeVarintGenerated(dAtA, i, uint64(len(*m.PersistentVolumeName)))
|
i = encodeVarintGenerated(dAtA, i, uint64(len(*m.PersistentVolumeName)))
|
||||||
i += copy(dAtA[i:], *m.PersistentVolumeName)
|
i += copy(dAtA[i:], *m.PersistentVolumeName)
|
||||||
}
|
}
|
||||||
|
if m.InlineVolumeSpec != nil {
|
||||||
|
dAtA[i] = 0x12
|
||||||
|
i++
|
||||||
|
i = encodeVarintGenerated(dAtA, i, uint64(m.InlineVolumeSpec.Size()))
|
||||||
|
n13, err := m.InlineVolumeSpec.MarshalTo(dAtA[i:])
|
||||||
|
if err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
i += n13
|
||||||
|
}
|
||||||
return i, nil
|
return i, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -661,11 +671,11 @@ func (m *VolumeAttachmentSpec) MarshalTo(dAtA []byte) (int, error) {
|
||||||
dAtA[i] = 0x12
|
dAtA[i] = 0x12
|
||||||
i++
|
i++
|
||||||
i = encodeVarintGenerated(dAtA, i, uint64(m.Source.Size()))
|
i = encodeVarintGenerated(dAtA, i, uint64(m.Source.Size()))
|
||||||
n13, err := m.Source.MarshalTo(dAtA[i:])
|
n14, err := m.Source.MarshalTo(dAtA[i:])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, err
|
return 0, err
|
||||||
}
|
}
|
||||||
i += n13
|
i += n14
|
||||||
dAtA[i] = 0x1a
|
dAtA[i] = 0x1a
|
||||||
i++
|
i++
|
||||||
i = encodeVarintGenerated(dAtA, i, uint64(len(m.NodeName)))
|
i = encodeVarintGenerated(dAtA, i, uint64(len(m.NodeName)))
|
||||||
|
@ -722,21 +732,21 @@ func (m *VolumeAttachmentStatus) MarshalTo(dAtA []byte) (int, error) {
|
||||||
dAtA[i] = 0x1a
|
dAtA[i] = 0x1a
|
||||||
i++
|
i++
|
||||||
i = encodeVarintGenerated(dAtA, i, uint64(m.AttachError.Size()))
|
i = encodeVarintGenerated(dAtA, i, uint64(m.AttachError.Size()))
|
||||||
n14, err := m.AttachError.MarshalTo(dAtA[i:])
|
n15, err := m.AttachError.MarshalTo(dAtA[i:])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, err
|
return 0, err
|
||||||
}
|
}
|
||||||
i += n14
|
i += n15
|
||||||
}
|
}
|
||||||
if m.DetachError != nil {
|
if m.DetachError != nil {
|
||||||
dAtA[i] = 0x22
|
dAtA[i] = 0x22
|
||||||
i++
|
i++
|
||||||
i = encodeVarintGenerated(dAtA, i, uint64(m.DetachError.Size()))
|
i = encodeVarintGenerated(dAtA, i, uint64(m.DetachError.Size()))
|
||||||
n15, err := m.DetachError.MarshalTo(dAtA[i:])
|
n16, err := m.DetachError.MarshalTo(dAtA[i:])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, err
|
return 0, err
|
||||||
}
|
}
|
||||||
i += n15
|
i += n16
|
||||||
}
|
}
|
||||||
return i, nil
|
return i, nil
|
||||||
}
|
}
|
||||||
|
@ -759,11 +769,11 @@ func (m *VolumeError) MarshalTo(dAtA []byte) (int, error) {
|
||||||
dAtA[i] = 0xa
|
dAtA[i] = 0xa
|
||||||
i++
|
i++
|
||||||
i = encodeVarintGenerated(dAtA, i, uint64(m.Time.Size()))
|
i = encodeVarintGenerated(dAtA, i, uint64(m.Time.Size()))
|
||||||
n16, err := m.Time.MarshalTo(dAtA[i:])
|
n17, err := m.Time.MarshalTo(dAtA[i:])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, err
|
return 0, err
|
||||||
}
|
}
|
||||||
i += n16
|
i += n17
|
||||||
dAtA[i] = 0x12
|
dAtA[i] = 0x12
|
||||||
i++
|
i++
|
||||||
i = encodeVarintGenerated(dAtA, i, uint64(len(m.Message)))
|
i = encodeVarintGenerated(dAtA, i, uint64(len(m.Message)))
|
||||||
|
@ -956,6 +966,10 @@ func (m *VolumeAttachmentSource) Size() (n int) {
|
||||||
l = len(*m.PersistentVolumeName)
|
l = len(*m.PersistentVolumeName)
|
||||||
n += 1 + l + sovGenerated(uint64(l))
|
n += 1 + l + sovGenerated(uint64(l))
|
||||||
}
|
}
|
||||||
|
if m.InlineVolumeSpec != nil {
|
||||||
|
l = m.InlineVolumeSpec.Size()
|
||||||
|
n += 1 + l + sovGenerated(uint64(l))
|
||||||
|
}
|
||||||
return n
|
return n
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1161,6 +1175,7 @@ func (this *VolumeAttachmentSource) String() string {
|
||||||
}
|
}
|
||||||
s := strings.Join([]string{`&VolumeAttachmentSource{`,
|
s := strings.Join([]string{`&VolumeAttachmentSource{`,
|
||||||
`PersistentVolumeName:` + valueToStringGenerated(this.PersistentVolumeName) + `,`,
|
`PersistentVolumeName:` + valueToStringGenerated(this.PersistentVolumeName) + `,`,
|
||||||
|
`InlineVolumeSpec:` + strings.Replace(fmt.Sprintf("%v", this.InlineVolumeSpec), "PersistentVolumeSpec", "k8s_io_api_core_v1.PersistentVolumeSpec", 1) + `,`,
|
||||||
`}`,
|
`}`,
|
||||||
}, "")
|
}, "")
|
||||||
return s
|
return s
|
||||||
|
@ -2760,6 +2775,39 @@ func (m *VolumeAttachmentSource) Unmarshal(dAtA []byte) error {
|
||||||
s := string(dAtA[iNdEx:postIndex])
|
s := string(dAtA[iNdEx:postIndex])
|
||||||
m.PersistentVolumeName = &s
|
m.PersistentVolumeName = &s
|
||||||
iNdEx = postIndex
|
iNdEx = postIndex
|
||||||
|
case 2:
|
||||||
|
if wireType != 2 {
|
||||||
|
return fmt.Errorf("proto: wrong wireType = %d for field InlineVolumeSpec", wireType)
|
||||||
|
}
|
||||||
|
var msglen int
|
||||||
|
for shift := uint(0); ; shift += 7 {
|
||||||
|
if shift >= 64 {
|
||||||
|
return ErrIntOverflowGenerated
|
||||||
|
}
|
||||||
|
if iNdEx >= l {
|
||||||
|
return io.ErrUnexpectedEOF
|
||||||
|
}
|
||||||
|
b := dAtA[iNdEx]
|
||||||
|
iNdEx++
|
||||||
|
msglen |= (int(b) & 0x7F) << shift
|
||||||
|
if b < 0x80 {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if msglen < 0 {
|
||||||
|
return ErrInvalidLengthGenerated
|
||||||
|
}
|
||||||
|
postIndex := iNdEx + msglen
|
||||||
|
if postIndex > l {
|
||||||
|
return io.ErrUnexpectedEOF
|
||||||
|
}
|
||||||
|
if m.InlineVolumeSpec == nil {
|
||||||
|
m.InlineVolumeSpec = &k8s_io_api_core_v1.PersistentVolumeSpec{}
|
||||||
|
}
|
||||||
|
if err := m.InlineVolumeSpec.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
iNdEx = postIndex
|
||||||
default:
|
default:
|
||||||
iNdEx = preIndex
|
iNdEx = preIndex
|
||||||
skippy, err := skipGenerated(dAtA[iNdEx:])
|
skippy, err := skipGenerated(dAtA[iNdEx:])
|
||||||
|
@ -3392,81 +3440,83 @@ func init() {
|
||||||
}
|
}
|
||||||
|
|
||||||
var fileDescriptorGenerated = []byte{
|
var fileDescriptorGenerated = []byte{
|
||||||
// 1216 bytes of a gzipped FileDescriptorProto
|
// 1247 bytes of a gzipped FileDescriptorProto
|
||||||
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x57, 0x4f, 0x6f, 0x1b, 0x45,
|
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x57, 0x4d, 0x6f, 0x1b, 0x45,
|
||||||
0x14, 0xcf, 0xc6, 0x4e, 0x9c, 0x8c, 0x93, 0x36, 0x59, 0x22, 0x30, 0x3e, 0xd8, 0x91, 0x11, 0x34,
|
0x18, 0xce, 0xc6, 0xf9, 0x1c, 0x27, 0xad, 0x33, 0x44, 0x60, 0x7c, 0xb0, 0x23, 0x23, 0x68, 0x5a,
|
||||||
0xad, 0xda, 0x75, 0x1b, 0x15, 0x14, 0x55, 0xe2, 0x60, 0x27, 0x91, 0x70, 0x1b, 0x27, 0x66, 0x12,
|
0xb5, 0xeb, 0xb6, 0x2a, 0xa8, 0xaa, 0xc4, 0x21, 0x4e, 0x23, 0xe1, 0xb6, 0x4e, 0xc3, 0x24, 0xaa,
|
||||||
0x55, 0xa8, 0xe2, 0xc0, 0x64, 0xf7, 0xc5, 0x59, 0xec, 0xdd, 0xd9, 0xce, 0x8e, 0x0d, 0xbe, 0x71,
|
0x50, 0xc5, 0x81, 0xc9, 0xee, 0x5b, 0x67, 0x1b, 0xef, 0xce, 0x76, 0x76, 0x6c, 0xf0, 0x8d, 0x13,
|
||||||
0x82, 0x23, 0x88, 0x03, 0x9f, 0x80, 0xaf, 0x00, 0x12, 0x5c, 0x38, 0x92, 0x13, 0xea, 0xb1, 0x27,
|
0x1c, 0x41, 0x1c, 0xf8, 0x05, 0xfc, 0x05, 0x90, 0xe0, 0xc2, 0x91, 0x9e, 0x50, 0xc5, 0xa9, 0x27,
|
||||||
0x8b, 0x98, 0x6f, 0x11, 0x71, 0x40, 0x33, 0x3b, 0xf6, 0xee, 0xfa, 0x4f, 0xe3, 0x70, 0xf0, 0xcd,
|
0x8b, 0x2e, 0xff, 0xa2, 0xe2, 0x80, 0x66, 0x76, 0xec, 0xfd, 0xb0, 0xdd, 0x38, 0x1c, 0x7c, 0xf3,
|
||||||
0xf3, 0xde, 0xfb, 0xfd, 0xde, 0xdf, 0x79, 0xb3, 0x46, 0xbb, 0x8d, 0x1d, 0xdf, 0xb0, 0x69, 0xb1,
|
0xbc, 0x1f, 0xcf, 0xfb, 0xf5, 0xcc, 0x3b, 0x6b, 0xb4, 0x7b, 0x7a, 0x3b, 0x30, 0x1d, 0x56, 0x3b,
|
||||||
0xd1, 0x3a, 0x05, 0xe6, 0x02, 0x07, 0xbf, 0xd8, 0x06, 0xd7, 0xa2, 0xac, 0xa8, 0x14, 0xc4, 0xb3,
|
0xed, 0x1c, 0x03, 0xf7, 0x40, 0x40, 0x50, 0xeb, 0x82, 0x67, 0x33, 0x5e, 0xd3, 0x0a, 0xea, 0x3b,
|
||||||
0x8b, 0x3e, 0xa7, 0x8c, 0xd4, 0xa1, 0xd8, 0x7e, 0x74, 0x0a, 0x9c, 0x3c, 0x2a, 0xd6, 0xc1, 0x05,
|
0xb5, 0x40, 0x30, 0x4e, 0x5b, 0x50, 0xeb, 0xde, 0x38, 0x06, 0x41, 0x6f, 0xd4, 0x5a, 0xe0, 0x01,
|
||||||
0x46, 0x38, 0x58, 0x86, 0xc7, 0x28, 0xa7, 0x7a, 0x36, 0xb0, 0x35, 0x88, 0x67, 0x1b, 0xca, 0xd6,
|
0xa7, 0x02, 0x6c, 0xd3, 0xe7, 0x4c, 0x30, 0x5c, 0x8a, 0x6c, 0x4d, 0xea, 0x3b, 0xa6, 0xb6, 0x35,
|
||||||
0x50, 0xb6, 0xd9, 0x07, 0x75, 0x9b, 0x9f, 0xb7, 0x4e, 0x0d, 0x93, 0x3a, 0xc5, 0x3a, 0xad, 0xd3,
|
0xb5, 0x6d, 0xe9, 0x5a, 0xcb, 0x11, 0x27, 0x9d, 0x63, 0xd3, 0x62, 0x6e, 0xad, 0xc5, 0x5a, 0xac,
|
||||||
0xa2, 0x84, 0x9c, 0xb6, 0xce, 0xe4, 0x49, 0x1e, 0xe4, 0xaf, 0x80, 0x2a, 0x5b, 0x88, 0xb8, 0x35,
|
0xa6, 0x5c, 0x8e, 0x3b, 0x4f, 0xd4, 0x49, 0x1d, 0xd4, 0xaf, 0x08, 0xaa, 0x54, 0x4d, 0x84, 0xb5,
|
||||||
0x29, 0x13, 0x3e, 0x87, 0xdd, 0x65, 0x1f, 0x87, 0x36, 0x0e, 0x31, 0xcf, 0x6d, 0x17, 0x58, 0xa7,
|
0x18, 0x97, 0x31, 0xb3, 0xe1, 0x4a, 0xb7, 0x62, 0x1b, 0x97, 0x5a, 0x27, 0x8e, 0x07, 0xbc, 0x57,
|
||||||
0xe8, 0x35, 0xea, 0x42, 0xe0, 0x17, 0x1d, 0xe0, 0x64, 0x1c, 0xaa, 0x38, 0x09, 0xc5, 0x5a, 0x2e,
|
0xf3, 0x4f, 0x5b, 0x52, 0x10, 0xd4, 0x5c, 0x10, 0x74, 0x9c, 0x57, 0x6d, 0x92, 0x17, 0xef, 0x78,
|
||||||
0xb7, 0x1d, 0x18, 0x01, 0x7c, 0x74, 0x1d, 0xc0, 0x37, 0xcf, 0xc1, 0x21, 0xc3, 0xb8, 0xc2, 0xef,
|
0xc2, 0x71, 0x61, 0xc4, 0xe1, 0xa3, 0xb3, 0x1c, 0x02, 0xeb, 0x04, 0x5c, 0x9a, 0xf5, 0xab, 0xfe,
|
||||||
0x1a, 0x5a, 0xde, 0x3d, 0xae, 0xec, 0x31, 0xbb, 0x0d, 0x4c, 0xff, 0x02, 0x2d, 0x89, 0x88, 0x2c,
|
0x66, 0xa0, 0xd5, 0xdd, 0xc3, 0xc6, 0x5d, 0xee, 0x74, 0x81, 0xe3, 0x2f, 0xd0, 0x8a, 0xcc, 0xc8,
|
||||||
0xc2, 0x49, 0x46, 0xdb, 0xd4, 0xb6, 0xd2, 0xdb, 0x0f, 0x8d, 0xb0, 0x5c, 0x03, 0x62, 0xc3, 0x6b,
|
0xa6, 0x82, 0x16, 0x8d, 0x2d, 0x63, 0x3b, 0x7f, 0xf3, 0xba, 0x19, 0xb7, 0x6b, 0x08, 0x6c, 0xfa,
|
||||||
0xd4, 0x85, 0xc0, 0x37, 0x84, 0xb5, 0xd1, 0x7e, 0x64, 0x1c, 0x9d, 0x7e, 0x09, 0x26, 0xaf, 0x02,
|
0xa7, 0x2d, 0x29, 0x08, 0x4c, 0x69, 0x6d, 0x76, 0x6f, 0x98, 0x0f, 0x8f, 0x9f, 0x82, 0x25, 0x9a,
|
||||||
0x27, 0x65, 0xfd, 0xa2, 0x9b, 0x9f, 0xeb, 0x75, 0xf3, 0x28, 0x94, 0xe1, 0x01, 0xab, 0xfe, 0x0c,
|
0x20, 0x68, 0x1d, 0x3f, 0xef, 0x57, 0xe6, 0xc2, 0x7e, 0x05, 0xc5, 0x32, 0x32, 0x44, 0xc5, 0xf7,
|
||||||
0x25, 0x7d, 0x0f, 0xcc, 0xcc, 0xbc, 0x64, 0xbf, 0x6b, 0x4c, 0x6e, 0x86, 0x31, 0x08, 0xeb, 0xd8,
|
0xd1, 0x42, 0xe0, 0x83, 0x55, 0x9c, 0x57, 0xe8, 0x97, 0xcd, 0xc9, 0xc3, 0x30, 0x87, 0x69, 0x1d,
|
||||||
0x03, 0xb3, 0xbc, 0xa2, 0x68, 0x93, 0xe2, 0x84, 0x25, 0x49, 0xe1, 0x37, 0x0d, 0xad, 0x0e, 0xac,
|
0xfa, 0x60, 0xd5, 0xd7, 0x34, 0xec, 0x82, 0x3c, 0x11, 0x05, 0x52, 0xfd, 0xd5, 0x40, 0xeb, 0x43,
|
||||||
0x0e, 0x6c, 0x9f, 0xeb, 0x9f, 0x8f, 0x24, 0x60, 0x4c, 0x97, 0x80, 0x40, 0xcb, 0xf0, 0xd7, 0x94,
|
0xab, 0x07, 0x4e, 0x20, 0xf0, 0xe7, 0x23, 0x05, 0x98, 0xd3, 0x15, 0x20, 0xbd, 0x55, 0xfa, 0x05,
|
||||||
0x9f, 0xa5, 0xbe, 0x24, 0x12, 0xfc, 0x53, 0xb4, 0x60, 0x73, 0x70, 0xfc, 0xcc, 0xfc, 0x66, 0x62,
|
0x1d, 0x67, 0x65, 0x20, 0x49, 0x24, 0x7f, 0x0f, 0x2d, 0x3a, 0x02, 0xdc, 0xa0, 0x38, 0xbf, 0x95,
|
||||||
0x2b, 0xbd, 0xfd, 0xfe, 0x54, 0xd1, 0x97, 0x57, 0x15, 0xe3, 0x42, 0x45, 0x60, 0x71, 0x40, 0x51,
|
0xdb, 0xce, 0xdf, 0x7c, 0x7f, 0xaa, 0xec, 0xeb, 0xeb, 0x1a, 0x71, 0xb1, 0x21, 0x7d, 0x49, 0x04,
|
||||||
0xf8, 0x2e, 0x1a, 0xbb, 0xc8, 0x49, 0x7f, 0x82, 0x6e, 0x11, 0xce, 0x89, 0x79, 0x8e, 0xe1, 0x65,
|
0x51, 0xfd, 0x36, 0x99, 0xbb, 0xac, 0x09, 0xdf, 0x41, 0x17, 0xa8, 0x10, 0xd4, 0x3a, 0x21, 0xf0,
|
||||||
0xcb, 0x66, 0x60, 0xc9, 0x0c, 0x96, 0xca, 0x7a, 0xaf, 0x9b, 0xbf, 0x55, 0x8a, 0x69, 0xf0, 0x90,
|
0xac, 0xe3, 0x70, 0xb0, 0x55, 0x05, 0x2b, 0x75, 0x1c, 0xf6, 0x2b, 0x17, 0x76, 0x52, 0x1a, 0x92,
|
||||||
0xa5, 0xc0, 0x7a, 0xd4, 0xaa, 0xb8, 0x67, 0xf4, 0xc8, 0xad, 0xd2, 0x96, 0xcb, 0x65, 0x81, 0x15,
|
0xb1, 0x94, 0xbe, 0x3e, 0xb3, 0x1b, 0xde, 0x13, 0xf6, 0xd0, 0x6b, 0xb2, 0x8e, 0x27, 0x54, 0x83,
|
||||||
0xb6, 0x16, 0xd3, 0xe0, 0x21, 0xcb, 0xc2, 0xaf, 0x1a, 0x4a, 0xed, 0x1e, 0x57, 0x0e, 0xa9, 0x05,
|
0xb5, 0xef, 0x41, 0x4a, 0x43, 0x32, 0x96, 0xd5, 0x5f, 0x0c, 0xb4, 0xbc, 0x7b, 0xd8, 0xd8, 0x67,
|
||||||
0x33, 0x18, 0x80, 0x4a, 0x6c, 0x00, 0xee, 0x5c, 0x53, 0x42, 0x11, 0xd4, 0xc4, 0xf6, 0x7f, 0x1f,
|
0x36, 0xcc, 0x80, 0x00, 0x8d, 0x14, 0x01, 0x2e, 0x9d, 0xd1, 0x42, 0x99, 0xd4, 0xc4, 0xf1, 0x7f,
|
||||||
0x94, 0x50, 0xd8, 0xa8, 0xf9, 0xdd, 0x44, 0x49, 0x97, 0x38, 0x20, 0x43, 0x5f, 0x0e, 0x31, 0x87,
|
0x17, 0xb5, 0x50, 0xda, 0x68, 0xfe, 0x6e, 0xa1, 0x05, 0x8f, 0xba, 0xa0, 0x52, 0x5f, 0x8d, 0x7d,
|
||||||
0xc4, 0x01, 0x2c, 0x35, 0xfa, 0x07, 0x68, 0xd1, 0xa5, 0x16, 0x54, 0xf6, 0x64, 0x00, 0xcb, 0xe5,
|
0xf6, 0xa9, 0x0b, 0x44, 0x69, 0xf0, 0x07, 0x68, 0xc9, 0x63, 0x36, 0x34, 0xee, 0xaa, 0x04, 0x56,
|
||||||
0x5b, 0xca, 0x66, 0xf1, 0x50, 0x4a, 0xb1, 0xd2, 0xea, 0x8f, 0xd1, 0x0a, 0xa7, 0x1e, 0x6d, 0xd2,
|
0xeb, 0x17, 0xb4, 0xcd, 0xd2, 0xbe, 0x92, 0x12, 0xad, 0xc5, 0xb7, 0xd0, 0x9a, 0x60, 0x3e, 0x6b,
|
||||||
0x7a, 0xe7, 0x19, 0x74, 0xfc, 0x4c, 0x62, 0x33, 0xb1, 0xb5, 0x5c, 0x5e, 0xeb, 0x75, 0xf3, 0x2b,
|
0xb3, 0x56, 0xef, 0x3e, 0xf4, 0x82, 0x62, 0x6e, 0x2b, 0xb7, 0xbd, 0x5a, 0x2f, 0x84, 0xfd, 0xca,
|
||||||
0x27, 0x11, 0x39, 0x8e, 0x59, 0x15, 0x7e, 0xd1, 0x50, 0x5a, 0x45, 0x34, 0x83, 0x71, 0xfc, 0x24,
|
0xda, 0x51, 0x42, 0x4e, 0x52, 0x56, 0xd5, 0x9f, 0x0d, 0x94, 0xd7, 0x19, 0xcd, 0x80, 0x8e, 0x9f,
|
||||||
0x3e, 0x8e, 0xef, 0x4d, 0x51, 0xcb, 0x09, 0xc3, 0x68, 0x0e, 0xc2, 0x96, 0x93, 0x78, 0x82, 0x52,
|
0xa4, 0xe9, 0xf8, 0xde, 0x14, 0xbd, 0x9c, 0x40, 0x46, 0x6b, 0x98, 0xb6, 0x62, 0xe2, 0x11, 0x5a,
|
||||||
0x96, 0x2c, 0xa8, 0x9f, 0xd1, 0x24, 0xf5, 0xdd, 0x29, 0xa8, 0xd5, 0xb4, 0xdf, 0x56, 0x0e, 0x52,
|
0xb6, 0x55, 0x43, 0x83, 0xa2, 0xa1, 0xa0, 0x2f, 0x4f, 0x01, 0xad, 0xd9, 0x7e, 0x51, 0x07, 0x58,
|
||||||
0xc1, 0xd9, 0xc7, 0x7d, 0xaa, 0xc2, 0x8f, 0x8b, 0x68, 0xe5, 0x38, 0xc0, 0xee, 0x36, 0x89, 0xef,
|
0x8e, 0xce, 0x01, 0x19, 0x40, 0x55, 0x7f, 0x58, 0x42, 0x6b, 0x87, 0x91, 0xef, 0x6e, 0x9b, 0x06,
|
||||||
0xcf, 0x60, 0xd8, 0x3e, 0x44, 0x69, 0x8f, 0xd1, 0xb6, 0xed, 0xdb, 0xd4, 0x05, 0xa6, 0x5a, 0xfe,
|
0xc1, 0x0c, 0xc8, 0xf6, 0x21, 0xca, 0xfb, 0x9c, 0x75, 0x9d, 0xc0, 0x61, 0x1e, 0x70, 0x3d, 0xf2,
|
||||||
0x96, 0x82, 0xa4, 0x6b, 0xa1, 0x0a, 0x47, 0xed, 0xf4, 0x26, 0x42, 0x1e, 0x61, 0xc4, 0x01, 0x2e,
|
0xb7, 0xb4, 0x4b, 0xfe, 0x20, 0x56, 0x91, 0xa4, 0x1d, 0x6e, 0x23, 0xe4, 0x53, 0x4e, 0x5d, 0x10,
|
||||||
0x4a, 0x90, 0x90, 0x25, 0xd8, 0x79, 0x53, 0x09, 0xa2, 0x69, 0x19, 0xb5, 0x01, 0x74, 0xdf, 0xe5,
|
0xb2, 0x05, 0x39, 0xd5, 0x82, 0xdb, 0x6f, 0x6a, 0x41, 0xb2, 0x2c, 0xf3, 0x60, 0xe8, 0xba, 0xe7,
|
||||||
0xac, 0x13, 0x86, 0x18, 0x2a, 0x70, 0x84, 0x5f, 0x6f, 0xa0, 0x55, 0x06, 0x66, 0x93, 0xd8, 0x4e,
|
0x09, 0xde, 0x8b, 0x53, 0x8c, 0x15, 0x24, 0x81, 0x8f, 0x4f, 0xd1, 0x3a, 0x07, 0xab, 0x4d, 0x1d,
|
||||||
0x8d, 0x36, 0x6d, 0xb3, 0x93, 0x49, 0xca, 0x30, 0xf7, 0x7b, 0xdd, 0xfc, 0x2a, 0x8e, 0x2a, 0xae,
|
0xf7, 0x80, 0xb5, 0x1d, 0xab, 0x57, 0x5c, 0x50, 0x69, 0xee, 0x85, 0xfd, 0xca, 0x3a, 0x49, 0x2a,
|
||||||
0xba, 0xf9, 0x87, 0xa3, 0x2f, 0x8e, 0x51, 0x03, 0xe6, 0xdb, 0x3e, 0x07, 0x97, 0x3f, 0xa7, 0xcd,
|
0x5e, 0xf7, 0x2b, 0xd7, 0x47, 0x5f, 0x1c, 0xf3, 0x00, 0x78, 0xe0, 0x04, 0x02, 0x3c, 0xf1, 0x88,
|
||||||
0x96, 0x03, 0x31, 0x0c, 0x8e, 0x73, 0x8b, 0xb9, 0x76, 0xc4, 0xad, 0x3f, 0xf2, 0xb8, 0x4d, 0x5d,
|
0xb5, 0x3b, 0x2e, 0xa4, 0x7c, 0x48, 0x1a, 0x5b, 0xf2, 0xda, 0x95, 0xb7, 0xfe, 0xa1, 0x2f, 0x1c,
|
||||||
0x3f, 0xb3, 0x10, 0xce, 0x75, 0x35, 0x22, 0xc7, 0x31, 0x2b, 0xfd, 0x00, 0x6d, 0x90, 0x66, 0x93,
|
0xe6, 0x05, 0xc5, 0xc5, 0x98, 0xd7, 0xcd, 0x84, 0x9c, 0xa4, 0xac, 0xf0, 0x03, 0xb4, 0x49, 0xdb,
|
||||||
0x7e, 0x15, 0x38, 0xd8, 0xff, 0xda, 0x23, 0xae, 0x28, 0x55, 0x66, 0x51, 0x2e, 0x99, 0x4c, 0xaf,
|
0x6d, 0xf6, 0x65, 0x14, 0x60, 0xef, 0x2b, 0x9f, 0x7a, 0xb2, 0x55, 0xc5, 0x25, 0xb5, 0x64, 0x8a,
|
||||||
0x9b, 0xdf, 0x28, 0x8d, 0xd1, 0xe3, 0xb1, 0x28, 0xfd, 0x33, 0xb4, 0xde, 0x96, 0xa2, 0xb2, 0xed,
|
0x61, 0xbf, 0xb2, 0xb9, 0x33, 0x46, 0x4f, 0xc6, 0x7a, 0xe1, 0xcf, 0xd0, 0x46, 0x57, 0x89, 0xea,
|
||||||
0x5a, 0xb6, 0x5b, 0xaf, 0x52, 0x0b, 0x32, 0x29, 0x99, 0xf4, 0xbd, 0x5e, 0x37, 0xbf, 0xfe, 0x7c,
|
0x8e, 0x67, 0x3b, 0x5e, 0xab, 0xc9, 0x6c, 0x28, 0x2e, 0xab, 0xa2, 0xaf, 0x84, 0xfd, 0xca, 0xc6,
|
||||||
0x58, 0x79, 0x35, 0x4e, 0x88, 0x47, 0x49, 0xf4, 0x97, 0x68, 0x5d, 0x7a, 0x04, 0x4b, 0x5d, 0x52,
|
0xa3, 0xac, 0xf2, 0xf5, 0x38, 0x21, 0x19, 0x05, 0xc1, 0xcf, 0xd0, 0x86, 0x8a, 0x08, 0xb6, 0xbe,
|
||||||
0x1b, 0xfc, 0xcc, 0x92, 0xec, 0xdf, 0x56, 0xb4, 0x7f, 0xa2, 0x74, 0x62, 0x90, 0xfa, 0x57, 0xf9,
|
0xa4, 0x0e, 0x04, 0xc5, 0x15, 0x35, 0xbf, 0xed, 0xe4, 0xfc, 0x64, 0xeb, 0x24, 0x91, 0x06, 0x57,
|
||||||
0x18, 0x9a, 0x60, 0x72, 0xca, 0x4e, 0x80, 0x39, 0xe5, 0x77, 0x55, 0xbf, 0xd6, 0x4b, 0xc3, 0x54,
|
0xf9, 0x10, 0xda, 0x60, 0x09, 0xc6, 0x8f, 0x80, 0xbb, 0xf5, 0x77, 0xf5, 0xbc, 0x36, 0x76, 0xb2,
|
||||||
0x78, 0x94, 0x3d, 0xfb, 0x31, 0xba, 0x3d, 0xd4, 0x70, 0x7d, 0x0d, 0x25, 0x1a, 0xd0, 0x09, 0x96,
|
0x50, 0x64, 0x14, 0xbd, 0xf4, 0x31, 0xba, 0x98, 0x19, 0x38, 0x2e, 0xa0, 0xdc, 0x29, 0xf4, 0xa2,
|
||||||
0x10, 0x16, 0x3f, 0xf5, 0x0d, 0xb4, 0xd0, 0x26, 0xcd, 0x16, 0x04, 0x13, 0x88, 0x83, 0xc3, 0x93,
|
0x25, 0x44, 0xe4, 0x4f, 0xbc, 0x89, 0x16, 0xbb, 0xb4, 0xdd, 0x81, 0x88, 0x81, 0x24, 0x3a, 0xdc,
|
||||||
0xf9, 0x1d, 0xad, 0xf0, 0x87, 0x86, 0xd6, 0xa2, 0xd3, 0x33, 0x83, 0xb5, 0x51, 0x8d, 0xaf, 0x8d,
|
0x99, 0xbf, 0x6d, 0x54, 0x7f, 0x37, 0x50, 0x21, 0xc9, 0x9e, 0x19, 0xac, 0x8d, 0x66, 0x7a, 0x6d,
|
||||||
0xad, 0x69, 0x07, 0x7b, 0xc2, 0xee, 0xf8, 0x79, 0x1e, 0xad, 0x05, 0xcd, 0x09, 0xde, 0x28, 0x07,
|
0x6c, 0x4f, 0x4b, 0xec, 0x09, 0xbb, 0xe3, 0xa7, 0x79, 0x54, 0x88, 0x86, 0x13, 0xbd, 0x51, 0x2e,
|
||||||
0x5c, 0x3e, 0x83, 0xab, 0x8d, 0x63, 0xef, 0xc8, 0xc3, 0x37, 0x25, 0x31, 0x1c, 0xdd, 0xa4, 0x07,
|
0x78, 0x62, 0x06, 0x57, 0x9b, 0xa4, 0xde, 0x91, 0xeb, 0x6f, 0x2a, 0x22, 0x9b, 0xdd, 0xa4, 0x07,
|
||||||
0x45, 0x7f, 0x81, 0x16, 0x7d, 0x4e, 0x78, 0x4b, 0xdc, 0x79, 0xc1, 0xba, 0x7d, 0x23, 0x56, 0x89,
|
0x05, 0x3f, 0x46, 0x4b, 0x81, 0xa0, 0xa2, 0x23, 0xef, 0xbc, 0x44, 0xbd, 0x79, 0x2e, 0x54, 0xe5,
|
||||||
0x0c, 0x1f, 0x94, 0xe0, 0x8c, 0x15, 0x63, 0xe1, 0x4f, 0x0d, 0x6d, 0x0c, 0x43, 0x66, 0xd0, 0xec,
|
0x19, 0x3f, 0x28, 0xd1, 0x99, 0x68, 0xc4, 0xea, 0x1f, 0x06, 0xda, 0xcc, 0xba, 0xcc, 0x60, 0xd8,
|
||||||
0x4f, 0xe3, 0xcd, 0xbe, 0x7f, 0x93, 0x8c, 0x26, 0x34, 0xfc, 0x0c, 0xbd, 0x3d, 0x92, 0x3b, 0x6d,
|
0x9f, 0xa6, 0x87, 0x7d, 0xf5, 0x3c, 0x15, 0x4d, 0x18, 0xf8, 0x5f, 0x06, 0x7a, 0x7b, 0xa4, 0x78,
|
||||||
0x31, 0x13, 0xc4, 0x9a, 0xf0, 0x86, 0x96, 0xd1, 0x61, 0xf8, 0x1c, 0xcb, 0x35, 0x51, 0x1b, 0xa3,
|
0xd6, 0xe1, 0x16, 0xc8, 0x3d, 0xe1, 0x67, 0xb6, 0xd1, 0x7e, 0xfc, 0x1e, 0xab, 0x3d, 0x71, 0x30,
|
||||||
0xc7, 0x63, 0x51, 0x85, 0xbf, 0xc6, 0x54, 0x4c, 0x3e, 0x4f, 0xf7, 0xd1, 0x52, 0xf0, 0xf9, 0x03,
|
0x46, 0x4f, 0xc6, 0x7a, 0xe1, 0xa7, 0xa8, 0xe0, 0x78, 0x6d, 0xc7, 0x83, 0x48, 0x76, 0x18, 0x8f,
|
||||||
0x4c, 0x51, 0x0f, 0x2a, 0x50, 0x52, 0x72, 0x3c, 0xb0, 0x90, 0x4d, 0x95, 0xe1, 0xa9, 0x51, 0xb9,
|
0x7b, 0xec, 0x65, 0xce, 0x22, 0xab, 0x31, 0x6f, 0x86, 0xfd, 0x4a, 0xa1, 0x91, 0x41, 0x21, 0x23,
|
||||||
0x59, 0x53, 0x25, 0x32, 0xd2, 0x54, 0x79, 0xc6, 0x8a, 0x51, 0x44, 0x22, 0xbe, 0x17, 0x64, 0x92,
|
0xb8, 0xd5, 0x3f, 0xc7, 0x8c, 0x47, 0xbd, 0x85, 0x57, 0xd1, 0x4a, 0xf4, 0xad, 0x05, 0x5c, 0x97,
|
||||||
0x89, 0x78, 0x24, 0x87, 0x4a, 0x8e, 0x07, 0x16, 0x85, 0x7f, 0x13, 0x63, 0x2a, 0x27, 0xa7, 0x23,
|
0x31, 0x6c, 0xf7, 0x8e, 0x96, 0x93, 0xa1, 0x85, 0x62, 0x90, 0x6a, 0x85, 0x4e, 0xf4, 0x7c, 0x0c,
|
||||||
0x92, 0x52, 0xff, 0xab, 0x6f, 0x38, 0x25, 0x6b, 0x90, 0x92, 0xa5, 0xff, 0xa4, 0x21, 0x9d, 0x0c,
|
0x52, 0x9e, 0x09, 0x06, 0xa9, 0x33, 0xd1, 0x88, 0x32, 0x13, 0xf9, 0x71, 0xa2, 0x1a, 0x9a, 0x4b,
|
||||||
0x28, 0xaa, 0xfd, 0xe9, 0x09, 0x5a, 0xfc, 0xf4, 0xe6, 0x43, 0x6b, 0x94, 0x46, 0xc8, 0x82, 0xa7,
|
0x67, 0xb2, 0xaf, 0xe5, 0x64, 0x68, 0x51, 0xfd, 0x37, 0x37, 0x66, 0x4a, 0x8a, 0x8a, 0x89, 0x92,
|
||||||
0x2b, 0xab, 0x82, 0xd0, 0x47, 0x0d, 0xf0, 0x98, 0x08, 0x74, 0x1b, 0xa5, 0x03, 0xe9, 0x3e, 0x63,
|
0x06, 0x9f, 0x98, 0xd9, 0x92, 0xec, 0x61, 0x49, 0x36, 0xfe, 0xd1, 0x40, 0x98, 0x0e, 0x21, 0x9a,
|
||||||
0x94, 0xa9, 0x5b, 0x74, 0xe7, 0xfa, 0x80, 0xa4, 0x79, 0x39, 0x27, 0x1e, 0xe5, 0x52, 0x88, 0xbf,
|
0x03, 0xaa, 0x46, 0x7c, 0xba, 0x77, 0xfe, 0x1b, 0x62, 0xee, 0x8c, 0x80, 0x45, 0xef, 0x64, 0x49,
|
||||||
0xea, 0xe6, 0xd3, 0x11, 0x3d, 0x8e, 0x72, 0x0b, 0x57, 0x16, 0x84, 0xae, 0x92, 0xff, 0xc3, 0xd5,
|
0x27, 0x81, 0x47, 0x0d, 0xc8, 0x98, 0x0c, 0xb0, 0x83, 0xf2, 0x91, 0x74, 0x8f, 0x73, 0xc6, 0xf5,
|
||||||
0x1e, 0x4c, 0x76, 0x15, 0xe1, 0xce, 0xee, 0xa3, 0x77, 0x26, 0x14, 0xe8, 0x46, 0xab, 0xfe, 0x5b,
|
0x95, 0xbd, 0x74, 0x76, 0x42, 0xca, 0xbc, 0x5e, 0x96, 0x5f, 0x00, 0x3b, 0xb1, 0xff, 0xeb, 0x7e,
|
||||||
0x0d, 0x45, 0x7d, 0xe8, 0x07, 0x28, 0x29, 0xfe, 0x99, 0xa9, 0x4b, 0x7f, 0x6f, 0xba, 0x4b, 0x7f,
|
0x25, 0x9f, 0xd0, 0x93, 0x24, 0xb6, 0x0c, 0x65, 0x43, 0x1c, 0x6a, 0xe1, 0x7f, 0x84, 0xba, 0x0b,
|
||||||
0x62, 0x3b, 0x10, 0xee, 0x2e, 0x71, 0xc2, 0x92, 0x45, 0xbf, 0x8b, 0x52, 0x0e, 0xf8, 0x3e, 0xa9,
|
0x93, 0x43, 0x25, 0xb0, 0x4b, 0x7b, 0xe8, 0x9d, 0x09, 0x0d, 0x3a, 0xd7, 0xbb, 0xf2, 0x8d, 0x81,
|
||||||
0x2b, 0xcf, 0xe1, 0x87, 0x58, 0x35, 0x10, 0xe3, 0xbe, 0xbe, 0xfc, 0xe0, 0xe2, 0x32, 0x37, 0xf7,
|
0x92, 0x31, 0xf0, 0x03, 0xb4, 0x20, 0xff, 0x06, 0xea, 0x0d, 0x73, 0x65, 0xba, 0x0d, 0x73, 0xe4,
|
||||||
0xea, 0x32, 0x37, 0xf7, 0xfa, 0x32, 0x37, 0xf7, 0x4d, 0x2f, 0xa7, 0x5d, 0xf4, 0x72, 0xda, 0xab,
|
0xb8, 0x10, 0x2f, 0x4a, 0x79, 0x22, 0x0a, 0x05, 0x5f, 0x46, 0xcb, 0x2e, 0x04, 0x01, 0x6d, 0xe9,
|
||||||
0x5e, 0x4e, 0x7b, 0xdd, 0xcb, 0x69, 0x7f, 0xf7, 0x72, 0xda, 0x0f, 0xff, 0xe4, 0xe6, 0x5e, 0xa4,
|
0xc8, 0xf1, 0x57, 0x5f, 0x33, 0x12, 0x93, 0x81, 0xbe, 0x7e, 0xed, 0xf9, 0xab, 0xf2, 0xdc, 0x8b,
|
||||||
0x54, 0xdd, 0xfe, 0x0b, 0x00, 0x00, 0xff, 0xff, 0x78, 0xdc, 0x5e, 0x79, 0x76, 0x0f, 0x00, 0x00,
|
0x57, 0xe5, 0xb9, 0x97, 0xaf, 0xca, 0x73, 0x5f, 0x87, 0x65, 0xe3, 0x79, 0x58, 0x36, 0x5e, 0x84,
|
||||||
|
0x65, 0xe3, 0x65, 0x58, 0x36, 0xfe, 0x0e, 0xcb, 0xc6, 0xf7, 0xff, 0x94, 0xe7, 0x1e, 0x2f, 0xeb,
|
||||||
|
0xbe, 0xfd, 0x17, 0x00, 0x00, 0xff, 0xff, 0xf9, 0xfc, 0xf7, 0xf5, 0xe3, 0x0f, 0x00, 0x00,
|
||||||
}
|
}
|
||||||
|
|
|
@ -265,6 +265,15 @@ message VolumeAttachmentSource {
|
||||||
// Name of the persistent volume to attach.
|
// Name of the persistent volume to attach.
|
||||||
// +optional
|
// +optional
|
||||||
optional string persistentVolumeName = 1;
|
optional string persistentVolumeName = 1;
|
||||||
|
|
||||||
|
// inlineVolumeSpec contains all the information necessary to attach
|
||||||
|
// a persistent volume defined by a pod's inline VolumeSource. This field
|
||||||
|
// is populated only for the CSIMigration feature. It contains
|
||||||
|
// translated fields from a pod's inline VolumeSource to a
|
||||||
|
// PersistentVolumeSpec. This field is alpha-level and is only
|
||||||
|
// honored by servers that enabled the CSIMigration feature.
|
||||||
|
// +optional
|
||||||
|
optional k8s.io.api.core.v1.PersistentVolumeSpec inlineVolumeSpec = 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
// VolumeAttachmentSpec is the specification of a VolumeAttachment request.
|
// VolumeAttachmentSpec is the specification of a VolumeAttachment request.
|
||||||
|
|
|
@ -166,7 +166,14 @@ type VolumeAttachmentSource struct {
|
||||||
// +optional
|
// +optional
|
||||||
PersistentVolumeName *string `json:"persistentVolumeName,omitempty" protobuf:"bytes,1,opt,name=persistentVolumeName"`
|
PersistentVolumeName *string `json:"persistentVolumeName,omitempty" protobuf:"bytes,1,opt,name=persistentVolumeName"`
|
||||||
|
|
||||||
// Placeholder for *VolumeSource to accommodate inline volumes in pods.
|
// inlineVolumeSpec contains all the information necessary to attach
|
||||||
|
// a persistent volume defined by a pod's inline VolumeSource. This field
|
||||||
|
// is populated only for the CSIMigration feature. It contains
|
||||||
|
// translated fields from a pod's inline VolumeSource to a
|
||||||
|
// PersistentVolumeSpec. This field is alpha-level and is only
|
||||||
|
// honored by servers that enabled the CSIMigration feature.
|
||||||
|
// +optional
|
||||||
|
InlineVolumeSpec *v1.PersistentVolumeSpec `json:"inlineVolumeSpec,omitempty" protobuf:"bytes,2,opt,name=inlineVolumeSpec"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// VolumeAttachmentStatus is the status of a VolumeAttachment request.
|
// VolumeAttachmentStatus is the status of a VolumeAttachment request.
|
||||||
|
|
|
@ -377,6 +377,11 @@ func (in *VolumeAttachmentSource) DeepCopyInto(out *VolumeAttachmentSource) {
|
||||||
*out = new(string)
|
*out = new(string)
|
||||||
**out = **in
|
**out = **in
|
||||||
}
|
}
|
||||||
|
if in.InlineVolumeSpec != nil {
|
||||||
|
in, out := &in.InlineVolumeSpec, &out.InlineVolumeSpec
|
||||||
|
*out = new(v1.PersistentVolumeSpec)
|
||||||
|
(*in).DeepCopyInto(*out)
|
||||||
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -49,6 +49,32 @@ func (t *awsElasticBlockStoreCSITranslator) TranslateInTreeStorageClassToCSI(sc
|
||||||
return sc, nil
|
return sc, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TranslateInTreeInlineVolumeToCSI takes a Volume with AWSElasticBlockStore set from in-tree
|
||||||
|
// and converts the AWSElasticBlockStore source to a CSIPersistentVolumeSource
|
||||||
|
func (t *awsElasticBlockStoreCSITranslator) TranslateInTreeInlineVolumeToCSI(volume *v1.Volume) (*v1.PersistentVolume, error) {
|
||||||
|
if volume == nil || volume.AWSElasticBlockStore == nil {
|
||||||
|
return nil, fmt.Errorf("volume is nil or AWS EBS not defined on volume")
|
||||||
|
}
|
||||||
|
ebsSource := volume.AWSElasticBlockStore
|
||||||
|
pv := &v1.PersistentVolume{
|
||||||
|
Spec: v1.PersistentVolumeSpec{
|
||||||
|
PersistentVolumeSource: v1.PersistentVolumeSource{
|
||||||
|
CSI: &v1.CSIPersistentVolumeSource{
|
||||||
|
Driver: AWSEBSDriverName,
|
||||||
|
VolumeHandle: ebsSource.VolumeID,
|
||||||
|
ReadOnly: ebsSource.ReadOnly,
|
||||||
|
FSType: ebsSource.FSType,
|
||||||
|
VolumeAttributes: map[string]string{
|
||||||
|
"partition": strconv.FormatInt(int64(ebsSource.Partition), 10),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
AccessModes: []v1.PersistentVolumeAccessMode{v1.ReadWriteOnce},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
return pv, nil
|
||||||
|
}
|
||||||
|
|
||||||
// TranslateInTreePVToCSI takes a PV with AWSElasticBlockStore set from in-tree
|
// TranslateInTreePVToCSI takes a PV with AWSElasticBlockStore set from in-tree
|
||||||
// and converts the AWSElasticBlockStore source to a CSIPersistentVolumeSource
|
// and converts the AWSElasticBlockStore source to a CSIPersistentVolumeSource
|
||||||
func (t *awsElasticBlockStoreCSITranslator) TranslateInTreePVToCSI(pv *v1.PersistentVolume) (*v1.PersistentVolume, error) {
|
func (t *awsElasticBlockStoreCSITranslator) TranslateInTreePVToCSI(pv *v1.PersistentVolume) (*v1.PersistentVolume, error) {
|
||||||
|
@ -106,13 +132,20 @@ func (t *awsElasticBlockStoreCSITranslator) TranslateCSIPVToInTree(pv *v1.Persis
|
||||||
return pv, nil
|
return pv, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// CanSupport tests whether the plugin supports a given volume
|
// CanSupport tests whether the plugin supports a given persistent volume
|
||||||
// specification from the API. The spec pointer should be considered
|
// specification from the API. The spec pointer should be considered
|
||||||
// const.
|
// const.
|
||||||
func (t *awsElasticBlockStoreCSITranslator) CanSupport(pv *v1.PersistentVolume) bool {
|
func (t *awsElasticBlockStoreCSITranslator) CanSupport(pv *v1.PersistentVolume) bool {
|
||||||
return pv != nil && pv.Spec.AWSElasticBlockStore != nil
|
return pv != nil && pv.Spec.AWSElasticBlockStore != nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// CanSupportInline tests whether the plugin supports a given inline volume
|
||||||
|
// specification from the API. The spec pointer should be considered
|
||||||
|
// const.
|
||||||
|
func (t *awsElasticBlockStoreCSITranslator) CanSupportInline(volume *v1.Volume) bool {
|
||||||
|
return volume != nil && volume.AWSElasticBlockStore != nil
|
||||||
|
}
|
||||||
|
|
||||||
// GetInTreePluginName returns the name of the intree plugin driver
|
// GetInTreePluginName returns the name of the intree plugin driver
|
||||||
func (t *awsElasticBlockStoreCSITranslator) GetInTreePluginName() string {
|
func (t *awsElasticBlockStoreCSITranslator) GetInTreePluginName() string {
|
||||||
return AWSEBSInTreePluginName
|
return AWSEBSInTreePluginName
|
||||||
|
|
|
@ -58,6 +58,39 @@ func (t *azureDiskCSITranslator) TranslateInTreeStorageClassToCSI(sc *storage.St
|
||||||
return sc, nil
|
return sc, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TranslateInTreeInlineVolumeToCSI takes a Volume with AzureDisk set from in-tree
|
||||||
|
// and converts the AzureDisk source to a CSIPersistentVolumeSource
|
||||||
|
func (t *azureDiskCSITranslator) TranslateInTreeInlineVolumeToCSI(volume *v1.Volume) (*v1.PersistentVolume, error) {
|
||||||
|
if volume == nil || volume.AzureDisk == nil {
|
||||||
|
return nil, fmt.Errorf("volume is nil or Azure Disk not defined on volume")
|
||||||
|
}
|
||||||
|
|
||||||
|
azureSource := volume.AzureDisk
|
||||||
|
pv := &v1.PersistentVolume{
|
||||||
|
Spec: v1.PersistentVolumeSpec{
|
||||||
|
PersistentVolumeSource: v1.PersistentVolumeSource{
|
||||||
|
CSI: &v1.CSIPersistentVolumeSource{
|
||||||
|
Driver: AzureDiskDriverName,
|
||||||
|
VolumeHandle: azureSource.DataDiskURI,
|
||||||
|
ReadOnly: *azureSource.ReadOnly,
|
||||||
|
FSType: *azureSource.FSType,
|
||||||
|
VolumeAttributes: map[string]string{},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
AccessModes: []v1.PersistentVolumeAccessMode{v1.ReadWriteOnce},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
if *azureSource.CachingMode != "" {
|
||||||
|
pv.Spec.PersistentVolumeSource.CSI.VolumeAttributes[azureDiskCachingMode] = string(*azureSource.CachingMode)
|
||||||
|
}
|
||||||
|
if *azureSource.FSType != "" {
|
||||||
|
pv.Spec.PersistentVolumeSource.CSI.VolumeAttributes[azureDiskFSType] = *azureSource.FSType
|
||||||
|
}
|
||||||
|
|
||||||
|
return pv, nil
|
||||||
|
}
|
||||||
|
|
||||||
// TranslateInTreePVToCSI takes a PV with AzureDisk set from in-tree
|
// TranslateInTreePVToCSI takes a PV with AzureDisk set from in-tree
|
||||||
// and converts the AzureDisk source to a CSIPersistentVolumeSource
|
// and converts the AzureDisk source to a CSIPersistentVolumeSource
|
||||||
func (t *azureDiskCSITranslator) TranslateInTreePVToCSI(pv *v1.PersistentVolume) (*v1.PersistentVolume, error) {
|
func (t *azureDiskCSITranslator) TranslateInTreePVToCSI(pv *v1.PersistentVolume) (*v1.PersistentVolume, error) {
|
||||||
|
@ -137,6 +170,13 @@ func (t *azureDiskCSITranslator) CanSupport(pv *v1.PersistentVolume) bool {
|
||||||
return pv != nil && pv.Spec.AzureDisk != nil
|
return pv != nil && pv.Spec.AzureDisk != nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// CanSupportInline tests whether the plugin supports a given inline volume
|
||||||
|
// specification from the API. The spec pointer should be considered
|
||||||
|
// const.
|
||||||
|
func (t *azureDiskCSITranslator) CanSupportInline(volume *v1.Volume) bool {
|
||||||
|
return volume != nil && volume.AzureDisk != nil
|
||||||
|
}
|
||||||
|
|
||||||
// GetInTreePluginName returns the name of the intree plugin driver
|
// GetInTreePluginName returns the name of the intree plugin driver
|
||||||
func (t *azureDiskCSITranslator) GetInTreePluginName() string {
|
func (t *azureDiskCSITranslator) GetInTreePluginName() string {
|
||||||
return AzureDiskInTreePluginName
|
return AzureDiskInTreePluginName
|
||||||
|
|
|
@ -53,6 +53,34 @@ func (t *azureFileCSITranslator) TranslateInTreeStorageClassToCSI(sc *storage.St
|
||||||
return sc, nil
|
return sc, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TranslateInTreeInlineVolumeToCSI takes a Volume with AzureFile set from in-tree
|
||||||
|
// and converts the AzureFile source to a CSIPersistentVolumeSource
|
||||||
|
func (t *azureFileCSITranslator) TranslateInTreeInlineVolumeToCSI(volume *v1.Volume) (*v1.PersistentVolume, error) {
|
||||||
|
if volume == nil || volume.AzureFile == nil {
|
||||||
|
return nil, fmt.Errorf("volume is nil or AWS EBS not defined on volume")
|
||||||
|
}
|
||||||
|
|
||||||
|
azureSource := volume.AzureFile
|
||||||
|
|
||||||
|
pv := &v1.PersistentVolume{
|
||||||
|
Spec: v1.PersistentVolumeSpec{
|
||||||
|
PersistentVolumeSource: v1.PersistentVolumeSource{
|
||||||
|
CSI: &v1.CSIPersistentVolumeSource{
|
||||||
|
VolumeHandle: fmt.Sprintf(volumeIDTemplate, "", azureSource.SecretName, azureSource.ShareName),
|
||||||
|
ReadOnly: azureSource.ReadOnly,
|
||||||
|
VolumeAttributes: map[string]string{azureFileShareName: azureSource.ShareName},
|
||||||
|
NodePublishSecretRef: &v1.SecretReference{
|
||||||
|
Name: azureSource.ShareName,
|
||||||
|
Namespace: "default",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
AccessModes: []v1.PersistentVolumeAccessMode{v1.ReadWriteMany},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
return pv, nil
|
||||||
|
}
|
||||||
|
|
||||||
// TranslateInTreePVToCSI takes a PV with AzureFile set from in-tree
|
// TranslateInTreePVToCSI takes a PV with AzureFile set from in-tree
|
||||||
// and converts the AzureFile source to a CSIPersistentVolumeSource
|
// and converts the AzureFile source to a CSIPersistentVolumeSource
|
||||||
func (t *azureFileCSITranslator) TranslateInTreePVToCSI(pv *v1.PersistentVolume) (*v1.PersistentVolume, error) {
|
func (t *azureFileCSITranslator) TranslateInTreePVToCSI(pv *v1.PersistentVolume) (*v1.PersistentVolume, error) {
|
||||||
|
@ -126,6 +154,13 @@ func (t *azureFileCSITranslator) CanSupport(pv *v1.PersistentVolume) bool {
|
||||||
return pv != nil && pv.Spec.AzureFile != nil
|
return pv != nil && pv.Spec.AzureFile != nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// CanSupportInline tests whether the plugin supports a given inline volume
|
||||||
|
// specification from the API. The spec pointer should be considered
|
||||||
|
// const.
|
||||||
|
func (t *azureFileCSITranslator) CanSupportInline(volume *v1.Volume) bool {
|
||||||
|
return volume != nil && volume.AzureFile != nil
|
||||||
|
}
|
||||||
|
|
||||||
// GetInTreePluginName returns the name of the intree plugin driver
|
// GetInTreePluginName returns the name of the intree plugin driver
|
||||||
func (t *azureFileCSITranslator) GetInTreePluginName() string {
|
func (t *azureFileCSITranslator) GetInTreePluginName() string {
|
||||||
return AzureFileInTreePluginName
|
return AzureFileInTreePluginName
|
||||||
|
|
|
@ -157,6 +157,39 @@ func backwardCompatibleAccessModes(ams []v1.PersistentVolumeAccessMode) []v1.Per
|
||||||
return newAM
|
return newAM
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TranslateInTreeInlineVolumeToCSI takes a Volume with GCEPersistentDisk set from in-tree
|
||||||
|
// and converts the GCEPersistentDisk source to a CSIPersistentVolumeSource
|
||||||
|
func (g *gcePersistentDiskCSITranslator) TranslateInTreeInlineVolumeToCSI(volume *v1.Volume) (*v1.PersistentVolume, error) {
|
||||||
|
if volume == nil || volume.GCEPersistentDisk == nil {
|
||||||
|
return nil, fmt.Errorf("volume is nil or GCE PD not defined on volume")
|
||||||
|
}
|
||||||
|
|
||||||
|
pdSource := volume.GCEPersistentDisk
|
||||||
|
|
||||||
|
partition := ""
|
||||||
|
if pdSource.Partition != 0 {
|
||||||
|
partition = strconv.Itoa(int(pdSource.Partition))
|
||||||
|
}
|
||||||
|
|
||||||
|
pv := &v1.PersistentVolume{
|
||||||
|
Spec: v1.PersistentVolumeSpec{
|
||||||
|
PersistentVolumeSource: v1.PersistentVolumeSource{
|
||||||
|
CSI: &v1.CSIPersistentVolumeSource{
|
||||||
|
Driver: GCEPDDriverName,
|
||||||
|
VolumeHandle: fmt.Sprintf(volIDZonalFmt, UnspecifiedValue, UnspecifiedValue, pdSource.PDName),
|
||||||
|
ReadOnly: pdSource.ReadOnly,
|
||||||
|
FSType: pdSource.FSType,
|
||||||
|
VolumeAttributes: map[string]string{
|
||||||
|
"partition": partition,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
AccessModes: []v1.PersistentVolumeAccessMode{v1.ReadWriteOnce},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
return pv, nil
|
||||||
|
}
|
||||||
|
|
||||||
// TranslateInTreePVToCSI takes a PV with GCEPersistentDisk set from in-tree
|
// TranslateInTreePVToCSI takes a PV with GCEPersistentDisk set from in-tree
|
||||||
// and converts the GCEPersistentDisk source to a CSIPersistentVolumeSource
|
// and converts the GCEPersistentDisk source to a CSIPersistentVolumeSource
|
||||||
func (g *gcePersistentDiskCSITranslator) TranslateInTreePVToCSI(pv *v1.PersistentVolume) (*v1.PersistentVolume, error) {
|
func (g *gcePersistentDiskCSITranslator) TranslateInTreePVToCSI(pv *v1.PersistentVolume) (*v1.PersistentVolume, error) {
|
||||||
|
@ -241,13 +274,20 @@ func (g *gcePersistentDiskCSITranslator) TranslateCSIPVToInTree(pv *v1.Persisten
|
||||||
return pv, nil
|
return pv, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// CanSupport tests whether the plugin supports a given volume
|
// CanSupport tests whether the plugin supports a given persistent volume
|
||||||
// specification from the API. The spec pointer should be considered
|
// specification from the API. The spec pointer should be considered
|
||||||
// const.
|
// const.
|
||||||
func (g *gcePersistentDiskCSITranslator) CanSupport(pv *v1.PersistentVolume) bool {
|
func (g *gcePersistentDiskCSITranslator) CanSupport(pv *v1.PersistentVolume) bool {
|
||||||
return pv != nil && pv.Spec.GCEPersistentDisk != nil
|
return pv != nil && pv.Spec.GCEPersistentDisk != nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// CanSupportInline tests whether the plugin supports a given inline volume
|
||||||
|
// specification from the API. The spec pointer should be considered
|
||||||
|
// const.
|
||||||
|
func (g *gcePersistentDiskCSITranslator) CanSupportInline(volume *v1.Volume) bool {
|
||||||
|
return volume != nil && volume.GCEPersistentDisk != nil
|
||||||
|
}
|
||||||
|
|
||||||
// GetInTreePluginName returns the name of the intree plugin driver
|
// GetInTreePluginName returns the name of the intree plugin driver
|
||||||
func (g *gcePersistentDiskCSITranslator) GetInTreePluginName() string {
|
func (g *gcePersistentDiskCSITranslator) GetInTreePluginName() string {
|
||||||
return GCEPDInTreePluginName
|
return GCEPDInTreePluginName
|
||||||
|
|
|
@ -28,8 +28,13 @@ type InTreePlugin interface {
|
||||||
// and translates them to a volume options consumable by CSI plugin
|
// and translates them to a volume options consumable by CSI plugin
|
||||||
TranslateInTreeStorageClassToCSI(sc *storage.StorageClass) (*storage.StorageClass, error)
|
TranslateInTreeStorageClassToCSI(sc *storage.StorageClass) (*storage.StorageClass, error)
|
||||||
|
|
||||||
|
// TranslateInTreeInlineVolumeToCSI takes a inline volume and will translate
|
||||||
|
// the in-tree inline volume source to a CSIPersistentVolumeSource
|
||||||
|
// A PV object containing the CSIPersistentVolumeSource in it's spec is returned
|
||||||
|
TranslateInTreeInlineVolumeToCSI(volume *v1.Volume) (*v1.PersistentVolume, error)
|
||||||
|
|
||||||
// TranslateInTreePVToCSI takes a persistent volume and will translate
|
// TranslateInTreePVToCSI takes a persistent volume and will translate
|
||||||
// the in-tree source to a CSI Source. The input persistent volume can be modified
|
// the in-tree pv source to a CSI Source. The input persistent volume can be modified
|
||||||
TranslateInTreePVToCSI(pv *v1.PersistentVolume) (*v1.PersistentVolume, error)
|
TranslateInTreePVToCSI(pv *v1.PersistentVolume) (*v1.PersistentVolume, error)
|
||||||
|
|
||||||
// TranslateCSIPVToInTree takes a PV with a CSI PersistentVolume Source and will translate
|
// TranslateCSIPVToInTree takes a PV with a CSI PersistentVolume Source and will translate
|
||||||
|
@ -37,10 +42,14 @@ type InTreePlugin interface {
|
||||||
// by the `Driver` field in the CSI Source. The input PV object can be modified
|
// by the `Driver` field in the CSI Source. The input PV object can be modified
|
||||||
TranslateCSIPVToInTree(pv *v1.PersistentVolume) (*v1.PersistentVolume, error)
|
TranslateCSIPVToInTree(pv *v1.PersistentVolume) (*v1.PersistentVolume, error)
|
||||||
|
|
||||||
// CanSupport tests whether the plugin supports a given volume
|
// CanSupport tests whether the plugin supports a given persistent volume
|
||||||
// specification from the API.
|
// specification from the API.
|
||||||
CanSupport(pv *v1.PersistentVolume) bool
|
CanSupport(pv *v1.PersistentVolume) bool
|
||||||
|
|
||||||
|
// CanSupportInline tests whether the plugin supports a given inline volume
|
||||||
|
// specification from the API.
|
||||||
|
CanSupportInline(vol *v1.Volume) bool
|
||||||
|
|
||||||
// GetInTreePluginName returns the in-tree plugin name this migrates
|
// GetInTreePluginName returns the in-tree plugin name this migrates
|
||||||
GetInTreePluginName() string
|
GetInTreePluginName() string
|
||||||
|
|
||||||
|
|
|
@ -45,6 +45,31 @@ func (t *osCinderCSITranslator) TranslateInTreeStorageClassToCSI(sc *storage.Sto
|
||||||
return sc, nil
|
return sc, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TranslateInTreeInlineVolumeToCSI takes a Volume with Cinder set from in-tree
|
||||||
|
// and converts the Cinder source to a CSIPersistentVolumeSource
|
||||||
|
func (t *osCinderCSITranslator) TranslateInTreeInlineVolumeToCSI(volume *v1.Volume) (*v1.PersistentVolume, error) {
|
||||||
|
if volume == nil || volume.Cinder == nil {
|
||||||
|
return nil, fmt.Errorf("volume is nil or Cinder not defined on volume")
|
||||||
|
}
|
||||||
|
|
||||||
|
cinderSource := volume.Cinder
|
||||||
|
pv := &v1.PersistentVolume{
|
||||||
|
Spec: v1.PersistentVolumeSpec{
|
||||||
|
PersistentVolumeSource: v1.PersistentVolumeSource{
|
||||||
|
CSI: &v1.CSIPersistentVolumeSource{
|
||||||
|
Driver: CinderDriverName,
|
||||||
|
VolumeHandle: cinderSource.VolumeID,
|
||||||
|
ReadOnly: cinderSource.ReadOnly,
|
||||||
|
FSType: cinderSource.FSType,
|
||||||
|
VolumeAttributes: map[string]string{},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
AccessModes: []v1.PersistentVolumeAccessMode{v1.ReadWriteOnce},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
return pv, nil
|
||||||
|
}
|
||||||
|
|
||||||
// TranslateInTreePVToCSI takes a PV with Cinder set from in-tree
|
// TranslateInTreePVToCSI takes a PV with Cinder set from in-tree
|
||||||
// and converts the Cinder source to a CSIPersistentVolumeSource
|
// and converts the Cinder source to a CSIPersistentVolumeSource
|
||||||
func (t *osCinderCSITranslator) TranslateInTreePVToCSI(pv *v1.PersistentVolume) (*v1.PersistentVolume, error) {
|
func (t *osCinderCSITranslator) TranslateInTreePVToCSI(pv *v1.PersistentVolume) (*v1.PersistentVolume, error) {
|
||||||
|
@ -87,13 +112,20 @@ func (t *osCinderCSITranslator) TranslateCSIPVToInTree(pv *v1.PersistentVolume)
|
||||||
return pv, nil
|
return pv, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// CanSupport tests whether the plugin supports a given volume
|
// CanSupport tests whether the plugin supports a given persistent volume
|
||||||
// specification from the API. The spec pointer should be considered
|
// specification from the API. The spec pointer should be considered
|
||||||
// const.
|
// const.
|
||||||
func (t *osCinderCSITranslator) CanSupport(pv *v1.PersistentVolume) bool {
|
func (t *osCinderCSITranslator) CanSupport(pv *v1.PersistentVolume) bool {
|
||||||
return pv != nil && pv.Spec.Cinder != nil
|
return pv != nil && pv.Spec.Cinder != nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// CanSupportInline tests whether the plugin supports a given inline volume
|
||||||
|
// specification from the API. The spec pointer should be considered
|
||||||
|
// const.
|
||||||
|
func (t *osCinderCSITranslator) CanSupportInline(volume *v1.Volume) bool {
|
||||||
|
return volume != nil && volume.Cinder != nil
|
||||||
|
}
|
||||||
|
|
||||||
// GetInTreePluginName returns the name of the intree plugin driver
|
// GetInTreePluginName returns the name of the intree plugin driver
|
||||||
func (t *osCinderCSITranslator) GetInTreePluginName() string {
|
func (t *osCinderCSITranslator) GetInTreePluginName() string {
|
||||||
return CinderInTreePluginName
|
return CinderInTreePluginName
|
||||||
|
|
|
@ -47,6 +47,21 @@ func TranslateInTreeStorageClassToCSI(inTreePluginName string, sc *storage.Stora
|
||||||
return nil, fmt.Errorf("could not find in-tree storage class parameter translation logic for %#v", inTreePluginName)
|
return nil, fmt.Errorf("could not find in-tree storage class parameter translation logic for %#v", inTreePluginName)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TranslateInTreeInlineVolumeToCSI takes a inline volume and will translate
|
||||||
|
// the in-tree volume source to a CSIPersistentVolumeSource (wrapped in a PV)
|
||||||
|
// if the translation logic has been implemented.
|
||||||
|
func TranslateInTreeInlineVolumeToCSI(volume *v1.Volume) (*v1.PersistentVolume, error) {
|
||||||
|
if volume == nil {
|
||||||
|
return nil, fmt.Errorf("persistent volume was nil")
|
||||||
|
}
|
||||||
|
for _, curPlugin := range inTreePlugins {
|
||||||
|
if curPlugin.CanSupportInline(volume) {
|
||||||
|
return curPlugin.TranslateInTreeInlineVolumeToCSI(volume)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil, fmt.Errorf("could not find in-tree plugin translation logic for %#v", volume.Name)
|
||||||
|
}
|
||||||
|
|
||||||
// TranslateInTreePVToCSI takes a persistent volume and will translate
|
// TranslateInTreePVToCSI takes a persistent volume and will translate
|
||||||
// the in-tree source to a CSI Source if the translation logic
|
// the in-tree source to a CSI Source if the translation logic
|
||||||
// has been implemented. The input persistent volume will not
|
// has been implemented. The input persistent volume will not
|
||||||
|
@ -149,5 +164,10 @@ func IsPVMigratable(pv *v1.PersistentVolume) bool {
|
||||||
|
|
||||||
// IsInlineMigratable tests whether there is Migration logic for the given Inline Volume
|
// IsInlineMigratable tests whether there is Migration logic for the given Inline Volume
|
||||||
func IsInlineMigratable(vol *v1.Volume) bool {
|
func IsInlineMigratable(vol *v1.Volume) bool {
|
||||||
|
for _, curPlugin := range inTreePlugins {
|
||||||
|
if curPlugin.CanSupportInline(vol) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue