Skip to content

Commit 891f51f

Browse files
committed
Add Finalizer for VolumeSnapshot/VolumeSnapshotContent
This PR adds a Finalizer for VolumeSnapshotContent. If the VolumeSnapshotContent is bound to a VolumeSnapshot, the VolumeSnapshotContent is being used and cannot be deleted. This PR also adds a Finalizer for VolumeSnapshot. If a volume is being created from the snapshot, the VolumeSnapshot is being used and cannot be deleted.
1 parent 2840dd8 commit 891f51f

7 files changed

+262
-63
lines changed

pkg/controller/framework_test.go

+18-5
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,16 @@ type reactorError struct {
166166
error error
167167
}
168168

169+
func withSnapshotFinalizer(snapshot *crdv1.VolumeSnapshot) *crdv1.VolumeSnapshot {
170+
snapshot.ObjectMeta.Finalizers = append(snapshot.ObjectMeta.Finalizers, VolumeSnapshotFinalizer)
171+
return snapshot
172+
}
173+
174+
func withContentFinalizer(content *crdv1.VolumeSnapshotContent) *crdv1.VolumeSnapshotContent {
175+
content.ObjectMeta.Finalizers = append(content.ObjectMeta.Finalizers, VolumeSnapshotContentFinalizer)
176+
return content
177+
}
178+
169179
// React is a callback called by fake kubeClient from the controller.
170180
// In other words, every snapshot/content change performed by the controller ends
171181
// here.
@@ -744,7 +754,7 @@ func newTestController(kubeClient kubernetes.Interface, clientset clientset.Inte
744754
}
745755

746756
// newContent returns a new content with given attributes
747-
func newContent(name, className, snapshotHandle, volumeUID, volumeName, boundToSnapshotUID, boundToSnapshotName string, deletionPolicy *crdv1.DeletionPolicy, size *int64, creationTime *int64) *crdv1.VolumeSnapshotContent {
757+
func newContent(name, className, snapshotHandle, volumeUID, volumeName, boundToSnapshotUID, boundToSnapshotName string, deletionPolicy *crdv1.DeletionPolicy, size *int64, creationTime *int64, withFinalizer bool) *crdv1.VolumeSnapshotContent {
748758
content := crdv1.VolumeSnapshotContent{
749759
ObjectMeta: metav1.ObjectMeta{
750760
Name: name,
@@ -779,17 +789,20 @@ func newContent(name, className, snapshotHandle, volumeUID, volumeName, boundToS
779789
}
780790
}
781791

792+
if withFinalizer {
793+
return withContentFinalizer(&content)
794+
}
782795
return &content
783796
}
784797

785-
func newContentArray(name, className, snapshotHandle, volumeUID, volumeName, boundToSnapshotUID, boundToSnapshotName string, deletionPolicy *crdv1.DeletionPolicy, size *int64, creationTime *int64) []*crdv1.VolumeSnapshotContent {
798+
func newContentArray(name, className, snapshotHandle, volumeUID, volumeName, boundToSnapshotUID, boundToSnapshotName string, deletionPolicy *crdv1.DeletionPolicy, size *int64, creationTime *int64, withFinalizer bool) []*crdv1.VolumeSnapshotContent {
786799
return []*crdv1.VolumeSnapshotContent{
787-
newContent(name, className, snapshotHandle, volumeUID, volumeName, boundToSnapshotUID, boundToSnapshotName, deletionPolicy, size, creationTime),
800+
newContent(name, className, snapshotHandle, volumeUID, volumeName, boundToSnapshotUID, boundToSnapshotName, deletionPolicy, size, creationTime, withFinalizer),
788801
}
789802
}
790803

791804
func newContentWithUnmatchDriverArray(name, className, snapshotHandle, volumeUID, volumeName, boundToSnapshotUID, boundToSnapshotName string, deletionPolicy *crdv1.DeletionPolicy, size *int64, creationTime *int64) []*crdv1.VolumeSnapshotContent {
792-
content := newContent(name, className, snapshotHandle, volumeUID, volumeName, boundToSnapshotUID, boundToSnapshotName, deletionPolicy, size, creationTime)
805+
content := newContent(name, className, snapshotHandle, volumeUID, volumeName, boundToSnapshotUID, boundToSnapshotName, deletionPolicy, size, creationTime, false)
793806
content.Spec.VolumeSnapshotSource.CSI.Driver = "fake"
794807
return []*crdv1.VolumeSnapshotContent{
795808
content,
@@ -821,7 +834,7 @@ func newSnapshot(name, className, boundToContent, snapshotUID, claimName string,
821834
},
822835
}
823836

824-
return &snapshot
837+
return withSnapshotFinalizer(&snapshot)
825838
}
826839

827840
func newSnapshotArray(name, className, boundToContent, snapshotUID, claimName string, ready bool, err *storagev1beta1.VolumeError, creationTime *metav1.Time, size *resource.Quantity) []*crdv1.VolumeSnapshot {

pkg/controller/snapshot_controller.go

+161
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ import (
3434
ref "k8s.io/client-go/tools/reference"
3535
"k8s.io/kubernetes/pkg/util/goroutinemap"
3636
"k8s.io/kubernetes/pkg/util/goroutinemap/exponentialbackoff"
37+
"k8s.io/kubernetes/pkg/util/slice"
3738
)
3839

3940
// ==================================================================
@@ -77,6 +78,9 @@ import (
7778

7879
const pvcKind = "PersistentVolumeClaim"
7980
const apiGroup = ""
81+
const snapshotKind = "VolumeSnapshot"
82+
const snapshotAPIGroup = crdv1.GroupName
83+
8084
const controllerUpdateFailMsg = "snapshot controller failed to update"
8185

8286
const IsDefaultSnapshotClassAnnotation = "snapshot.storage.kubernetes.io/is-default-class"
@@ -85,6 +89,26 @@ const IsDefaultSnapshotClassAnnotation = "snapshot.storage.kubernetes.io/is-defa
8589
func (ctrl *csiSnapshotController) syncContent(content *crdv1.VolumeSnapshotContent) error {
8690
glog.V(5).Infof("synchronizing VolumeSnapshotContent[%s]", content.Name)
8791

92+
if isContentDeletionCandidate(content) {
93+
// Volume snapshot content should be deleted. Check if it's used
94+
// and remove finalizer if it's not.
95+
// Check if snapshot content is still bound to a snapshot.
96+
isUsed := ctrl.isSnapshotContentBeingUsed(content)
97+
if !isUsed {
98+
glog.V(5).Infof("syncContent: Remove Finalizer for VolumeSnapshotContent[%s]", content.Name)
99+
return ctrl.removeContentFinalizer(content)
100+
}
101+
}
102+
103+
if needToAddContentFinalizer(content) {
104+
// Content is not being deleted -> it should have the finalizer. The
105+
// finalizer should be added by admission plugin, this is just to add
106+
// the finalizer to old volume snapshot contents that were created before
107+
// the admission plugin was enabled.
108+
glog.V(5).Infof("syncContent: Add Finalizer for VolumeSnapshotContent[%s]", content.Name)
109+
return ctrl.addContentFinalizer(content)
110+
}
111+
88112
// VolumeSnapshotContent is not bound to any VolumeSnapshot, in this case we just return err
89113
if content.Spec.VolumeSnapshotRef == nil {
90114
// content is not bound
@@ -154,6 +178,26 @@ func (ctrl *csiSnapshotController) syncContent(content *crdv1.VolumeSnapshotCont
154178
func (ctrl *csiSnapshotController) syncSnapshot(snapshot *crdv1.VolumeSnapshot) error {
155179
glog.V(5).Infof("synchonizing VolumeSnapshot[%s]: %s", snapshotKey(snapshot), getSnapshotStatusForLogging(snapshot))
156180

181+
if isSnapshotDeletionCandidate(snapshot) {
182+
// Volume snapshot should be deleted. Check if it's used
183+
// and remove finalizer if it's not.
184+
// Check if a volume is being created from snapshot.
185+
isUsed := ctrl.isVolumeBeingCreatedFromSnapshot(snapshot)
186+
if !isUsed {
187+
glog.V(5).Infof("syncSnapshot: Remove Finalizer for VolumeSnapshot[%s]", snapshot.Name)
188+
return ctrl.removeSnapshotFinalizer(snapshot)
189+
}
190+
}
191+
192+
if needToAddSnapshotFinalizer(snapshot) {
193+
// Snapshot is not being deleted -> it should have the finalizer. The
194+
// finalizer should be added by admission plugin, this is just to add
195+
// the finalizer to old volume snapshots that were created before
196+
// the admission plugin was enabled.
197+
glog.V(5).Infof("syncSnapshot: Add Finalizer for VolumeSnapshot[%s]", snapshot.Name)
198+
return ctrl.addSnapshotFinalizer(snapshot)
199+
}
200+
157201
if !snapshot.Status.Ready {
158202
return ctrl.syncUnreadySnapshot(snapshot)
159203
} else {
@@ -410,6 +454,48 @@ func IsSnapshotBound(snapshot *crdv1.VolumeSnapshot, content *crdv1.VolumeSnapsh
410454
return false
411455
}
412456

457+
// isSnapshotConentBeingUsed checks if snapshot content is bound to snapshot.
458+
func (ctrl *csiSnapshotController) isSnapshotContentBeingUsed(content *crdv1.VolumeSnapshotContent) bool {
459+
if content.Spec.VolumeSnapshotRef != nil {
460+
snapshotObj, err := ctrl.clientset.VolumesnapshotV1alpha1().VolumeSnapshots(content.Spec.VolumeSnapshotRef.Namespace).Get(content.Spec.VolumeSnapshotRef.Name, metav1.GetOptions{})
461+
if err != nil {
462+
glog.Infof("isSnapshotContentBeingUsed: Cannot get snapshot %s from api server: [%v]. VolumeSnapshot object may be deleted already.", content.Spec.VolumeSnapshotRef.Name, err)
463+
return false
464+
}
465+
466+
// Check if the snapshot content is bound to the snapshot
467+
if IsSnapshotBound(snapshotObj, content) && snapshotObj.Spec.SnapshotContentName == content.Name {
468+
glog.Infof("isSnapshotContentBeingUsed: VolumeSnapshot %s is bound to volumeSnapshotContent [%s]", snapshotObj.Name, content.Name)
469+
return true
470+
}
471+
}
472+
473+
glog.V(5).Infof("isSnapshotContentBeingUsed: Snapshot content %s is not being used", content.Name)
474+
return false
475+
}
476+
477+
// isVolumeBeingCreatedFromSnapshot checks if an volume is being created from the snapshot.
478+
func (ctrl *csiSnapshotController) isVolumeBeingCreatedFromSnapshot(snapshot *crdv1.VolumeSnapshot) bool {
479+
pvcList, err := ctrl.client.CoreV1().PersistentVolumeClaims(snapshot.Namespace).List(metav1.ListOptions{})
480+
if err != nil {
481+
glog.Errorf("Failed to retrieve PVCs from the API server to check if volume snapshot %s is being used by a volume: %q", snapshot.Name, err)
482+
return false
483+
}
484+
for _, pvc := range pvcList.Items {
485+
if pvc.Spec.DataSource != nil && len(pvc.Spec.DataSource.Name) > 0 && pvc.Spec.DataSource.Name == snapshot.Name {
486+
if pvc.Spec.DataSource.Kind == snapshotKind && *(pvc.Spec.DataSource.APIGroup) == snapshotAPIGroup {
487+
if pvc.Status.Phase == v1.ClaimPending {
488+
// A volume is being created from the snapshot
489+
glog.Infof("isVolumeBeingCreatedFromSnapshot: volume %s is being created from snapshot %s", pvc.Name, pvc.Spec.DataSource.Name)
490+
return true
491+
}
492+
}
493+
}
494+
}
495+
glog.V(5).Infof("isVolumeBeingCreatedFromSnapshot: no volume is being created from snapshot %s", snapshot.Name)
496+
return false
497+
}
498+
413499
// The function checks whether the volumeSnapshotRef in snapshot content matches the given snapshot. If match, it binds the content with the snapshot
414500
func (ctrl *csiSnapshotController) checkandBindSnapshotContent(snapshot *crdv1.VolumeSnapshot, content *crdv1.VolumeSnapshotContent) error {
415501
if content.Spec.VolumeSnapshotRef == nil || content.Spec.VolumeSnapshotRef.Name != snapshot.Name {
@@ -899,3 +985,78 @@ func isControllerUpdateFailError(err *storage.VolumeError) bool {
899985
}
900986
return false
901987
}
988+
989+
// addContentFinalizer adds a Finalizer for VolumeSnapshotContent.
990+
func (ctrl *csiSnapshotController) addContentFinalizer(content *crdv1.VolumeSnapshotContent) error {
991+
contentClone := content.DeepCopy()
992+
contentClone.ObjectMeta.Finalizers = append(contentClone.ObjectMeta.Finalizers, VolumeSnapshotContentFinalizer)
993+
994+
_, err := ctrl.clientset.VolumesnapshotV1alpha1().VolumeSnapshotContents().Update(contentClone)
995+
if err != nil {
996+
return newControllerUpdateError(content.Name, err.Error())
997+
}
998+
999+
_, err = ctrl.storeContentUpdate(contentClone)
1000+
if err != nil {
1001+
glog.Errorf("failed to update content store %v", err)
1002+
}
1003+
1004+
glog.V(5).Infof("Added protection finalizer to volume snapshot content %s", content.Name)
1005+
return nil
1006+
}
1007+
1008+
// removeContentFinalizer removes a Finalizer for VolumeSnapshotContent.
1009+
func (ctrl *csiSnapshotController) removeContentFinalizer(content *crdv1.VolumeSnapshotContent) error {
1010+
contentClone := content.DeepCopy()
1011+
contentClone.ObjectMeta.Finalizers = slice.RemoveString(contentClone.ObjectMeta.Finalizers, VolumeSnapshotContentFinalizer, nil)
1012+
1013+
_, err := ctrl.clientset.VolumesnapshotV1alpha1().VolumeSnapshotContents().Update(contentClone)
1014+
if err != nil {
1015+
return newControllerUpdateError(content.Name, err.Error())
1016+
}
1017+
1018+
_, err = ctrl.storeContentUpdate(contentClone)
1019+
if err != nil {
1020+
glog.Errorf("failed to update content store %v", err)
1021+
}
1022+
1023+
glog.V(5).Infof("Removed protection finalizer from volume snapshot content %s", content.Name)
1024+
return nil
1025+
}
1026+
1027+
// addSnapshotFinalizer adds a Finalizer for VolumeSnapshot.
1028+
func (ctrl *csiSnapshotController) addSnapshotFinalizer(snapshot *crdv1.VolumeSnapshot) error {
1029+
snapshotClone := snapshot.DeepCopy()
1030+
snapshotClone.ObjectMeta.Finalizers = append(snapshotClone.ObjectMeta.Finalizers, VolumeSnapshotFinalizer)
1031+
_, err := ctrl.clientset.VolumesnapshotV1alpha1().VolumeSnapshots(snapshotClone.Namespace).Update(snapshotClone)
1032+
if err != nil {
1033+
return newControllerUpdateError(snapshot.Name, err.Error())
1034+
}
1035+
1036+
_, err = ctrl.storeSnapshotUpdate(snapshotClone)
1037+
if err != nil {
1038+
glog.Errorf("failed to update snapshot store %v", err)
1039+
}
1040+
1041+
glog.V(5).Infof("Added protection finalizer to volume snapshot %s", snapshot.Name)
1042+
return nil
1043+
}
1044+
1045+
// removeContentFinalizer removes a Finalizer for VolumeSnapshot.
1046+
func (ctrl *csiSnapshotController) removeSnapshotFinalizer(snapshot *crdv1.VolumeSnapshot) error {
1047+
snapshotClone := snapshot.DeepCopy()
1048+
snapshotClone.ObjectMeta.Finalizers = slice.RemoveString(snapshotClone.ObjectMeta.Finalizers, VolumeSnapshotFinalizer, nil)
1049+
1050+
_, err := ctrl.clientset.VolumesnapshotV1alpha1().VolumeSnapshots(snapshotClone.Namespace).Update(snapshotClone)
1051+
if err != nil {
1052+
return newControllerUpdateError(snapshot.Name, err.Error())
1053+
}
1054+
1055+
_, err = ctrl.storeSnapshotUpdate(snapshotClone)
1056+
if err != nil {
1057+
glog.Errorf("failed to update snapshot store %v", err)
1058+
}
1059+
1060+
glog.V(5).Infof("Removed protection finalizer from volume snapshot %s", snapshot.Name)
1061+
return nil
1062+
}

pkg/controller/snapshot_controller_test.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ import (
2323
)
2424

2525
func storeVersion(t *testing.T, prefix string, c cache.Store, version string, expectedReturn bool) {
26-
content := newContent("contentName", classEmpty, "sid1-1", "vuid1-1", "volume1-1", "snapuid1-1", "snap1-1", nil, nil, nil)
26+
content := newContent("contentName", classEmpty, "sid1-1", "vuid1-1", "volume1-1", "snapuid1-1", "snap1-1", nil, nil, nil, false)
2727
content.ResourceVersion = version
2828
ret, err := storeObjectUpdate(c, content, "content")
2929
if err != nil {
@@ -82,7 +82,7 @@ func TestControllerCacheParsingError(t *testing.T) {
8282
// There must be something in the cache to compare with
8383
storeVersion(t, "Step1", c, "1", true)
8484

85-
content := newContent("contentName", classEmpty, "sid1-1", "vuid1-1", "volume1-1", "snapuid1-1", "snap1-1", nil, nil, nil)
85+
content := newContent("contentName", classEmpty, "sid1-1", "vuid1-1", "volume1-1", "snapuid1-1", "snap1-1", nil, nil, nil, false)
8686
content.ResourceVersion = "xxx"
8787
_, err := storeObjectUpdate(c, content, "content")
8888
if err == nil {

pkg/controller/snapshot_create_test.go

+6-6
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ func TestCreateSnapshotSync(t *testing.T) {
6868
{
6969
name: "6-1 - successful create snapshot with snapshot class gold",
7070
initialContents: nocontents,
71-
expectedContents: newContentArray("snapcontent-snapuid6-1", classGold, "sid6-1", "pv-uid6-1", "volume6-1", "snapuid6-1", "snap6-1", &deletePolicy, &defaultSize, &timeNow),
71+
expectedContents: newContentArray("snapcontent-snapuid6-1", classGold, "sid6-1", "pv-uid6-1", "volume6-1", "snapuid6-1", "snap6-1", &deletePolicy, &defaultSize, &timeNow, false),
7272
initialSnapshots: newSnapshotArray("snap6-1", classGold, "", "snapuid6-1", "claim6-1", false, nil, nil, nil),
7373
expectedSnapshots: newSnapshotArray("snap6-1", classGold, "snapcontent-snapuid6-1", "snapuid6-1", "claim6-1", false, nil, metaTimeNowUnix, getSize(defaultSize)),
7474
initialClaims: newClaimArray("claim6-1", "pvc-uid6-1", "1Gi", "volume6-1", v1.ClaimBound, &classEmpty),
@@ -92,7 +92,7 @@ func TestCreateSnapshotSync(t *testing.T) {
9292
{
9393
name: "6-2 - successful create snapshot with snapshot class silver",
9494
initialContents: nocontents,
95-
expectedContents: newContentArray("snapcontent-snapuid6-2", classSilver, "sid6-2", "pv-uid6-2", "volume6-2", "snapuid6-2", "snap6-2", &deletePolicy, &defaultSize, &timeNow),
95+
expectedContents: newContentArray("snapcontent-snapuid6-2", classSilver, "sid6-2", "pv-uid6-2", "volume6-2", "snapuid6-2", "snap6-2", &deletePolicy, &defaultSize, &timeNow, false),
9696
initialSnapshots: newSnapshotArray("snap6-2", classSilver, "", "snapuid6-2", "claim6-2", false, nil, nil, nil),
9797
expectedSnapshots: newSnapshotArray("snap6-2", classSilver, "snapcontent-snapuid6-2", "snapuid6-2", "claim6-2", false, nil, metaTimeNowUnix, getSize(defaultSize)),
9898
initialClaims: newClaimArray("claim6-2", "pvc-uid6-2", "1Gi", "volume6-2", v1.ClaimBound, &classEmpty),
@@ -116,7 +116,7 @@ func TestCreateSnapshotSync(t *testing.T) {
116116
{
117117
name: "6-3 - successful create snapshot with snapshot class valid-secret-class",
118118
initialContents: nocontents,
119-
expectedContents: newContentArray("snapcontent-snapuid6-3", validSecretClass, "sid6-3", "pv-uid6-3", "volume6-3", "snapuid6-3", "snap6-3", &deletePolicy, &defaultSize, &timeNow),
119+
expectedContents: newContentArray("snapcontent-snapuid6-3", validSecretClass, "sid6-3", "pv-uid6-3", "volume6-3", "snapuid6-3", "snap6-3", &deletePolicy, &defaultSize, &timeNow, false),
120120
initialSnapshots: newSnapshotArray("snap6-3", validSecretClass, "", "snapuid6-3", "claim6-3", false, nil, nil, nil),
121121
expectedSnapshots: newSnapshotArray("snap6-3", validSecretClass, "snapcontent-snapuid6-3", "snapuid6-3", "claim6-3", false, nil, metaTimeNowUnix, getSize(defaultSize)),
122122
initialClaims: newClaimArray("claim6-3", "pvc-uid6-3", "1Gi", "volume6-3", v1.ClaimBound, &classEmpty),
@@ -142,7 +142,7 @@ func TestCreateSnapshotSync(t *testing.T) {
142142
{
143143
name: "6-4 - successful create snapshot with snapshot class empty-secret-class",
144144
initialContents: nocontents,
145-
expectedContents: newContentArray("snapcontent-snapuid6-4", emptySecretClass, "sid6-4", "pv-uid6-4", "volume6-4", "snapuid6-4", "snap6-4", &deletePolicy, &defaultSize, &timeNow),
145+
expectedContents: newContentArray("snapcontent-snapuid6-4", emptySecretClass, "sid6-4", "pv-uid6-4", "volume6-4", "snapuid6-4", "snap6-4", &deletePolicy, &defaultSize, &timeNow, false),
146146
initialSnapshots: newSnapshotArray("snap6-4", emptySecretClass, "", "snapuid6-4", "claim6-4", false, nil, nil, nil),
147147
expectedSnapshots: newSnapshotArray("snap6-4", emptySecretClass, "snapcontent-snapuid6-4", "snapuid6-4", "claim6-4", false, nil, metaTimeNowUnix, getSize(defaultSize)),
148148
initialClaims: newClaimArray("claim6-4", "pvc-uid6-4", "1Gi", "volume6-4", v1.ClaimBound, &classEmpty),
@@ -168,7 +168,7 @@ func TestCreateSnapshotSync(t *testing.T) {
168168
{
169169
name: "6-5 - successful create snapshot with status uploading",
170170
initialContents: nocontents,
171-
expectedContents: newContentArray("snapcontent-snapuid6-5", classGold, "sid6-5", "pv-uid6-5", "volume6-5", "snapuid6-5", "snap6-5", &deletePolicy, &defaultSize, &timeNow),
171+
expectedContents: newContentArray("snapcontent-snapuid6-5", classGold, "sid6-5", "pv-uid6-5", "volume6-5", "snapuid6-5", "snap6-5", &deletePolicy, &defaultSize, &timeNow, false),
172172
initialSnapshots: newSnapshotArray("snap6-5", classGold, "", "snapuid6-5", "claim6-5", false, nil, nil, nil),
173173
expectedSnapshots: newSnapshotArray("snap6-5", classGold, "snapcontent-snapuid6-5", "snapuid6-5", "claim6-5", false, nil, metaTimeNowUnix, getSize(defaultSize)),
174174
initialClaims: newClaimArray("claim6-5", "pvc-uid6-5", "1Gi", "volume6-5", v1.ClaimBound, &classEmpty),
@@ -192,7 +192,7 @@ func TestCreateSnapshotSync(t *testing.T) {
192192
{
193193
name: "6-6 - successful create snapshot with status error uploading",
194194
initialContents: nocontents,
195-
expectedContents: newContentArray("snapcontent-snapuid6-6", classGold, "sid6-6", "pv-uid6-6", "volume6-6", "snapuid6-6", "snap6-6", &deletePolicy, &defaultSize, &timeNow),
195+
expectedContents: newContentArray("snapcontent-snapuid6-6", classGold, "sid6-6", "pv-uid6-6", "volume6-6", "snapuid6-6", "snap6-6", &deletePolicy, &defaultSize, &timeNow, false),
196196
initialSnapshots: newSnapshotArray("snap6-6", classGold, "", "snapuid6-6", "claim6-6", false, nil, nil, nil),
197197
expectedSnapshots: newSnapshotArray("snap6-6", classGold, "snapcontent-snapuid6-6", "snapuid6-6", "claim6-6", false, nil, metaTimeNowUnix, getSize(defaultSize)),
198198
initialClaims: newClaimArray("claim6-6", "pvc-uid6-6", "1Gi", "volume6-6", v1.ClaimBound, &classEmpty),

0 commit comments

Comments
 (0)