Merge pull request #119272 from deads2k/resources
add list of served versions to storage version
This commit is contained in:
		| @@ -56,6 +56,11 @@ type APIGroupVersion struct { | ||||
| 	// GroupVersion is the external group version | ||||
| 	GroupVersion schema.GroupVersion | ||||
|  | ||||
| 	// AllServedVersionsByResource is indexed by resource and maps to a list of versions that resource exists in. | ||||
| 	// This was created so that StorageVersion for APIs can include a list of all version that are served for each | ||||
| 	// GroupResource tuple. | ||||
| 	AllServedVersionsByResource map[string][]string | ||||
|  | ||||
| 	// OptionsExternalVersion controls the Kubernetes APIVersion used for common objects in the apiserver | ||||
| 	// schema like api.Status, api.DeleteOptions, and metav1.ListOptions. Other implementors may | ||||
| 	// define a version "v1beta1" but want to use the Kubernetes "v1" internal objects. If | ||||
|   | ||||
| @@ -600,6 +600,7 @@ func (a *APIInstaller) registerResourceHandlers(path string, storage rest.Storag | ||||
| 		if a.group.ConvertabilityChecker != nil { | ||||
| 			decodableVersions = a.group.ConvertabilityChecker.VersionsForGroupKind(fqKindToRegister.GroupKind()) | ||||
| 		} | ||||
|  | ||||
| 		resourceInfo = &storageversion.ResourceInfo{ | ||||
| 			GroupResource: schema.GroupResource{ | ||||
| 				Group:    a.group.GroupVersion.Group, | ||||
| @@ -612,6 +613,8 @@ func (a *APIInstaller) registerResourceHandlers(path string, storage rest.Storag | ||||
| 			EquivalentResourceMapper: a.group.EquivalentResourceRegistry, | ||||
|  | ||||
| 			DirectlyDecodableVersions: decodableVersions, | ||||
|  | ||||
| 			ServedVersions: a.group.AllServedVersionsByResource[path], | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
|   | ||||
| @@ -911,9 +911,22 @@ func (s *GenericAPIServer) getAPIGroupVersion(apiGroupInfo *APIGroupInfo, groupV | ||||
| } | ||||
|  | ||||
| func (s *GenericAPIServer) newAPIGroupVersion(apiGroupInfo *APIGroupInfo, groupVersion schema.GroupVersion) *genericapi.APIGroupVersion { | ||||
|  | ||||
| 	allServedVersionsByResource := map[string][]string{} | ||||
| 	for version, resourcesInVersion := range apiGroupInfo.VersionedResourcesStorageMap { | ||||
| 		for resource := range resourcesInVersion { | ||||
| 			if len(groupVersion.Group) == 0 { | ||||
| 				allServedVersionsByResource[resource] = append(allServedVersionsByResource[resource], version) | ||||
| 			} else { | ||||
| 				allServedVersionsByResource[resource] = append(allServedVersionsByResource[resource], fmt.Sprintf("%s/%s", groupVersion.Group, version)) | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return &genericapi.APIGroupVersion{ | ||||
| 		GroupVersion:     groupVersion, | ||||
| 		MetaGroupVersion: apiGroupInfo.MetaGroupVersion, | ||||
| 		GroupVersion:                groupVersion, | ||||
| 		AllServedVersionsByResource: allServedVersionsByResource, | ||||
| 		MetaGroupVersion:            apiGroupInfo.MetaGroupVersion, | ||||
|  | ||||
| 		ParameterCodec:        apiGroupInfo.ParameterCodec, | ||||
| 		Serializer:            apiGroupInfo.NegotiatedSerializer, | ||||
|   | ||||
| @@ -25,7 +25,6 @@ import ( | ||||
| 	"k8s.io/apimachinery/pkg/runtime" | ||||
| 	"k8s.io/apimachinery/pkg/runtime/schema" | ||||
| 	utilruntime "k8s.io/apimachinery/pkg/util/runtime" | ||||
| 	serverstorage "k8s.io/apiserver/pkg/server/storage" | ||||
| 	"k8s.io/client-go/kubernetes" | ||||
| 	"k8s.io/client-go/rest" | ||||
| 	_ "k8s.io/component-base/metrics/prometheus/workqueue" // for workqueue metric registration | ||||
| @@ -45,6 +44,10 @@ type ResourceInfo struct { | ||||
| 	// DirectlyDecodableVersions is a list of versions that the converter for REST storage knows how to convert.  This | ||||
| 	// contains items like apiextensions.k8s.io/v1beta1 even if we don't serve that version. | ||||
| 	DirectlyDecodableVersions []schema.GroupVersion | ||||
|  | ||||
| 	// ServedVersions holds a list of all versions of GroupResource that are served.  Note that a server may be able to | ||||
| 	// decode a particular version, but still not serve it. | ||||
| 	ServedVersions []string | ||||
| } | ||||
|  | ||||
| // Manager records the resources whose StorageVersions need updates, and provides a method to update those StorageVersions. | ||||
| @@ -52,7 +55,7 @@ type Manager interface { | ||||
| 	// AddResourceInfo records resources whose StorageVersions need updates | ||||
| 	AddResourceInfo(resources ...*ResourceInfo) | ||||
| 	// UpdateStorageVersions tries to update the StorageVersions of the recorded resources | ||||
| 	UpdateStorageVersions(kubeAPIServerClientConfig *rest.Config, apiserverID string, apiResourceConfigSource serverstorage.APIResourceConfigSource) | ||||
| 	UpdateStorageVersions(kubeAPIServerClientConfig *rest.Config, apiserverID string) | ||||
| 	// PendingUpdate returns true if the StorageVersion of the given resource is still pending update. | ||||
| 	PendingUpdate(gr schema.GroupResource) bool | ||||
| 	// LastUpdateError returns the last error hit when updating the storage version of the given resource. | ||||
| @@ -112,7 +115,7 @@ func (s *defaultManager) addPendingManagedStatusLocked(r *ResourceInfo) { | ||||
| } | ||||
|  | ||||
| // UpdateStorageVersions tries to update the StorageVersions of the recorded resources | ||||
| func (s *defaultManager) UpdateStorageVersions(kubeAPIServerClientConfig *rest.Config, serverID string, apiResourceConfigSource serverstorage.APIResourceConfigSource) { | ||||
| func (s *defaultManager) UpdateStorageVersions(kubeAPIServerClientConfig *rest.Config, serverID string) { | ||||
| 	clientset, err := kubernetes.NewForConfig(kubeAPIServerClientConfig) | ||||
| 	if err != nil { | ||||
| 		utilruntime.HandleError(fmt.Errorf("failed to get clientset: %v", err)) | ||||
| @@ -145,12 +148,8 @@ func (s *defaultManager) UpdateStorageVersions(kubeAPIServerClientConfig *rest.C | ||||
| 			gr.Group = "core" | ||||
| 		} | ||||
|  | ||||
| 		servedVersions := []string{} | ||||
| 		for _, dv := range decodableVersions { | ||||
| 			if apiResourceConfigSource.ResourceEnabled(gr.WithVersion(dv)) { | ||||
| 				servedVersions = append(servedVersions, dv) | ||||
| 			} | ||||
| 		} | ||||
| 		servedVersions := r.ServedVersions | ||||
|  | ||||
| 		if err := updateStorageVersionFor(sc, serverID, gr, r.EncodingVersion, decodableVersions, servedVersions); err != nil { | ||||
| 			utilruntime.HandleError(fmt.Errorf("failed to update storage version for %v: %v", r.GroupResource, err)) | ||||
| 			s.recordStatusFailure(&r, err) | ||||
|   | ||||
| @@ -367,7 +367,7 @@ func (c completedConfig) NewWithDelegate(delegationTarget genericapiserver.Deleg | ||||
| 				// All apiservers (aggregator-apiserver, kube-apiserver, apiextensions-apiserver) | ||||
| 				// share the same generic apiserver config. The same StorageVersion manager is used | ||||
| 				// to register all built-in resources when the generic apiservers install APIs. | ||||
| 				s.GenericAPIServer.StorageVersionManager.UpdateStorageVersions(hookContext.LoopbackClientConfig, s.GenericAPIServer.APIServerID, c.GenericConfig.MergedResourceConfig) | ||||
| 				s.GenericAPIServer.StorageVersionManager.UpdateStorageVersions(hookContext.LoopbackClientConfig, s.GenericAPIServer.APIServerID) | ||||
| 				return false, nil | ||||
| 			}, hookContext.StopCh) | ||||
| 			// Once the storage version updater finishes the first round of update, | ||||
|   | ||||
| @@ -31,7 +31,6 @@ import ( | ||||
| 	"k8s.io/apimachinery/pkg/runtime/schema" | ||||
| 	"k8s.io/apimachinery/pkg/util/wait" | ||||
| 	"k8s.io/apiserver/pkg/features" | ||||
| 	serverstorage "k8s.io/apiserver/pkg/server/storage" | ||||
| 	"k8s.io/apiserver/pkg/storageversion" | ||||
| 	utilfeature "k8s.io/apiserver/pkg/util/feature" | ||||
| 	"k8s.io/client-go/dynamic" | ||||
| @@ -53,9 +52,9 @@ type wrappedStorageVersionManager struct { | ||||
| 	completed      <-chan struct{} | ||||
| } | ||||
|  | ||||
| func (w *wrappedStorageVersionManager) UpdateStorageVersions(loopbackClientConfig *rest.Config, serverID string, apiResourceConfigSource serverstorage.APIResourceConfigSource) { | ||||
| func (w *wrappedStorageVersionManager) UpdateStorageVersions(loopbackClientConfig *rest.Config, serverID string) { | ||||
| 	<-w.startUpdateSV | ||||
| 	w.Manager.UpdateStorageVersions(loopbackClientConfig, serverID, apiResourceConfigSource) | ||||
| 	w.Manager.UpdateStorageVersions(loopbackClientConfig, serverID) | ||||
| 	close(w.updateFinished) | ||||
| 	<-w.finishUpdateSV | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Kubernetes Prow Robot
					Kubernetes Prow Robot