Skip to content

Commit

Permalink
Merge pull request #95282 from xing-yang/snapshot_ga
Browse files Browse the repository at this point in the history
Move Snapshot to GA
  • Loading branch information
k8s-ci-robot authored Nov 12, 2020
2 parents fbc589f + c0eaee3 commit bffdc87
Show file tree
Hide file tree
Showing 8 changed files with 57 additions and 131 deletions.
2 changes: 1 addition & 1 deletion api/openapi-spec/swagger.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 1 addition & 3 deletions pkg/api/persistentvolumeclaim/util.go
Original file line number Diff line number Diff line change
Expand Up @@ -61,9 +61,7 @@ func dataSourceIsEnabled(pvcSpec *core.PersistentVolumeClaimSpec) bool {

}

if utilfeature.DefaultFeatureGate.Enabled(features.VolumeSnapshotDataSource) &&
pvcSpec.DataSource.Kind == volumeSnapshot &&
apiGroup == "snapshot.storage.k8s.io" {
if pvcSpec.DataSource.Kind == volumeSnapshot && apiGroup == "snapshot.storage.k8s.io" {
return true
}
}
Expand Down
141 changes: 40 additions & 101 deletions pkg/api/persistentvolumeclaim/util_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -50,76 +50,51 @@ func TestDropDisabledSnapshotDataSource(t *testing.T) {
}

pvcInfo := []struct {
description string
hasDataSource bool
pvc func() *core.PersistentVolumeClaim
description string
pvc func() *core.PersistentVolumeClaim
}{
{
description: "pvc without DataSource",
hasDataSource: false,
pvc: pvcWithoutDataSource,
description: "pvc without DataSource",
pvc: pvcWithoutDataSource,
},
{
description: "pvc with DataSource",
hasDataSource: true,
pvc: pvcWithDataSource,
description: "pvc with DataSource",
pvc: pvcWithDataSource,
},
{
description: "is nil",
hasDataSource: false,
pvc: func() *core.PersistentVolumeClaim { return nil },
description: "is nil",
pvc: func() *core.PersistentVolumeClaim { return nil },
},
}

// Ensure that any data sources aren't enabled for this test
defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.AnyVolumeDataSource, false)()

for _, enabled := range []bool{true, false} {
for _, oldpvcInfo := range pvcInfo {
for _, newpvcInfo := range pvcInfo {
oldPvcHasDataSource, oldpvc := oldpvcInfo.hasDataSource, oldpvcInfo.pvc()
newPvcHasDataSource, newpvc := newpvcInfo.hasDataSource, newpvcInfo.pvc()
if newpvc == nil {
continue
}

t.Run(fmt.Sprintf("feature enabled=%v, old pvc %v, new pvc %v", enabled, oldpvcInfo.description, newpvcInfo.description), func(t *testing.T) {
defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.VolumeSnapshotDataSource, enabled)()
for _, oldpvcInfo := range pvcInfo {
for _, newpvcInfo := range pvcInfo {
oldpvc := oldpvcInfo.pvc()
newpvc := newpvcInfo.pvc()
if newpvc == nil {
continue
}

var oldpvcSpec *core.PersistentVolumeClaimSpec
if oldpvc != nil {
oldpvcSpec = &oldpvc.Spec
}
DropDisabledFields(&newpvc.Spec, oldpvcSpec)
t.Run(fmt.Sprintf("old pvc %v, new pvc %v", oldpvcInfo.description, newpvcInfo.description), func(t *testing.T) {
var oldpvcSpec *core.PersistentVolumeClaimSpec
if oldpvc != nil {
oldpvcSpec = &oldpvc.Spec
}
DropDisabledFields(&newpvc.Spec, oldpvcSpec)

// old pvc should never be changed
if !reflect.DeepEqual(oldpvc, oldpvcInfo.pvc()) {
t.Errorf("old pvc changed: %v", diff.ObjectReflectDiff(oldpvc, oldpvcInfo.pvc()))
}
// old pvc should never be changed
if !reflect.DeepEqual(oldpvc, oldpvcInfo.pvc()) {
t.Errorf("old pvc changed: %v", diff.ObjectReflectDiff(oldpvc, oldpvcInfo.pvc()))
}

switch {
case enabled || oldPvcHasDataSource:
// new pvc should not be changed if the feature is enabled, or if the old pvc had DataSource
if !reflect.DeepEqual(newpvc, newpvcInfo.pvc()) {
t.Errorf("new pvc changed: %v", diff.ObjectReflectDiff(newpvc, newpvcInfo.pvc()))
}
case newPvcHasDataSource:
// new pvc should be changed
if reflect.DeepEqual(newpvc, newpvcInfo.pvc()) {
t.Errorf("new pvc was not changed")
}
// new pvc should not have DataSource
if !reflect.DeepEqual(newpvc, pvcWithoutDataSource()) {
t.Errorf("new pvc had DataSource: %v", diff.ObjectReflectDiff(newpvc, pvcWithoutDataSource()))
}
default:
// new pvc should not need to be changed
if !reflect.DeepEqual(newpvc, newpvcInfo.pvc()) {
t.Errorf("new pvc changed: %v", diff.ObjectReflectDiff(newpvc, newpvcInfo.pvc()))
}
}
})
}
// new pvc should not be changed
if !reflect.DeepEqual(newpvc, newpvcInfo.pvc()) {
t.Errorf("new pvc changed: %v", diff.ObjectReflectDiff(newpvc, newpvcInfo.pvc()))
}
})
}
}
}
Expand Down Expand Up @@ -203,24 +178,23 @@ func TestAnyDataSourceFilter(t *testing.T) {
genericDataSource := makeDataSource("generic.storage.k8s.io", "Generic", "my-foo")

var tests = map[string]struct {
spec core.PersistentVolumeClaimSpec
snapshotEnabled bool
anyEnabled bool
want *core.TypedLocalObjectReference
spec core.PersistentVolumeClaimSpec
anyEnabled bool
want *core.TypedLocalObjectReference
}{
"both disabled with empty ds": {
"any disabled with empty ds": {
spec: core.PersistentVolumeClaimSpec{},
want: nil,
},
"both disabled with volume ds": {
"any disabled with volume ds": {
spec: core.PersistentVolumeClaimSpec{DataSource: volumeDataSource},
want: volumeDataSource,
},
"both disabled with snapshot ds": {
"any disabled with snapshot ds": {
spec: core.PersistentVolumeClaimSpec{DataSource: snapshotDataSource},
want: nil,
want: snapshotDataSource,
},
"both disabled with generic ds": {
"any disabled with generic ds": {
spec: core.PersistentVolumeClaimSpec{DataSource: genericDataSource},
want: nil,
},
Expand All @@ -244,50 +218,15 @@ func TestAnyDataSourceFilter(t *testing.T) {
anyEnabled: true,
want: genericDataSource,
},
"snapshot enabled with snapshot ds": {
spec: core.PersistentVolumeClaimSpec{DataSource: snapshotDataSource},
snapshotEnabled: true,
want: snapshotDataSource,
},
"snapshot enabled with generic ds": {
spec: core.PersistentVolumeClaimSpec{DataSource: genericDataSource},
snapshotEnabled: true,
want: nil,
},
"both enabled with empty ds": {
spec: core.PersistentVolumeClaimSpec{},
snapshotEnabled: true,
anyEnabled: true,
want: nil,
},
"both enabled with volume ds": {
spec: core.PersistentVolumeClaimSpec{DataSource: volumeDataSource},
snapshotEnabled: true,
anyEnabled: true,
want: volumeDataSource,
},
"both enabled with snapshot ds": {
spec: core.PersistentVolumeClaimSpec{DataSource: snapshotDataSource},
snapshotEnabled: true,
anyEnabled: true,
want: snapshotDataSource,
},
"both enabled with generic ds": {
spec: core.PersistentVolumeClaimSpec{DataSource: genericDataSource},
snapshotEnabled: true,
anyEnabled: true,
want: genericDataSource,
},
}

for testName, test := range tests {
t.Run(testName, func(t *testing.T) {
defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.VolumeSnapshotDataSource, test.snapshotEnabled)()
defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.AnyVolumeDataSource, test.anyEnabled)()
DropDisabledFields(&test.spec, nil)
if test.spec.DataSource != test.want {
t.Errorf("expected condition was not met, test: %s, snapshotEnabled: %v, anyEnabled: %v, spec: %v, expected: %v",
testName, test.snapshotEnabled, test.anyEnabled, test.spec, test.want)
t.Errorf("expected condition was not met, test: %s, anyEnabled: %v, spec: %v, expected: %v",
testName, test.anyEnabled, test.spec, test.want)
}
})
}
Expand Down
12 changes: 4 additions & 8 deletions pkg/apis/core/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -445,17 +445,13 @@ type PersistentVolumeClaimSpec struct {
// +optional
VolumeMode *PersistentVolumeMode
// This field can be used to specify either:
// * An existing VolumeSnapshot object (snapshot.storage.k8s.io/VolumeSnapshot - Beta)
// * An existing VolumeSnapshot object (snapshot.storage.k8s.io/VolumeSnapshot)
// * An existing PVC (PersistentVolumeClaim)
// * An existing custom resource/object that implements data population (Alpha)
// In order to use VolumeSnapshot object types, the appropriate feature gate
// must be enabled (VolumeSnapshotDataSource or AnyVolumeDataSource)
// * An existing custom resource that implements data population (Alpha)
// In order to use custom resource types that implement data population,
// the AnyVolumeDataSource feature gate must be enabled.
// If the provisioner or an external controller can support the specified data source,
// it will create a new volume based on the contents of the specified data source.
// If the specified data source is not supported, the volume will
// not be created and the failure will be reported as an event.
// In the future, we plan to support more data source types and the behavior
// of the provisioner may change.
// +optional
DataSource *TypedLocalObjectReference
}
Expand Down
3 changes: 2 additions & 1 deletion pkg/features/kube_features.go
Original file line number Diff line number Diff line change
Expand Up @@ -330,6 +330,7 @@ const (
// owner: @xing-yang
// alpha: v1.12
// beta: v1.17
// GA: v1.20
//
// Enable volume snapshot data source support.
VolumeSnapshotDataSource featuregate.Feature = "VolumeSnapshotDataSource"
Expand Down Expand Up @@ -751,7 +752,7 @@ var defaultKubernetesFeatureGates = map[featuregate.Feature]featuregate.FeatureS
RuntimeClass: {Default: true, PreRelease: featuregate.Beta},
NodeLease: {Default: true, PreRelease: featuregate.GA, LockToDefault: true},
SCTPSupport: {Default: true, PreRelease: featuregate.GA, LockToDefault: true}, // remove in 1.22
VolumeSnapshotDataSource: {Default: true, PreRelease: featuregate.Beta},
VolumeSnapshotDataSource: {Default: true, PreRelease: featuregate.GA, LockToDefault: true}, // remove in 1.21
ProcMountType: {Default: false, PreRelease: featuregate.Alpha},
TTLAfterFinished: {Default: false, PreRelease: featuregate.Alpha},
KubeletPodResources: {Default: true, PreRelease: featuregate.Beta},
Expand Down
12 changes: 4 additions & 8 deletions staging/src/k8s.io/api/core/v1/generated.proto

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

12 changes: 4 additions & 8 deletions staging/src/k8s.io/api/core/v1/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -489,17 +489,13 @@ type PersistentVolumeClaimSpec struct {
// +optional
VolumeMode *PersistentVolumeMode `json:"volumeMode,omitempty" protobuf:"bytes,6,opt,name=volumeMode,casttype=PersistentVolumeMode"`
// This field can be used to specify either:
// * An existing VolumeSnapshot object (snapshot.storage.k8s.io/VolumeSnapshot - Beta)
// * An existing VolumeSnapshot object (snapshot.storage.k8s.io/VolumeSnapshot)
// * An existing PVC (PersistentVolumeClaim)
// * An existing custom resource/object that implements data population (Alpha)
// In order to use VolumeSnapshot object types, the appropriate feature gate
// must be enabled (VolumeSnapshotDataSource or AnyVolumeDataSource)
// * An existing custom resource that implements data population (Alpha)
// In order to use custom resource types that implement data population,
// the AnyVolumeDataSource feature gate must be enabled.
// If the provisioner or an external controller can support the specified data source,
// it will create a new volume based on the contents of the specified data source.
// If the specified data source is not supported, the volume will
// not be created and the failure will be reported as an event.
// In the future, we plan to support more data source types and the behavior
// of the provisioner may change.
// +optional
DataSource *TypedLocalObjectReference `json:"dataSource,omitempty" protobuf:"bytes,7,opt,name=dataSource"`
}
Expand Down

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

0 comments on commit bffdc87

Please sign in to comment.