Fix: StorageObjectCountTracker is nil, apf estimator got ObjectCountNotFoundErr
This commit is contained in:
		| @@ -140,6 +140,9 @@ func BuildGenericConfig( | ||||
| 	if lastErr != nil { | ||||
| 		return | ||||
| 	} | ||||
| 	// storageFactory.StorageConfig is copied from etcdOptions.StorageConfig, | ||||
| 	// the StorageObjectCountTracker is still nil. Here we copy from genericConfig. | ||||
| 	storageFactory.StorageConfig.StorageObjectCountTracker = genericConfig.StorageObjectCountTracker | ||||
| 	if lastErr = s.Etcd.ApplyWithStorageFactoryTo(storageFactory, genericConfig); lastErr != nil { | ||||
| 		return | ||||
| 	} | ||||
|   | ||||
							
								
								
									
										58
									
								
								pkg/controlplane/apiserver/config_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										58
									
								
								pkg/controlplane/apiserver/config_test.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,58 @@ | ||||
| package apiserver | ||||
|  | ||||
| import ( | ||||
| 	extensionsapiserver "k8s.io/apiextensions-apiserver/pkg/apiserver" | ||||
| 	"k8s.io/apimachinery/pkg/runtime" | ||||
| 	"k8s.io/apimachinery/pkg/runtime/schema" | ||||
| 	apiserveroptions "k8s.io/apiserver/pkg/server/options" | ||||
| 	aggregatorscheme "k8s.io/kube-aggregator/pkg/apiserver/scheme" | ||||
| 	"k8s.io/kubernetes/pkg/api/legacyscheme" | ||||
| 	"k8s.io/kubernetes/pkg/controlplane/apiserver/options" | ||||
| 	generatedopenapi "k8s.io/kubernetes/pkg/generated/openapi" | ||||
| 	netutils "k8s.io/utils/net" | ||||
| 	"net" | ||||
| 	"testing" | ||||
| ) | ||||
|  | ||||
| func TestBuildGenericConfig(t *testing.T) { | ||||
| 	opts := options.NewOptions() | ||||
| 	s := (&apiserveroptions.SecureServingOptions{ | ||||
| 		BindAddress: netutils.ParseIPSloppy("127.0.0.1"), | ||||
| 	}).WithLoopback() | ||||
| 	ln, err := net.Listen("tcp", "127.0.0.1:0") | ||||
| 	if err != nil { | ||||
| 		t.Fatalf("failed to listen on 127.0.0.1:0") | ||||
| 	} | ||||
| 	defer ln.Close() | ||||
| 	s.Listener = ln | ||||
| 	s.BindPort = ln.Addr().(*net.TCPAddr).Port | ||||
| 	opts.SecureServing = s | ||||
|  | ||||
| 	completedOptions, err := opts.Complete(nil, nil) | ||||
| 	if err != nil { | ||||
| 		t.Fatalf("Failed to complete apiserver options: %v", err) | ||||
| 	} | ||||
|  | ||||
| 	genericConfig, _, storageFactory, err := BuildGenericConfig( | ||||
| 		completedOptions, | ||||
| 		[]*runtime.Scheme{legacyscheme.Scheme, extensionsapiserver.Scheme, aggregatorscheme.Scheme}, | ||||
| 		generatedopenapi.GetOpenAPIDefinitions, | ||||
| 	) | ||||
| 	if err != nil { | ||||
| 		t.Fatalf("Failed to build generic config: %v", err) | ||||
| 	} | ||||
| 	if genericConfig.StorageObjectCountTracker == nil { | ||||
| 		t.Errorf("genericConfig StorageObjectCountTracker is absent") | ||||
| 	} | ||||
| 	if genericConfig.StorageObjectCountTracker != storageFactory.StorageConfig.StorageObjectCountTracker { | ||||
| 		t.Errorf("There are different StorageObjectCountTracker in genericConfig and storageFactory") | ||||
| 	} | ||||
|  | ||||
| 	restOptions, err := genericConfig.RESTOptionsGetter.GetRESTOptions(schema.GroupResource{Group: "", Resource: ""}) | ||||
| 	if err != nil { | ||||
| 		t.Fatal(err) | ||||
| 	} | ||||
| 	if restOptions.StorageConfig.StorageObjectCountTracker != genericConfig.StorageObjectCountTracker { | ||||
| 		t.Errorf("There are different StorageObjectCountTracker in restOptions and serverConfig") | ||||
| 	} | ||||
| } | ||||
| @@ -396,7 +396,7 @@ func (f *StorageFactoryRestOptionsFactory) GetRESTOptions(resource schema.GroupR | ||||
| 		EnableGarbageCollection:   f.Options.EnableGarbageCollection, | ||||
| 		ResourcePrefix:            f.StorageFactory.ResourcePrefix(resource), | ||||
| 		CountMetricPollPeriod:     f.Options.StorageConfig.CountMetricPollPeriod, | ||||
| 		StorageObjectCountTracker: f.Options.StorageConfig.StorageObjectCountTracker, | ||||
| 		StorageObjectCountTracker: storageConfig.StorageObjectCountTracker, | ||||
| 	} | ||||
|  | ||||
| 	if f.Options.EnableWatchCache { | ||||
|   | ||||
| @@ -430,3 +430,18 @@ func healthChecksAreEqual(t *testing.T, want []string, healthChecks []healthz.He | ||||
| 		t.Errorf("%s checks are not equal, missing=%q, extra=%q", checkerType, wantSet.Difference(gotSet).List(), gotSet.Difference(wantSet).List()) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func TestRestOptionsStorageObjectCountTracker(t *testing.T) { | ||||
| 	serverConfig := server.NewConfig(codecs) | ||||
| 	etcdOptions := &EtcdOptions{} | ||||
| 	if err := etcdOptions.ApplyTo(serverConfig); err != nil { | ||||
| 		t.Fatalf("Failed to apply etcd options error: %v", err) | ||||
| 	} | ||||
| 	restOptions, err := serverConfig.RESTOptionsGetter.GetRESTOptions(schema.GroupResource{Group: "", Resource: ""}) | ||||
| 	if err != nil { | ||||
| 		t.Fatal(err) | ||||
| 	} | ||||
| 	if restOptions.StorageConfig.StorageObjectCountTracker != serverConfig.StorageObjectCountTracker { | ||||
| 		t.Errorf("There are different StorageObjectCountTracker in restOptions and serverConfig") | ||||
| 	} | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 chenk008
					chenk008