From cfd8a389b7f6e05add70ce0c9ed287b4acf621fc Mon Sep 17 00:00:00 2001 From: Anthony Yeh Date: Thu, 23 Feb 2017 12:23:14 -0800 Subject: [PATCH] StatefulSet: Set DefaultGarbageCollectionPolicy to OrphanDependents. Now that StatefulSet adds ControllerRef to Pods it creates, we need to set this default so legacy behavior is maintained. --- pkg/registry/apps/petset/BUILD | 2 ++ pkg/registry/apps/petset/strategy.go | 7 +++++++ pkg/registry/apps/petset/strategy_test.go | 16 ++++++++++++---- 3 files changed, 21 insertions(+), 4 deletions(-) diff --git a/pkg/registry/apps/petset/BUILD b/pkg/registry/apps/petset/BUILD index d6b9ba448ac..edf6162bcd0 100644 --- a/pkg/registry/apps/petset/BUILD +++ b/pkg/registry/apps/petset/BUILD @@ -25,6 +25,7 @@ go_library( "//vendor:k8s.io/apimachinery/pkg/util/validation/field", "//vendor:k8s.io/apiserver/pkg/endpoints/request", "//vendor:k8s.io/apiserver/pkg/registry/generic", + "//vendor:k8s.io/apiserver/pkg/registry/rest", "//vendor:k8s.io/apiserver/pkg/storage", "//vendor:k8s.io/apiserver/pkg/storage/names", ], @@ -40,6 +41,7 @@ go_test( "//pkg/apis/apps:go_default_library", "//vendor:k8s.io/apimachinery/pkg/apis/meta/v1", "//vendor:k8s.io/apiserver/pkg/endpoints/request", + "//vendor:k8s.io/apiserver/pkg/registry/rest", ], ) diff --git a/pkg/registry/apps/petset/strategy.go b/pkg/registry/apps/petset/strategy.go index a60f8f7e284..4a61860baab 100644 --- a/pkg/registry/apps/petset/strategy.go +++ b/pkg/registry/apps/petset/strategy.go @@ -26,6 +26,7 @@ import ( "k8s.io/apimachinery/pkg/util/validation/field" genericapirequest "k8s.io/apiserver/pkg/endpoints/request" "k8s.io/apiserver/pkg/registry/generic" + "k8s.io/apiserver/pkg/registry/rest" "k8s.io/apiserver/pkg/storage" "k8s.io/apiserver/pkg/storage/names" "k8s.io/kubernetes/pkg/api" @@ -42,6 +43,12 @@ type statefulSetStrategy struct { // Strategy is the default logic that applies when creating and updating Replication StatefulSet objects. var Strategy = statefulSetStrategy{api.Scheme, names.SimpleNameGenerator} +// DefaultGarbageCollectionPolicy returns Orphan because that was the default +// behavior before the server-side garbage collection was implemented. +func (statefulSetStrategy) DefaultGarbageCollectionPolicy() rest.GarbageCollectionPolicy { + return rest.OrphanDependents +} + // NamespaceScoped returns true because all StatefulSet' need to be within a namespace. func (statefulSetStrategy) NamespaceScoped() bool { return true diff --git a/pkg/registry/apps/petset/strategy_test.go b/pkg/registry/apps/petset/strategy_test.go index 1690aa8ce96..99065690b09 100644 --- a/pkg/registry/apps/petset/strategy_test.go +++ b/pkg/registry/apps/petset/strategy_test.go @@ -21,6 +21,7 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" genericapirequest "k8s.io/apiserver/pkg/endpoints/request" + "k8s.io/apiserver/pkg/registry/rest" "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/apis/apps" ) @@ -62,7 +63,7 @@ func TestStatefulSetStrategy(t *testing.T) { } errs := Strategy.Validate(ctx, ps) if len(errs) != 0 { - t.Errorf("Unexpected error validating %v", errs) + t.Errorf("unexpected error validating %v", errs) } // Just Spec.Replicas is allowed to change @@ -77,14 +78,21 @@ func TestStatefulSetStrategy(t *testing.T) { Strategy.PrepareForUpdate(ctx, validPs, ps) errs = Strategy.ValidateUpdate(ctx, validPs, ps) if len(errs) != 0 { - t.Errorf("Updating spec.Replicas is allowed on a statefulset: %v", errs) + t.Errorf("updating spec.Replicas is allowed on a statefulset: %v", errs) } validPs.Spec.Selector = &metav1.LabelSelector{MatchLabels: map[string]string{"a": "bar"}} Strategy.PrepareForUpdate(ctx, validPs, ps) errs = Strategy.ValidateUpdate(ctx, validPs, ps) if len(errs) == 0 { - t.Errorf("Expected a validation error since updates are disallowed on statefulsets.") + t.Errorf("expected a validation error since updates are disallowed on statefulsets.") + } + + // Make sure we correctly implement the interface. + // Otherwise a typo could silently change the default. + var gcds rest.GarbageCollectionDeleteStrategy = Strategy + if got, want := gcds.DefaultGarbageCollectionPolicy(), rest.OrphanDependents; got != want { + t.Errorf("DefaultGarbageCollectionPolicy() = %#v, want %#v", got, want) } } @@ -140,6 +148,6 @@ func TestStatefulSetStatusStrategy(t *testing.T) { } errs := StatusStrategy.ValidateUpdate(ctx, newPS, oldPS) if len(errs) != 0 { - t.Errorf("Unexpected error %v", errs) + t.Errorf("unexpected error %v", errs) } }