mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-21 02:41:25 +00:00
Merge pull request #110612 from mattcary/ss-integration
Add TestAutodeleteOwnerRefs statefulset integration test
This commit is contained in:
commit
3beb8dc596
@ -403,3 +403,89 @@ func TestStatefulSetStatusWithPodFail(t *testing.T) {
|
||||
t.Fatalf("StatefulSet %s status has %d replicas, want replicas %d: %v", sts.Name, gotReplicas, wantReplicas, err)
|
||||
}
|
||||
}
|
||||
|
||||
func TestAutodeleteOwnerRefs(t *testing.T) {
|
||||
tests := []struct {
|
||||
name string
|
||||
policy appsv1.StatefulSetPersistentVolumeClaimRetentionPolicy
|
||||
expectPodOwnerRef bool
|
||||
expectSetOwnerRef bool
|
||||
}{
|
||||
{
|
||||
name: "always retain",
|
||||
policy: appsv1.StatefulSetPersistentVolumeClaimRetentionPolicy{
|
||||
WhenDeleted: appsv1.RetainPersistentVolumeClaimRetentionPolicyType,
|
||||
WhenScaled: appsv1.RetainPersistentVolumeClaimRetentionPolicyType,
|
||||
},
|
||||
expectPodOwnerRef: false,
|
||||
expectSetOwnerRef: false,
|
||||
},
|
||||
{
|
||||
name: "delete on scaledown only",
|
||||
policy: appsv1.StatefulSetPersistentVolumeClaimRetentionPolicy{
|
||||
WhenDeleted: appsv1.RetainPersistentVolumeClaimRetentionPolicyType,
|
||||
WhenScaled: appsv1.DeletePersistentVolumeClaimRetentionPolicyType,
|
||||
},
|
||||
expectPodOwnerRef: true,
|
||||
expectSetOwnerRef: false,
|
||||
},
|
||||
{
|
||||
name: "delete with set only",
|
||||
policy: appsv1.StatefulSetPersistentVolumeClaimRetentionPolicy{
|
||||
WhenDeleted: appsv1.DeletePersistentVolumeClaimRetentionPolicyType,
|
||||
WhenScaled: appsv1.RetainPersistentVolumeClaimRetentionPolicyType,
|
||||
},
|
||||
expectPodOwnerRef: false,
|
||||
expectSetOwnerRef: true,
|
||||
},
|
||||
{
|
||||
name: "always delete",
|
||||
policy: appsv1.StatefulSetPersistentVolumeClaimRetentionPolicy{
|
||||
WhenDeleted: appsv1.DeletePersistentVolumeClaimRetentionPolicyType,
|
||||
WhenScaled: appsv1.DeletePersistentVolumeClaimRetentionPolicyType,
|
||||
},
|
||||
expectPodOwnerRef: true,
|
||||
expectSetOwnerRef: true,
|
||||
},
|
||||
}
|
||||
for _, test := range tests {
|
||||
t.Run(test.name, func(t *testing.T) {
|
||||
defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.StatefulSetAutoDeletePVC, true)()
|
||||
closeFn, rm, informers, c := scSetup(t)
|
||||
defer closeFn()
|
||||
ns := framework.CreateNamespaceOrDie(c, "test-autodelete-ownerrefs", t)
|
||||
defer framework.DeleteNamespaceOrDie(c, ns, t)
|
||||
cancel := runControllerAndInformers(rm, informers)
|
||||
defer cancel()
|
||||
|
||||
sts := newSTS("sts", ns.Name, 3)
|
||||
sts.Spec.PersistentVolumeClaimRetentionPolicy = &test.policy
|
||||
stss, _ := createSTSsPods(t, c, []*appsv1.StatefulSet{sts}, []*v1.Pod{})
|
||||
sts = stss[0]
|
||||
waitSTSStable(t, c, sts)
|
||||
|
||||
// Verify StatefulSet ownerref has been added as appropriate.
|
||||
pvcClient := c.CoreV1().PersistentVolumeClaims(ns.Name)
|
||||
pvcs := getStatefulSetPVCs(t, pvcClient, sts)
|
||||
for _, pvc := range pvcs {
|
||||
verifyOwnerRef(t, pvc, "StatefulSet", test.expectSetOwnerRef)
|
||||
verifyOwnerRef(t, pvc, "Pod", false)
|
||||
}
|
||||
|
||||
// Scale down to 1 pod and verify Pod ownerrefs as appropriate.
|
||||
one := int32(1)
|
||||
sts.Spec.Replicas = &one
|
||||
waitSTSStable(t, c, sts)
|
||||
|
||||
pvcs = getStatefulSetPVCs(t, pvcClient, sts)
|
||||
for i, pvc := range pvcs {
|
||||
verifyOwnerRef(t, pvc, "StatefulSet", test.expectSetOwnerRef)
|
||||
if i == 0 {
|
||||
verifyOwnerRef(t, pvc, "Pod", false)
|
||||
} else {
|
||||
verifyOwnerRef(t, pvc, "Pod", test.expectPodOwnerRef)
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
@ -110,8 +110,8 @@ func newSTS(name, namespace string, replicas int) *appsv1.StatefulSet {
|
||||
{
|
||||
Name: "datadir",
|
||||
VolumeSource: v1.VolumeSource{
|
||||
HostPath: &v1.HostPathVolumeSource{
|
||||
Path: fmt.Sprintf("/tmp/%v", "datadir"),
|
||||
PersistentVolumeClaim: &v1.PersistentVolumeClaimVolumeSource{
|
||||
ClaimName: "fake-pvc-name",
|
||||
},
|
||||
},
|
||||
},
|
||||
@ -279,6 +279,35 @@ func getPods(t *testing.T, podClient typedv1.PodInterface, labelMap map[string]s
|
||||
return pods
|
||||
}
|
||||
|
||||
func getStatefulSetPVCs(t *testing.T, pvcClient typedv1.PersistentVolumeClaimInterface, sts *appsv1.StatefulSet) []*v1.PersistentVolumeClaim {
|
||||
pvcs := []*v1.PersistentVolumeClaim{}
|
||||
for i := int32(0); i < *sts.Spec.Replicas; i++ {
|
||||
pvcName := fmt.Sprintf("%s-%s-%d", sts.Spec.VolumeClaimTemplates[0].Name, sts.Name, i)
|
||||
pvc, err := pvcClient.Get(context.TODO(), pvcName, metav1.GetOptions{})
|
||||
if err != nil {
|
||||
t.Fatalf("failed to get PVC %s: %v", pvcName, err)
|
||||
}
|
||||
pvcs = append(pvcs, pvc)
|
||||
}
|
||||
return pvcs
|
||||
}
|
||||
|
||||
func verifyOwnerRef(t *testing.T, pvc *v1.PersistentVolumeClaim, kind string, expected bool) {
|
||||
found := false
|
||||
for _, ref := range pvc.GetOwnerReferences() {
|
||||
if ref.Kind == kind {
|
||||
if expected {
|
||||
found = true
|
||||
} else {
|
||||
t.Fatalf("Found %s ref but expected none for PVC %s", kind, pvc.Name)
|
||||
}
|
||||
}
|
||||
}
|
||||
if expected && !found {
|
||||
t.Fatalf("Expected %s ref but found none for PVC %s", kind, pvc.Name)
|
||||
}
|
||||
}
|
||||
|
||||
func updateSTS(t *testing.T, stsClient typedappsv1.StatefulSetInterface, stsName string, updateFunc func(*appsv1.StatefulSet)) *appsv1.StatefulSet {
|
||||
var sts *appsv1.StatefulSet
|
||||
if err := retry.RetryOnConflict(retry.DefaultBackoff, func() error {
|
||||
|
Loading…
Reference in New Issue
Block a user