mirror of
				https://github.com/optim-enterprises-bv/kubernetes.git
				synced 2025-11-03 19:58:17 +00:00 
			
		
		
		
	EnableGarbageCollection should be a struct member on RESTOptions
Not a global. Now that we have RESTOptions this was an easy change.
This commit is contained in:
		@@ -24,7 +24,6 @@ import (
 | 
			
		||||
	genericoptions "k8s.io/kubernetes/pkg/genericapiserver/options"
 | 
			
		||||
	kubeletclient "k8s.io/kubernetes/pkg/kubelet/client"
 | 
			
		||||
	"k8s.io/kubernetes/pkg/master/ports"
 | 
			
		||||
	"k8s.io/kubernetes/pkg/registry/generic/registry"
 | 
			
		||||
 | 
			
		||||
	"github.com/spf13/pflag"
 | 
			
		||||
)
 | 
			
		||||
@@ -123,8 +122,4 @@ func (s *APIServer) AddFlags(fs *pflag.FlagSet) {
 | 
			
		||||
		"If true, server will do its best to fix the update request to pass the validation, "+
 | 
			
		||||
		"e.g., setting empty UID in update request to its existing value. This flag can be turned off "+
 | 
			
		||||
		"after we fix all the clients that send malformed updates.")
 | 
			
		||||
 | 
			
		||||
	fs.BoolVar(®istry.EnableGarbageCollector, "enable-garbage-collector", true, ""+
 | 
			
		||||
		"Enables the generic garbage collector. MUST be synced with the corresponding flag "+
 | 
			
		||||
		"of the kube-controller-manager.")
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -72,13 +72,14 @@ type Config struct {
 | 
			
		||||
	// Allows api group versions or specific resources to be conditionally enabled/disabled.
 | 
			
		||||
	APIResourceConfigSource APIResourceConfigSource
 | 
			
		||||
	// allow downstream consumers to disable the index route
 | 
			
		||||
	EnableIndex           bool
 | 
			
		||||
	EnableProfiling       bool
 | 
			
		||||
	EnableWatchCache      bool
 | 
			
		||||
	APIPrefix             string
 | 
			
		||||
	APIGroupPrefix        string
 | 
			
		||||
	CorsAllowedOriginList []string
 | 
			
		||||
	Authenticator         authenticator.Request
 | 
			
		||||
	EnableIndex             bool
 | 
			
		||||
	EnableProfiling         bool
 | 
			
		||||
	EnableWatchCache        bool
 | 
			
		||||
	EnableGarbageCollection bool
 | 
			
		||||
	APIPrefix               string
 | 
			
		||||
	APIGroupPrefix          string
 | 
			
		||||
	CorsAllowedOriginList   []string
 | 
			
		||||
	Authenticator           authenticator.Request
 | 
			
		||||
	// TODO(roberthbailey): Remove once the server no longer supports http basic auth.
 | 
			
		||||
	SupportsBasicAuth      bool
 | 
			
		||||
	Authorizer             authorizer.Authorizer
 | 
			
		||||
@@ -169,6 +170,7 @@ func NewConfig(options *options.ServerRunOptions) *Config {
 | 
			
		||||
		AuditLogMaxAge:            options.AuditLogMaxAge,
 | 
			
		||||
		AuditLogMaxBackups:        options.AuditLogMaxBackups,
 | 
			
		||||
		AuditLogMaxSize:           options.AuditLogMaxSize,
 | 
			
		||||
		EnableGarbageCollection:   options.EnableGarbageCollection,
 | 
			
		||||
		EnableIndex:               true,
 | 
			
		||||
		EnableLogsSupport:         options.EnableLogsSupport,
 | 
			
		||||
		EnableProfiling:           options.EnableProfiling,
 | 
			
		||||
 
 | 
			
		||||
@@ -83,6 +83,7 @@ type ServerRunOptions struct {
 | 
			
		||||
	AuditLogMaxAge            int
 | 
			
		||||
	AuditLogMaxBackups        int
 | 
			
		||||
	AuditLogMaxSize           int
 | 
			
		||||
	EnableGarbageCollection   bool
 | 
			
		||||
	EnableLogsSupport         bool
 | 
			
		||||
	EnableProfiling           bool
 | 
			
		||||
	EnableSwaggerUI           bool
 | 
			
		||||
@@ -133,6 +134,7 @@ func NewServerRunOptions() *ServerRunOptions {
 | 
			
		||||
		DefaultStorageMediaType:                  "application/json",
 | 
			
		||||
		DefaultStorageVersions:                   registered.AllPreferredGroupVersions(),
 | 
			
		||||
		DeleteCollectionWorkers:                  1,
 | 
			
		||||
		EnableGarbageCollection:                  true,
 | 
			
		||||
		EnableLogsSupport:                        true,
 | 
			
		||||
		EnableProfiling:                          true,
 | 
			
		||||
		EnableWatchCache:                         true,
 | 
			
		||||
@@ -306,6 +308,10 @@ func (s *ServerRunOptions) AddUniversalFlags(fs *pflag.FlagSet) {
 | 
			
		||||
	fs.IntVar(&s.AuditLogMaxSize, "audit-log-maxsize", s.AuditLogMaxSize,
 | 
			
		||||
		"The maximum size in megabytes of the audit log file before it gets rotated. Defaults to 100MB.")
 | 
			
		||||
 | 
			
		||||
	fs.BoolVar(&s.EnableGarbageCollection, "enable-garbage-collector", s.EnableGarbageCollection, ""+
 | 
			
		||||
		"Enables the generic garbage collector. MUST be synced with the corresponding flag "+
 | 
			
		||||
		"of the kube-controller-manager.")
 | 
			
		||||
 | 
			
		||||
	fs.BoolVar(&s.EnableProfiling, "profiling", s.EnableProfiling,
 | 
			
		||||
		"Enable profiling via web interface host:port/debug/pprof/")
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -781,6 +781,7 @@ func (m *Master) GetRESTOptionsOrDie(c *Config, resource unversioned.GroupResour
 | 
			
		||||
		StorageConfig:           storageConfig,
 | 
			
		||||
		Decorator:               m.StorageDecorator(),
 | 
			
		||||
		DeleteCollectionWorkers: m.deleteCollectionWorkers,
 | 
			
		||||
		EnableGarbageCollection: c.Config.EnableGarbageCollection,
 | 
			
		||||
		ResourcePrefix:          c.StorageFactory.ResourcePrefix(resource),
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -20,9 +20,10 @@ import "k8s.io/kubernetes/pkg/storage/storagebackend"
 | 
			
		||||
 | 
			
		||||
// RESTOptions is set of configuration options to generic registries.
 | 
			
		||||
type RESTOptions struct {
 | 
			
		||||
	StorageConfig           *storagebackend.Config
 | 
			
		||||
	Decorator               StorageDecorator
 | 
			
		||||
	DeleteCollectionWorkers int
 | 
			
		||||
	StorageConfig *storagebackend.Config
 | 
			
		||||
	Decorator     StorageDecorator
 | 
			
		||||
 | 
			
		||||
	ResourcePrefix string
 | 
			
		||||
	EnableGarbageCollection bool
 | 
			
		||||
	DeleteCollectionWorkers int
 | 
			
		||||
	ResourcePrefix          string
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -42,10 +42,6 @@ import (
 | 
			
		||||
	"github.com/golang/glog"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// EnableGarbageCollector affects the handling of Update and Delete requests. It
 | 
			
		||||
// must be synced with the corresponding flag in kube-controller-manager.
 | 
			
		||||
var EnableGarbageCollector bool
 | 
			
		||||
 | 
			
		||||
// Store implements generic.Registry.
 | 
			
		||||
// It's intended to be embeddable, so that you can implement any
 | 
			
		||||
// non-generic functions if needed.
 | 
			
		||||
@@ -93,6 +89,10 @@ type Store struct {
 | 
			
		||||
	// Called to cleanup storage clients.
 | 
			
		||||
	DestroyFunc func()
 | 
			
		||||
 | 
			
		||||
	// EnableGarbageCollection affects the handling of Update and Delete requests. It
 | 
			
		||||
	// must be synced with the corresponding flag in kube-controller-manager.
 | 
			
		||||
	EnableGarbageCollection bool
 | 
			
		||||
 | 
			
		||||
	// DeleteCollectionWorkers is the maximum number of workers in a single
 | 
			
		||||
	// DeleteCollection call.
 | 
			
		||||
	DeleteCollectionWorkers int
 | 
			
		||||
@@ -272,7 +272,7 @@ func (e *Store) Create(ctx api.Context, obj runtime.Object) (runtime.Object, err
 | 
			
		||||
// it further checks if the object's DeletionGracePeriodSeconds is 0. If so, it
 | 
			
		||||
// returns true.
 | 
			
		||||
func (e *Store) shouldDelete(ctx api.Context, key string, obj, existing runtime.Object) bool {
 | 
			
		||||
	if !EnableGarbageCollector {
 | 
			
		||||
	if !e.EnableGarbageCollection {
 | 
			
		||||
		return false
 | 
			
		||||
	}
 | 
			
		||||
	newMeta, err := api.ObjectMetaFor(obj)
 | 
			
		||||
@@ -694,7 +694,7 @@ func (e *Store) Delete(ctx api.Context, name string, options *api.DeleteOptions)
 | 
			
		||||
	var ignoreNotFound bool
 | 
			
		||||
	var deleteImmediately bool = true
 | 
			
		||||
	var lastExisting, out runtime.Object
 | 
			
		||||
	if !EnableGarbageCollector {
 | 
			
		||||
	if !e.EnableGarbageCollection {
 | 
			
		||||
		// TODO: remove the check on graceful, because we support no-op updates now.
 | 
			
		||||
		if graceful {
 | 
			
		||||
			err, ignoreNotFound, deleteImmediately, out, lastExisting = e.updateForGracefulDeletion(ctx, name, key, options, preconditions, obj)
 | 
			
		||||
 
 | 
			
		||||
@@ -618,9 +618,7 @@ func TestStoreDelete(t *testing.T) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestGracefulStoreHandleFinalizers(t *testing.T) {
 | 
			
		||||
	EnableGarbageCollector = true
 | 
			
		||||
	initialGeneration := int64(1)
 | 
			
		||||
	defer func() { EnableGarbageCollector = false }()
 | 
			
		||||
	podWithFinalizer := &api.Pod{
 | 
			
		||||
		ObjectMeta: api.ObjectMeta{Name: "foo", Finalizers: []string{"foo.com/x"}, Generation: initialGeneration},
 | 
			
		||||
		Spec:       api.PodSpec{NodeName: "machine"},
 | 
			
		||||
@@ -628,6 +626,7 @@ func TestGracefulStoreHandleFinalizers(t *testing.T) {
 | 
			
		||||
 | 
			
		||||
	testContext := api.WithNamespace(api.NewContext(), "test")
 | 
			
		||||
	destroyFunc, registry := NewTestGenericStoreRegistry(t)
 | 
			
		||||
	registry.EnableGarbageCollection = true
 | 
			
		||||
	defaultDeleteStrategy := testRESTStrategy{api.Scheme, api.SimpleNameGenerator, true, false, true}
 | 
			
		||||
	registry.DeleteStrategy = testGracefulStrategy{defaultDeleteStrategy}
 | 
			
		||||
	defer destroyFunc()
 | 
			
		||||
@@ -678,9 +677,7 @@ func TestGracefulStoreHandleFinalizers(t *testing.T) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestNonGracefulStoreHandleFinalizers(t *testing.T) {
 | 
			
		||||
	EnableGarbageCollector = true
 | 
			
		||||
	initialGeneration := int64(1)
 | 
			
		||||
	defer func() { EnableGarbageCollector = false }()
 | 
			
		||||
	podWithFinalizer := &api.Pod{
 | 
			
		||||
		ObjectMeta: api.ObjectMeta{Name: "foo", Finalizers: []string{"foo.com/x"}, Generation: initialGeneration},
 | 
			
		||||
		Spec:       api.PodSpec{NodeName: "machine"},
 | 
			
		||||
@@ -688,6 +685,7 @@ func TestNonGracefulStoreHandleFinalizers(t *testing.T) {
 | 
			
		||||
 | 
			
		||||
	testContext := api.WithNamespace(api.NewContext(), "test")
 | 
			
		||||
	destroyFunc, registry := NewTestGenericStoreRegistry(t)
 | 
			
		||||
	registry.EnableGarbageCollection = true
 | 
			
		||||
	defer destroyFunc()
 | 
			
		||||
	// create pod
 | 
			
		||||
	_, err := registry.Create(testContext, podWithFinalizer)
 | 
			
		||||
@@ -755,9 +753,7 @@ func TestNonGracefulStoreHandleFinalizers(t *testing.T) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestStoreDeleteWithOrphanDependents(t *testing.T) {
 | 
			
		||||
	EnableGarbageCollector = true
 | 
			
		||||
	initialGeneration := int64(1)
 | 
			
		||||
	defer func() { EnableGarbageCollector = false }()
 | 
			
		||||
	podWithOrphanFinalizer := func(name string) *api.Pod {
 | 
			
		||||
		return &api.Pod{
 | 
			
		||||
			ObjectMeta: api.ObjectMeta{Name: name, Finalizers: []string{"foo.com/x", api.FinalizerOrphan, "bar.com/y"}, Generation: initialGeneration},
 | 
			
		||||
@@ -984,6 +980,7 @@ func TestStoreDeleteWithOrphanDependents(t *testing.T) {
 | 
			
		||||
 | 
			
		||||
	testContext := api.WithNamespace(api.NewContext(), "test")
 | 
			
		||||
	destroyFunc, registry := NewTestGenericStoreRegistry(t)
 | 
			
		||||
	registry.EnableGarbageCollection = true
 | 
			
		||||
	defer destroyFunc()
 | 
			
		||||
 | 
			
		||||
	for _, tc := range testcases {
 | 
			
		||||
 
 | 
			
		||||
@@ -38,7 +38,6 @@ import (
 | 
			
		||||
	"k8s.io/kubernetes/pkg/client/typed/dynamic"
 | 
			
		||||
	"k8s.io/kubernetes/pkg/controller/garbagecollector"
 | 
			
		||||
	"k8s.io/kubernetes/pkg/controller/garbagecollector/metaonly"
 | 
			
		||||
	"k8s.io/kubernetes/pkg/registry/generic/registry"
 | 
			
		||||
	"k8s.io/kubernetes/pkg/runtime/serializer"
 | 
			
		||||
	"k8s.io/kubernetes/pkg/types"
 | 
			
		||||
	"k8s.io/kubernetes/pkg/util/wait"
 | 
			
		||||
@@ -121,6 +120,7 @@ func newOwnerRC(name, namespace string) *v1.ReplicationController {
 | 
			
		||||
func setup(t *testing.T) (*httptest.Server, *garbagecollector.GarbageCollector, clientset.Interface) {
 | 
			
		||||
	masterConfig := framework.NewIntegrationTestMasterConfig()
 | 
			
		||||
	masterConfig.EnableCoreControllers = false
 | 
			
		||||
	masterConfig.EnableGarbageCollection = true
 | 
			
		||||
	_, s := framework.RunAMaster(masterConfig)
 | 
			
		||||
 | 
			
		||||
	clientSet, err := clientset.NewForConfig(&restclient.Config{Host: s.URL})
 | 
			
		||||
@@ -153,9 +153,6 @@ func TestCascadingDeletion(t *testing.T) {
 | 
			
		||||
	ns := framework.CreateTestingNamespace("gc-cascading-deletion", s, t)
 | 
			
		||||
	defer framework.DeleteTestingNamespace(ns, s, t)
 | 
			
		||||
 | 
			
		||||
	oldEnableGarbageCollector := registry.EnableGarbageCollector
 | 
			
		||||
	registry.EnableGarbageCollector = true
 | 
			
		||||
	defer func() { registry.EnableGarbageCollector = oldEnableGarbageCollector }()
 | 
			
		||||
	rcClient := clientSet.Core().ReplicationControllers(ns.Name)
 | 
			
		||||
	podClient := clientSet.Core().Pods(ns.Name)
 | 
			
		||||
 | 
			
		||||
@@ -262,9 +259,6 @@ func TestCreateWithNonExistentOwner(t *testing.T) {
 | 
			
		||||
	ns := framework.CreateTestingNamespace("gc-non-existing-owner", s, t)
 | 
			
		||||
	defer framework.DeleteTestingNamespace(ns, s, t)
 | 
			
		||||
 | 
			
		||||
	oldEnableGarbageCollector := registry.EnableGarbageCollector
 | 
			
		||||
	registry.EnableGarbageCollector = true
 | 
			
		||||
	defer func() { registry.EnableGarbageCollector = oldEnableGarbageCollector }()
 | 
			
		||||
	podClient := clientSet.Core().Pods(ns.Name)
 | 
			
		||||
 | 
			
		||||
	pod := newPod(garbageCollectedPodName, ns.Name, []v1.OwnerReference{{UID: "doesn't matter", Name: toBeDeletedRCName}})
 | 
			
		||||
@@ -367,9 +361,6 @@ func TestStressingCascadingDeletion(t *testing.T) {
 | 
			
		||||
	ns := framework.CreateTestingNamespace("gc-stressing-cascading-deletion", s, t)
 | 
			
		||||
	defer framework.DeleteTestingNamespace(ns, s, t)
 | 
			
		||||
 | 
			
		||||
	oldEnableGarbageCollector := registry.EnableGarbageCollector
 | 
			
		||||
	registry.EnableGarbageCollector = true
 | 
			
		||||
	defer func() { registry.EnableGarbageCollector = oldEnableGarbageCollector }()
 | 
			
		||||
	stopCh := make(chan struct{})
 | 
			
		||||
	go gc.Run(5, stopCh)
 | 
			
		||||
	defer close(stopCh)
 | 
			
		||||
@@ -452,9 +443,6 @@ func TestOrphaning(t *testing.T) {
 | 
			
		||||
	ns := framework.CreateTestingNamespace("gc-orphaning", s, t)
 | 
			
		||||
	defer framework.DeleteTestingNamespace(ns, s, t)
 | 
			
		||||
 | 
			
		||||
	oldEnableGarbageCollector := registry.EnableGarbageCollector
 | 
			
		||||
	registry.EnableGarbageCollector = true
 | 
			
		||||
	defer func() { registry.EnableGarbageCollector = oldEnableGarbageCollector }()
 | 
			
		||||
	podClient := clientSet.Core().Pods(ns.Name)
 | 
			
		||||
	rcClient := clientSet.Core().ReplicationControllers(ns.Name)
 | 
			
		||||
	// create the RC with the orphan finalizer set
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user