Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
K
k3s
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Jacklull
k3s
Commits
36f30bc6
Commit
36f30bc6
authored
Aug 09, 2017
by
Scott Creeley
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Add VolumeType api to PV and PVC
parent
842518d3
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
19 changed files
with
469 additions
and
4 deletions
+469
-4
import-restrictions.yaml
hack/import-restrictions.yaml
+2
-0
util.go
pkg/api/persistentvolume/util.go
+10
-0
util_test.go
pkg/api/persistentvolume/util_test.go
+61
-0
BUILD
pkg/api/persistentvolumeclaim/BUILD
+37
-0
OWNERS
pkg/api/persistentvolumeclaim/OWNERS
+4
-0
util.go
pkg/api/persistentvolumeclaim/util.go
+31
-0
util_test.go
pkg/api/persistentvolumeclaim/util_test.go
+71
-0
util.go
pkg/api/pod/util.go
+16
-0
util_test.go
pkg/api/pod/util_test.go
+84
-0
types.go
pkg/apis/core/types.go
+32
-0
defaults.go
pkg/apis/core/v1/defaults.go
+10
-0
defaults_test.go
pkg/apis/core/v1/defaults_test.go
+54
-0
validation.go
pkg/apis/core/validation/validation.go
+0
-0
validation_test.go
pkg/apis/core/validation/validation_test.go
+0
-0
validation.go
pkg/apis/settings/validation/validation.go
+2
-2
kube_features.go
pkg/features/kube_features.go
+7
-0
strategy.go
pkg/registry/core/persistentvolume/strategy.go
+6
-0
strategy.go
pkg/registry/core/persistentvolumeclaim/strategy.go
+8
-2
types.go
staging/src/k8s.io/api/core/v1/types.go
+34
-0
No files found.
hack/import-restrictions.yaml
View file @
36f30bc6
-
baseImportPath
:
"
./pkg/apis/core/"
allowedImports
:
-
k8s.io/apimachinery
-
k8s.io/apiserver/pkg/util/feature
-
k8s.io/kubernetes/pkg/apis/core
-
k8s.io/kubernetes/pkg/features
-
k8s.io/kubernetes/pkg/util
-
k8s.io/api/core/v1
...
...
pkg/api/persistentvolume/util.go
View file @
36f30bc6
...
...
@@ -17,7 +17,9 @@ limitations under the License.
package
persistentvolume
import
(
utilfeature
"k8s.io/apiserver/pkg/util/feature"
api
"k8s.io/kubernetes/pkg/apis/core"
"k8s.io/kubernetes/pkg/features"
)
func
getClaimRefNamespace
(
pv
*
api
.
PersistentVolume
)
string
{
...
...
@@ -96,3 +98,11 @@ func VisitPVSecretNames(pv *api.PersistentVolume, visitor Visitor) bool {
}
return
true
}
// DropDisabledAlphaFields removes disabled fields from the pv spec.
// This should be called from PrepareForCreate/PrepareForUpdate for all resources containing a pv spec.
func
DropDisabledAlphaFields
(
pvSpec
*
api
.
PersistentVolumeSpec
)
{
if
!
utilfeature
.
DefaultFeatureGate
.
Enabled
(
features
.
BlockVolume
)
{
pvSpec
.
VolumeMode
=
nil
}
}
pkg/api/persistentvolume/util_test.go
View file @
36f30bc6
...
...
@@ -24,7 +24,9 @@ import (
"k8s.io/apimachinery/pkg/util/sets"
"k8s.io/apimachinery/pkg/util/validation/field"
utilfeature
"k8s.io/apiserver/pkg/util/feature"
api
"k8s.io/kubernetes/pkg/apis/core"
"k8s.io/kubernetes/pkg/features"
)
func
TestPVSecrets
(
t
*
testing
.
T
)
{
...
...
@@ -204,3 +206,62 @@ func collectSecretPaths(t *testing.T, path *field.Path, name string, tp reflect.
return
secretPaths
}
func
newHostPathType
(
pathType
string
)
*
api
.
HostPathType
{
hostPathType
:=
new
(
api
.
HostPathType
)
*
hostPathType
=
api
.
HostPathType
(
pathType
)
return
hostPathType
}
func
TestDropAlphaPVVolumeMode
(
t
*
testing
.
T
)
{
vmode
:=
api
.
PersistentVolumeFilesystem
// PersistentVolume with VolumeMode set
pv
:=
api
.
PersistentVolume
{
Spec
:
api
.
PersistentVolumeSpec
{
AccessModes
:
[]
api
.
PersistentVolumeAccessMode
{
api
.
ReadWriteOnce
},
PersistentVolumeSource
:
api
.
PersistentVolumeSource
{
HostPath
:
&
api
.
HostPathVolumeSource
{
Path
:
"/foo"
,
Type
:
newHostPathType
(
string
(
api
.
HostPathDirectory
)),
},
},
StorageClassName
:
"test-storage-class"
,
VolumeMode
:
&
vmode
,
},
}
// Enable alpha feature BlockVolume
err1
:=
utilfeature
.
DefaultFeatureGate
.
Set
(
"BlockVolume=true"
)
if
err1
!=
nil
{
t
.
Fatalf
(
"Failed to enable feature gate for BlockVolume: %v"
,
err1
)
}
// now test dropping the fields - should not be dropped
DropDisabledAlphaFields
(
&
pv
.
Spec
)
// check to make sure VolumeDevices is still present
// if featureset is set to true
if
utilfeature
.
DefaultFeatureGate
.
Enabled
(
features
.
BlockVolume
)
{
if
pv
.
Spec
.
VolumeMode
==
nil
{
t
.
Error
(
"VolumeMode in pv.Spec should not have been dropped based on feature-gate"
)
}
}
// Disable alpha feature BlockVolume
err
:=
utilfeature
.
DefaultFeatureGate
.
Set
(
"BlockVolume=false"
)
if
err
!=
nil
{
t
.
Fatalf
(
"Failed to disable feature gate for BlockVolume: %v"
,
err
)
}
// now test dropping the fields
DropDisabledAlphaFields
(
&
pv
.
Spec
)
// check to make sure VolumeDevices is nil
// if featureset is set to false
if
!
utilfeature
.
DefaultFeatureGate
.
Enabled
(
features
.
BlockVolume
)
{
if
pv
.
Spec
.
VolumeMode
!=
nil
{
t
.
Error
(
"DropDisabledAlphaFields VolumeMode for pv.Spec failed"
)
}
}
}
pkg/api/persistentvolumeclaim/BUILD
0 → 100644
View file @
36f30bc6
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
"go_test",
)
go_library(
name = "go_default_library",
srcs = ["util.go"],
deps = ["//pkg/api:go_default_library"],
)
filegroup(
name = "package-srcs",
srcs = glob(["**"]),
tags = ["automanaged"],
visibility = ["//visibility:private"],
)
filegroup(
name = "all-srcs",
srcs = [":package-srcs"],
tags = ["automanaged"],
)
go_test(
name = "go_default_test",
srcs = ["util_test.go"],
library = ":go_default_library",
deps = [
"//pkg/api:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/util/validation/field:go_default_library",
],
)
pkg/api/persistentvolumeclaim/OWNERS
0 → 100755
View file @
36f30bc6
reviewers:
- smarterclayton
- jsafrane
- david-mcmahon
pkg/api/persistentvolumeclaim/util.go
0 → 100644
View file @
36f30bc6
/*
Copyright 2017 The Kubernetes Authors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package
persistentvolumeclaim
import
(
utilfeature
"k8s.io/apiserver/pkg/util/feature"
"k8s.io/kubernetes/pkg/apis/core"
"k8s.io/kubernetes/pkg/features"
)
// DropDisabledAlphaFields removes disabled fields from the pvc spec.
// This should be called from PrepareForCreate/PrepareForUpdate for all resources containing a pvc spec.
func
DropDisabledAlphaFields
(
pvcSpec
*
core
.
PersistentVolumeClaimSpec
)
{
if
!
utilfeature
.
DefaultFeatureGate
.
Enabled
(
features
.
BlockVolume
)
{
pvcSpec
.
VolumeMode
=
nil
}
}
pkg/api/persistentvolumeclaim/util_test.go
0 → 100644
View file @
36f30bc6
/*
Copyright 2017 The Kubernetes Authors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package
persistentvolumeclaim
import
(
"testing"
utilfeature
"k8s.io/apiserver/pkg/util/feature"
"k8s.io/kubernetes/pkg/apis/core"
"k8s.io/kubernetes/pkg/features"
)
func
TestDropAlphaPVCVolumeMode
(
t
*
testing
.
T
)
{
vmode
:=
core
.
PersistentVolumeFilesystem
// PersistentVolume with VolumeMode set
pvc
:=
core
.
PersistentVolumeClaim
{
Spec
:
core
.
PersistentVolumeClaimSpec
{
AccessModes
:
[]
core
.
PersistentVolumeAccessMode
{
core
.
ReadWriteOnce
},
VolumeMode
:
&
vmode
,
},
}
// Enable alpha feature BlockVolume
err1
:=
utilfeature
.
DefaultFeatureGate
.
Set
(
"BlockVolume=true"
)
if
err1
!=
nil
{
t
.
Fatalf
(
"Failed to enable feature gate for BlockVolume: %v"
,
err1
)
}
// now test dropping the fields - should not be dropped
DropDisabledAlphaFields
(
&
pvc
.
Spec
)
// check to make sure VolumeDevices is still present
// if featureset is set to true
if
utilfeature
.
DefaultFeatureGate
.
Enabled
(
features
.
BlockVolume
)
{
if
pvc
.
Spec
.
VolumeMode
==
nil
{
t
.
Error
(
"VolumeMode in pvc.Spec should not have been dropped based on feature-gate"
)
}
}
// Disable alpha feature BlockVolume
err
:=
utilfeature
.
DefaultFeatureGate
.
Set
(
"BlockVolume=false"
)
if
err
!=
nil
{
t
.
Fatalf
(
"Failed to disable feature gate for BlockVolume: %v"
,
err
)
}
// now test dropping the fields
DropDisabledAlphaFields
(
&
pvc
.
Spec
)
// check to make sure VolumeDevices is nil
// if featureset is set to false
if
!
utilfeature
.
DefaultFeatureGate
.
Enabled
(
features
.
BlockVolume
)
{
if
pvc
.
Spec
.
VolumeMode
!=
nil
{
t
.
Error
(
"DropDisabledAlphaFields VolumeMode for pvc.Spec failed"
)
}
}
}
pkg/api/pod/util.go
View file @
36f30bc6
...
...
@@ -243,12 +243,15 @@ func DropDisabledAlphaFields(podSpec *api.PodSpec) {
}
}
}
for
i
:=
range
podSpec
.
Containers
{
DropDisabledVolumeMountsAlphaFields
(
podSpec
.
Containers
[
i
]
.
VolumeMounts
)
}
for
i
:=
range
podSpec
.
InitContainers
{
DropDisabledVolumeMountsAlphaFields
(
podSpec
.
InitContainers
[
i
]
.
VolumeMounts
)
}
DropDisabledVolumeDevicesAlphaFields
(
podSpec
)
}
// DropDisabledVolumeMountsAlphaFields removes disabled fields from []VolumeMount.
...
...
@@ -260,3 +263,16 @@ func DropDisabledVolumeMountsAlphaFields(volumeMounts []api.VolumeMount) {
}
}
}
// DropDisabledVolumeDevicesAlphaFields removes disabled fields from []VolumeDevice.
// This should be called from PrepareForCreate/PrepareForUpdate for all resources containing a VolumeDevice
func
DropDisabledVolumeDevicesAlphaFields
(
podSpec
*
api
.
PodSpec
)
{
if
!
utilfeature
.
DefaultFeatureGate
.
Enabled
(
features
.
BlockVolume
)
{
for
i
:=
range
podSpec
.
Containers
{
podSpec
.
Containers
[
i
]
.
VolumeDevices
=
nil
}
for
i
:=
range
podSpec
.
InitContainers
{
podSpec
.
InitContainers
[
i
]
.
VolumeDevices
=
nil
}
}
}
pkg/api/pod/util_test.go
View file @
36f30bc6
...
...
@@ -24,7 +24,9 @@ import (
"k8s.io/apimachinery/pkg/util/sets"
"k8s.io/apimachinery/pkg/util/validation/field"
utilfeature
"k8s.io/apiserver/pkg/util/feature"
api
"k8s.io/kubernetes/pkg/apis/core"
"k8s.io/kubernetes/pkg/features"
)
func
TestPodSecrets
(
t
*
testing
.
T
)
{
...
...
@@ -254,3 +256,85 @@ func TestPodConfigmaps(t *testing.T) {
t
.
Error
(
"Extra names extracted. Verify VisitPodConfigmapNames() is correctly extracting resource names"
)
}
}
func
TestDropAlphaVolumeDevices
(
t
*
testing
.
T
)
{
testPod
:=
api
.
Pod
{
Spec
:
api
.
PodSpec
{
RestartPolicy
:
api
.
RestartPolicyNever
,
Containers
:
[]
api
.
Container
{
{
Name
:
"container1"
,
Image
:
"testimage"
,
VolumeDevices
:
[]
api
.
VolumeDevice
{
{
Name
:
"myvolume"
,
DevicePath
:
"/usr/test"
,
},
},
},
},
InitContainers
:
[]
api
.
Container
{
{
Name
:
"container1"
,
Image
:
"testimage"
,
VolumeDevices
:
[]
api
.
VolumeDevice
{
{
Name
:
"myvolume"
,
DevicePath
:
"/usr/test"
,
},
},
},
},
Volumes
:
[]
api
.
Volume
{
{
Name
:
"myvolume"
,
VolumeSource
:
api
.
VolumeSource
{
HostPath
:
&
api
.
HostPathVolumeSource
{
Path
:
"/dev/xvdc"
,
},
},
},
},
},
}
// Enable alpha feature BlockVolume
err1
:=
utilfeature
.
DefaultFeatureGate
.
Set
(
"BlockVolume=true"
)
if
err1
!=
nil
{
t
.
Fatalf
(
"Failed to enable feature gate for BlockVolume: %v"
,
err1
)
}
// now test dropping the fields - should not be dropped
DropDisabledAlphaFields
(
&
testPod
.
Spec
)
// check to make sure VolumeDevices is still present
// if featureset is set to true
if
utilfeature
.
DefaultFeatureGate
.
Enabled
(
features
.
BlockVolume
)
{
if
testPod
.
Spec
.
Containers
[
0
]
.
VolumeDevices
==
nil
{
t
.
Error
(
"VolumeDevices in Container should not have been dropped based on feature-gate"
)
}
if
testPod
.
Spec
.
InitContainers
[
0
]
.
VolumeDevices
==
nil
{
t
.
Error
(
"VolumeDevices in Container should not have been dropped based on feature-gate"
)
}
}
// Disable alpha feature BlockVolume
err
:=
utilfeature
.
DefaultFeatureGate
.
Set
(
"BlockVolume=false"
)
if
err
!=
nil
{
t
.
Fatalf
(
"Failed to disable feature gate for BlockVolume: %v"
,
err
)
}
// now test dropping the fields
DropDisabledAlphaFields
(
&
testPod
.
Spec
)
// check to make sure VolumeDevices is nil
// if featureset is set to false
if
!
utilfeature
.
DefaultFeatureGate
.
Enabled
(
features
.
BlockVolume
)
{
if
testPod
.
Spec
.
Containers
[
0
]
.
VolumeDevices
!=
nil
{
t
.
Error
(
"DropDisabledAlphaFields for Containers failed"
)
}
if
testPod
.
Spec
.
InitContainers
[
0
]
.
VolumeDevices
!=
nil
{
t
.
Error
(
"DropDisabledAlphaFields for InitContainers failed"
)
}
}
}
pkg/apis/core/types.go
View file @
36f30bc6
...
...
@@ -462,6 +462,11 @@ type PersistentVolumeSpec struct {
// simply fail if one is invalid.
// +optional
MountOptions
[]
string
// volumeMode defines if a volume is intended to be used with a formatted filesystem
// or to remain in raw block state. Value of Filesystem is implied when not included in spec.
// This is an alpha feature and may change in the future.
// +optional
VolumeMode
*
PersistentVolumeMode
}
// PersistentVolumeReclaimPolicy describes a policy for end-of-life maintenance of persistent volumes
...
...
@@ -479,6 +484,16 @@ const (
PersistentVolumeReclaimRetain
PersistentVolumeReclaimPolicy
=
"Retain"
)
// PersistentVolumeMode describes how a volume is intended to be consumed, either Block or Filesystem.
type
PersistentVolumeMode
string
const
(
// PersistentVolumeBlock means the volume will not be formatted with a filesystem and will remain a raw block device.
PersistentVolumeBlock
PersistentVolumeMode
=
"Block"
// PersistentVolumeFilesystem means the volume will be or is formatted with a filesystem.
PersistentVolumeFilesystem
PersistentVolumeMode
=
"Filesystem"
)
type
PersistentVolumeStatus
struct
{
// Phase indicates if a volume is available, bound to a claim, or released by a claim
// +optional
...
...
@@ -548,6 +563,11 @@ type PersistentVolumeClaimSpec struct {
// More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes/#class-1
// +optional
StorageClassName
*
string
// volumeMode defines what type of volume is required by the claim.
// Value of Filesystem is implied when not included in claim spec.
// This is an alpha feature and may change in the future.
// +optional
VolumeMode
*
PersistentVolumeMode
}
type
PersistentVolumeClaimConditionType
string
...
...
@@ -1586,6 +1606,14 @@ const (
MountPropagationBidirectional
MountPropagationMode
=
"Bidirectional"
)
// VolumeDevice describes a mapping of a raw block device within a container.
type
VolumeDevice
struct
{
// name must match the name of a persistentVolumeClaim in the pod
Name
string
// devicePath is the path inside of the container that the device will be mapped to.
DevicePath
string
}
// EnvVar represents an environment variable present in a Container.
type
EnvVar
struct
{
// Required: This must be a C_IDENTIFIER.
...
...
@@ -1879,6 +1907,10 @@ type Container struct {
Resources
ResourceRequirements
// +optional
VolumeMounts
[]
VolumeMount
// volumeDevices is the list of block devices to be used by the container.
// This is an alpha feature and may change in the future.
// +optional
VolumeDevices
[]
VolumeDevice
// +optional
LivenessProbe
*
Probe
// +optional
...
...
pkg/apis/core/v1/defaults.go
View file @
36f30bc6
...
...
@@ -20,6 +20,8 @@ import (
"k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/util/intstr"
utilfeature
"k8s.io/apiserver/pkg/util/feature"
"k8s.io/kubernetes/pkg/features"
"k8s.io/kubernetes/pkg/util/parsers"
utilpointer
"k8s.io/kubernetes/pkg/util/pointer"
)
...
...
@@ -228,11 +230,19 @@ func SetDefaults_PersistentVolume(obj *v1.PersistentVolume) {
if
obj
.
Spec
.
PersistentVolumeReclaimPolicy
==
""
{
obj
.
Spec
.
PersistentVolumeReclaimPolicy
=
v1
.
PersistentVolumeReclaimRetain
}
if
obj
.
Spec
.
VolumeMode
==
nil
&&
utilfeature
.
DefaultFeatureGate
.
Enabled
(
features
.
BlockVolume
)
{
obj
.
Spec
.
VolumeMode
=
new
(
v1
.
PersistentVolumeMode
)
*
obj
.
Spec
.
VolumeMode
=
v1
.
PersistentVolumeFilesystem
}
}
func
SetDefaults_PersistentVolumeClaim
(
obj
*
v1
.
PersistentVolumeClaim
)
{
if
obj
.
Status
.
Phase
==
""
{
obj
.
Status
.
Phase
=
v1
.
ClaimPending
}
if
obj
.
Spec
.
VolumeMode
==
nil
&&
utilfeature
.
DefaultFeatureGate
.
Enabled
(
features
.
BlockVolume
)
{
obj
.
Spec
.
VolumeMode
=
new
(
v1
.
PersistentVolumeMode
)
*
obj
.
Spec
.
VolumeMode
=
v1
.
PersistentVolumeFilesystem
}
}
func
SetDefaults_ISCSIVolumeSource
(
obj
*
v1
.
ISCSIVolumeSource
)
{
if
obj
.
ISCSIInterface
==
""
{
...
...
pkg/apis/core/v1/defaults_test.go
View file @
36f30bc6
...
...
@@ -26,6 +26,7 @@ import (
metav1
"k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/util/intstr"
utilfeature
"k8s.io/apiserver/pkg/util/feature"
"k8s.io/kubernetes/pkg/api/legacyscheme"
corev1
"k8s.io/kubernetes/pkg/apis/core/v1"
...
...
@@ -817,6 +818,33 @@ func TestSetDefaultPersistentVolume(t *testing.T) {
if
pv2
.
Spec
.
PersistentVolumeReclaimPolicy
!=
v1
.
PersistentVolumeReclaimRetain
{
t
.
Errorf
(
"Expected pv reclaim policy %v, got %v"
,
v1
.
PersistentVolumeReclaimRetain
,
pv2
.
Spec
.
PersistentVolumeReclaimPolicy
)
}
// When feature gate is disabled, field should not be defaulted
defaultMode
:=
v1
.
PersistentVolumeFilesystem
outputMode
:=
pv2
.
Spec
.
VolumeMode
if
outputMode
!=
nil
{
t
.
Errorf
(
"Expected VolumeMode to not be defaulted, got: %+v"
,
outputMode
)
}
// When feature gate is enabled, field should be defaulted
err
:=
utilfeature
.
DefaultFeatureGate
.
Set
(
"BlockVolume=true"
)
if
err
!=
nil
{
t
.
Fatalf
(
"Failed to enable feature gate for BlockVolume: %v"
,
err
)
}
obj3
:=
roundTrip
(
t
,
runtime
.
Object
(
pv
))
.
(
*
v1
.
PersistentVolume
)
outputMode3
:=
obj3
.
Spec
.
VolumeMode
if
outputMode3
==
nil
{
t
.
Errorf
(
"Expected VolumeMode to be defaulted to: %+v, got: nil"
,
defaultMode
)
}
else
if
*
outputMode3
!=
defaultMode
{
t
.
Errorf
(
"Expected VolumeMode to be defaulted to: %+v, got: %+v"
,
defaultMode
,
outputMode3
)
}
err
=
utilfeature
.
DefaultFeatureGate
.
Set
(
"BlockVolume=false"
)
if
err
!=
nil
{
t
.
Fatalf
(
"Failed to disable feature gate for BlockVolume: %v"
,
err
)
}
}
func
TestSetDefaultPersistentVolumeClaim
(
t
*
testing
.
T
)
{
...
...
@@ -827,6 +855,32 @@ func TestSetDefaultPersistentVolumeClaim(t *testing.T) {
if
pvc2
.
Status
.
Phase
!=
v1
.
ClaimPending
{
t
.
Errorf
(
"Expected claim phase %v, got %v"
,
v1
.
ClaimPending
,
pvc2
.
Status
.
Phase
)
}
// When feature gate is disabled, field should not be defaulted
defaultMode
:=
v1
.
PersistentVolumeFilesystem
outputMode
:=
pvc2
.
Spec
.
VolumeMode
if
outputMode
!=
nil
{
t
.
Errorf
(
"Expected VolumeMode to not be defaulted, got: %+v"
,
outputMode
)
}
// When feature gate is enabled, field should be defaulted
err
:=
utilfeature
.
DefaultFeatureGate
.
Set
(
"BlockVolume=true"
)
if
err
!=
nil
{
t
.
Fatalf
(
"Failed to enable feature gate for BlockVolume: %v"
,
err
)
}
obj3
:=
roundTrip
(
t
,
runtime
.
Object
(
pvc
))
.
(
*
v1
.
PersistentVolumeClaim
)
outputMode3
:=
obj3
.
Spec
.
VolumeMode
if
outputMode3
==
nil
{
t
.
Errorf
(
"Expected VolumeMode to be defaulted to: %+v, got: nil"
,
defaultMode
)
}
else
if
*
outputMode3
!=
defaultMode
{
t
.
Errorf
(
"Expected VolumeMode to be defaulted to: %+v, got: %+v"
,
defaultMode
,
outputMode3
)
}
err
=
utilfeature
.
DefaultFeatureGate
.
Set
(
"BlockVolume=false"
)
if
err
!=
nil
{
t
.
Fatalf
(
"Failed to disable feature gate for BlockVolume: %v"
,
err
)
}
}
func
TestSetDefaulEndpointsProtocol
(
t
*
testing
.
T
)
{
...
...
pkg/apis/core/validation/validation.go
View file @
36f30bc6
This diff is collapsed.
Click to expand it.
pkg/apis/core/validation/validation_test.go
View file @
36f30bc6
This diff is collapsed.
Click to expand it.
pkg/apis/settings/validation/validation.go
View file @
36f30bc6
...
...
@@ -43,11 +43,11 @@ func ValidatePodPresetSpec(spec *settings.PodPresetSpec, fldPath *field.Path) fi
allErrs
=
append
(
allErrs
,
field
.
Required
(
fldPath
.
Child
(
"volumes"
,
"env"
,
"envFrom"
,
"volumeMounts"
),
"must specify at least one"
))
}
vol
ume
s
,
vErrs
:=
apivalidation
.
ValidateVolumes
(
spec
.
Volumes
,
fldPath
.
Child
(
"volumes"
))
vols
,
vErrs
:=
apivalidation
.
ValidateVolumes
(
spec
.
Volumes
,
fldPath
.
Child
(
"volumes"
))
allErrs
=
append
(
allErrs
,
vErrs
...
)
allErrs
=
append
(
allErrs
,
apivalidation
.
ValidateEnv
(
spec
.
Env
,
fldPath
.
Child
(
"env"
))
...
)
allErrs
=
append
(
allErrs
,
apivalidation
.
ValidateEnvFrom
(
spec
.
EnvFrom
,
fldPath
.
Child
(
"envFrom"
))
...
)
allErrs
=
append
(
allErrs
,
apivalidation
.
ValidateVolumeMounts
(
spec
.
VolumeMounts
,
volume
s
,
nil
,
fldPath
.
Child
(
"volumeMounts"
))
...
)
allErrs
=
append
(
allErrs
,
apivalidation
.
ValidateVolumeMounts
(
spec
.
VolumeMounts
,
nil
,
vol
s
,
nil
,
fldPath
.
Child
(
"volumeMounts"
))
...
)
return
allErrs
}
...
...
pkg/features/kube_features.go
View file @
36f30bc6
...
...
@@ -187,6 +187,12 @@ const (
//
// Enable mount/attachment of Container Storage Interface (CSI) backed PVs
CSIPersistentVolume
utilfeature
.
Feature
=
"CSIPersistentVolume"
// owner: @screeley44
// alpha: v1.9
//
// Enable Block volume support in containers.
BlockVolume
utilfeature
.
Feature
=
"BlockVolume"
)
func
init
()
{
...
...
@@ -222,6 +228,7 @@ var defaultKubernetesFeatureGates = map[utilfeature.Feature]utilfeature.FeatureS
MountContainers
:
{
Default
:
false
,
PreRelease
:
utilfeature
.
Alpha
},
VolumeScheduling
:
{
Default
:
false
,
PreRelease
:
utilfeature
.
Alpha
},
CSIPersistentVolume
:
{
Default
:
false
,
PreRelease
:
utilfeature
.
Alpha
},
BlockVolume
:
{
Default
:
false
,
PreRelease
:
utilfeature
.
Alpha
},
// inherited features from generic apiserver, relisted here to get a conflict if it is changed
// unintentionally on either side:
...
...
pkg/registry/core/persistentvolume/strategy.go
View file @
36f30bc6
...
...
@@ -28,6 +28,7 @@ import (
"k8s.io/apiserver/pkg/storage"
"k8s.io/apiserver/pkg/storage/names"
"k8s.io/kubernetes/pkg/api/legacyscheme"
pvutil
"k8s.io/kubernetes/pkg/api/persistentvolume"
api
"k8s.io/kubernetes/pkg/apis/core"
"k8s.io/kubernetes/pkg/apis/core/validation"
volumevalidation
"k8s.io/kubernetes/pkg/volume/validation"
...
...
@@ -51,6 +52,8 @@ func (persistentvolumeStrategy) NamespaceScoped() bool {
func
(
persistentvolumeStrategy
)
PrepareForCreate
(
ctx
genericapirequest
.
Context
,
obj
runtime
.
Object
)
{
pv
:=
obj
.
(
*
api
.
PersistentVolume
)
pv
.
Status
=
api
.
PersistentVolumeStatus
{}
pvutil
.
DropDisabledAlphaFields
(
&
pv
.
Spec
)
}
func
(
persistentvolumeStrategy
)
Validate
(
ctx
genericapirequest
.
Context
,
obj
runtime
.
Object
)
field
.
ErrorList
{
...
...
@@ -72,6 +75,9 @@ func (persistentvolumeStrategy) PrepareForUpdate(ctx genericapirequest.Context,
newPv
:=
obj
.
(
*
api
.
PersistentVolume
)
oldPv
:=
old
.
(
*
api
.
PersistentVolume
)
newPv
.
Status
=
oldPv
.
Status
pvutil
.
DropDisabledAlphaFields
(
&
newPv
.
Spec
)
pvutil
.
DropDisabledAlphaFields
(
&
oldPv
.
Spec
)
}
func
(
persistentvolumeStrategy
)
ValidateUpdate
(
ctx
genericapirequest
.
Context
,
obj
,
old
runtime
.
Object
)
field
.
ErrorList
{
...
...
pkg/registry/core/persistentvolumeclaim/strategy.go
View file @
36f30bc6
...
...
@@ -28,6 +28,7 @@ import (
"k8s.io/apiserver/pkg/storage"
"k8s.io/apiserver/pkg/storage/names"
"k8s.io/kubernetes/pkg/api/legacyscheme"
pvcutil
"k8s.io/kubernetes/pkg/api/persistentvolumeclaim"
api
"k8s.io/kubernetes/pkg/apis/core"
"k8s.io/kubernetes/pkg/apis/core/validation"
)
...
...
@@ -48,8 +49,10 @@ func (persistentvolumeclaimStrategy) NamespaceScoped() bool {
// PrepareForCreate clears the Status field which is not allowed to be set by end users on creation.
func
(
persistentvolumeclaimStrategy
)
PrepareForCreate
(
ctx
genericapirequest
.
Context
,
obj
runtime
.
Object
)
{
pv
:=
obj
.
(
*
api
.
PersistentVolumeClaim
)
pv
.
Status
=
api
.
PersistentVolumeClaimStatus
{}
pvc
:=
obj
.
(
*
api
.
PersistentVolumeClaim
)
pvc
.
Status
=
api
.
PersistentVolumeClaimStatus
{}
pvcutil
.
DropDisabledAlphaFields
(
&
pvc
.
Spec
)
}
func
(
persistentvolumeclaimStrategy
)
Validate
(
ctx
genericapirequest
.
Context
,
obj
runtime
.
Object
)
field
.
ErrorList
{
...
...
@@ -70,6 +73,9 @@ func (persistentvolumeclaimStrategy) PrepareForUpdate(ctx genericapirequest.Cont
newPvc
:=
obj
.
(
*
api
.
PersistentVolumeClaim
)
oldPvc
:=
old
.
(
*
api
.
PersistentVolumeClaim
)
newPvc
.
Status
=
oldPvc
.
Status
pvcutil
.
DropDisabledAlphaFields
(
&
newPvc
.
Spec
)
pvcutil
.
DropDisabledAlphaFields
(
&
oldPvc
.
Spec
)
}
func
(
persistentvolumeclaimStrategy
)
ValidateUpdate
(
ctx
genericapirequest
.
Context
,
obj
,
old
runtime
.
Object
)
field
.
ErrorList
{
...
...
staging/src/k8s.io/api/core/v1/types.go
View file @
36f30bc6
...
...
@@ -527,6 +527,11 @@ type PersistentVolumeSpec struct {
// More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes/#mount-options
// +optional
MountOptions
[]
string
`json:"mountOptions,omitempty" protobuf:"bytes,7,opt,name=mountOptions"`
// volumeMode defines if a volume is intended to be used with a formatted filesystem
// or to remain in raw block state. Value of Filesystem is implied when not included in spec.
// This is an alpha feature and may change in the future.
// +optional
VolumeMode
*
PersistentVolumeMode
`json:"volumeMode,omitempty" protobuf:"bytes,8,opt,name=volumeMode,casttype=PersistentVolumeMode"`
}
// PersistentVolumeReclaimPolicy describes a policy for end-of-life maintenance of persistent volumes.
...
...
@@ -544,6 +549,16 @@ const (
PersistentVolumeReclaimRetain
PersistentVolumeReclaimPolicy
=
"Retain"
)
// PersistentVolumeMode describes how a volume is intended to be consumed, either Block or Filesystem.
type
PersistentVolumeMode
string
const
(
// PersistentVolumeBlock means the volume will not be formatted with a filesystem and will remain a raw block device.
PersistentVolumeBlock
PersistentVolumeMode
=
"Block"
// PersistentVolumeFilesystem means the volume will be or is formatted with a filesystem.
PersistentVolumeFilesystem
PersistentVolumeMode
=
"Filesystem"
)
// PersistentVolumeStatus is the current status of a persistent volume.
type
PersistentVolumeStatus
struct
{
// Phase indicates if a volume is available, bound to a claim, or released by a claim.
...
...
@@ -631,6 +646,11 @@ type PersistentVolumeClaimSpec struct {
// More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#class-1
// +optional
StorageClassName
*
string
`json:"storageClassName,omitempty" protobuf:"bytes,5,opt,name=storageClassName"`
// volumeMode defines what type of volume is required by the claim.
// Value of Filesystem is implied when not included in claim spec.
// This is an alpha feature and may change in the future.
// +optional
VolumeMode
*
PersistentVolumeMode
`json:"volumeMode,omitempty" protobuf:"bytes,6,opt,name=volumeMode,casttype=PersistentVolumeMode"`
}
// PersistentVolumeClaimConditionType is a valid value of PersistentVolumeClaimCondition.Type
...
...
@@ -1709,6 +1729,14 @@ const (
MountPropagationBidirectional
MountPropagationMode
=
"Bidirectional"
)
// volumeDevice describes a mapping of a raw block device within a container.
type
VolumeDevice
struct
{
// name must match the name of a persistentVolumeClaim in the pod
Name
string
`json:"name" protobuf:"bytes,1,opt,name=name"`
// devicePath is the path inside of the container that the device will be mapped to.
DevicePath
string
`json:"devicePath" protobuf:"bytes,2,opt,name=devicePath"`
}
// EnvVar represents an environment variable present in a Container.
type
EnvVar
struct
{
// Name of the environment variable. Must be a C_IDENTIFIER.
...
...
@@ -2052,6 +2080,12 @@ type Container struct {
// +patchMergeKey=mountPath
// +patchStrategy=merge
VolumeMounts
[]
VolumeMount
`json:"volumeMounts,omitempty" patchStrategy:"merge" patchMergeKey:"mountPath" protobuf:"bytes,9,rep,name=volumeMounts"`
// volumeDevices is the list of block devices to be used by the container.
// This is an alpha feature and may change in the future.
// +patchMergeKey=devicePath
// +patchStrategy=merge
// +optional
VolumeDevices
[]
VolumeDevice
`json:"volumeDevices,omitempty" patchStrategy:"merge" patchMergeKey:"devicePath" protobuf:"bytes,21,rep,name=volumeDevices"`
// Periodic probe of container liveness.
// Container will be restarted if the probe fails.
// Cannot be updated.
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment