mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-09-21 09:57:52 +00:00
Check request info when updating managed fields during scale
- Test all versions to make sure each resource version is in the mappings - Fail when request info contains an unrecognized version. We have tests that guarantee that all known versions are in the mappings. If we get a version in request info that is not there we should fail fast to prevent inconsistent behaviour (e.g. for some reason the mappings is not up to date). Ensure all known versions are in mappings
This commit is contained in:
@@ -26,12 +26,14 @@ import (
|
||||
"k8s.io/apimachinery/pkg/runtime"
|
||||
"k8s.io/apimachinery/pkg/runtime/schema"
|
||||
"k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager"
|
||||
genericapirequest "k8s.io/apiserver/pkg/endpoints/request"
|
||||
"k8s.io/apiserver/pkg/registry/generic"
|
||||
genericregistry "k8s.io/apiserver/pkg/registry/generic/registry"
|
||||
"k8s.io/apiserver/pkg/registry/rest"
|
||||
"k8s.io/apiserver/pkg/storage"
|
||||
storeerr "k8s.io/apiserver/pkg/storage/errors"
|
||||
"k8s.io/apiserver/pkg/util/dryrun"
|
||||
"k8s.io/klog/v2"
|
||||
"k8s.io/kubernetes/pkg/apis/apps"
|
||||
appsv1beta1 "k8s.io/kubernetes/pkg/apis/apps/v1beta1"
|
||||
appsv1beta2 "k8s.io/kubernetes/pkg/apis/apps/v1beta2"
|
||||
@@ -55,9 +57,16 @@ type DeploymentStorage struct {
|
||||
Rollback *RollbackREST
|
||||
}
|
||||
|
||||
// ReplicasPathMappings returns the mappings between each group version and a replicas path
|
||||
func ReplicasPathMappings() fieldmanager.ResourcePathMappings {
|
||||
return replicasPathInDeployment
|
||||
}
|
||||
|
||||
// maps a group version to the replicas path in a deployment object
|
||||
var replicasPathInDeployment = fieldmanager.ResourcePathMappings{
|
||||
schema.GroupVersion{Group: "apps", Version: "v1"}.String(): fieldpath.MakePathOrDie("spec", "replicas"),
|
||||
schema.GroupVersion{Group: "apps", Version: "v1beta1"}.String(): fieldpath.MakePathOrDie("spec", "replicas"),
|
||||
schema.GroupVersion{Group: "apps", Version: "v1beta2"}.String(): fieldpath.MakePathOrDie("spec", "replicas"),
|
||||
schema.GroupVersion{Group: "apps", Version: "v1"}.String(): fieldpath.MakePathOrDie("spec", "replicas"),
|
||||
}
|
||||
|
||||
// NewStorage returns new instance of DeploymentStorage.
|
||||
@@ -383,9 +392,19 @@ func (i *scaleUpdatedObjectInfo) UpdatedObject(ctx context.Context, oldObj runti
|
||||
return nil, errors.NewNotFound(apps.Resource("deployments/scale"), i.name)
|
||||
}
|
||||
|
||||
groupVersion := schema.GroupVersion{Group: "apps", Version: "v1"}
|
||||
if requestInfo, found := genericapirequest.RequestInfoFrom(ctx); found {
|
||||
requestGroupVersion := schema.GroupVersion{Group: requestInfo.APIGroup, Version: requestInfo.APIVersion}
|
||||
if _, ok := replicasPathInDeployment[requestGroupVersion.String()]; ok {
|
||||
groupVersion = requestGroupVersion
|
||||
} else {
|
||||
klog.Fatal("Unrecognized group/version in request info %q", requestGroupVersion.String())
|
||||
}
|
||||
}
|
||||
|
||||
managedFieldsHandler := fieldmanager.NewScaleHandler(
|
||||
deployment.ManagedFields,
|
||||
schema.GroupVersion{Group: "apps", Version: "v1"},
|
||||
groupVersion,
|
||||
replicasPathInDeployment,
|
||||
)
|
||||
|
||||
|
@@ -27,9 +27,11 @@ import (
|
||||
"k8s.io/apimachinery/pkg/runtime"
|
||||
"k8s.io/apimachinery/pkg/runtime/schema"
|
||||
"k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager"
|
||||
genericapirequest "k8s.io/apiserver/pkg/endpoints/request"
|
||||
"k8s.io/apiserver/pkg/registry/generic"
|
||||
genericregistry "k8s.io/apiserver/pkg/registry/generic/registry"
|
||||
"k8s.io/apiserver/pkg/registry/rest"
|
||||
"k8s.io/klog/v2"
|
||||
"k8s.io/kubernetes/pkg/apis/apps"
|
||||
appsv1beta1 "k8s.io/kubernetes/pkg/apis/apps/v1beta1"
|
||||
appsv1beta2 "k8s.io/kubernetes/pkg/apis/apps/v1beta2"
|
||||
@@ -51,9 +53,15 @@ type ReplicaSetStorage struct {
|
||||
Scale *ScaleREST
|
||||
}
|
||||
|
||||
// ReplicasPathMappings returns the mappings between each group version and a replicas path
|
||||
func ReplicasPathMappings() fieldmanager.ResourcePathMappings {
|
||||
return replicasPathInReplicaSet
|
||||
}
|
||||
|
||||
// maps a group version to the replicas path in a replicaset object
|
||||
var replicasPathInReplicaSet = fieldmanager.ResourcePathMappings{
|
||||
schema.GroupVersion{Group: "apps", Version: "v1"}.String(): fieldpath.MakePathOrDie("spec", "replicas"),
|
||||
schema.GroupVersion{Group: "apps", Version: "v1beta2"}.String(): fieldpath.MakePathOrDie("spec", "replicas"),
|
||||
schema.GroupVersion{Group: "apps", Version: "v1"}.String(): fieldpath.MakePathOrDie("spec", "replicas"),
|
||||
}
|
||||
|
||||
// NewStorage returns new instance of ReplicaSetStorage.
|
||||
@@ -285,9 +293,19 @@ func (i *scaleUpdatedObjectInfo) UpdatedObject(ctx context.Context, oldObj runti
|
||||
return nil, errors.NewNotFound(apps.Resource("replicasets/scale"), i.name)
|
||||
}
|
||||
|
||||
groupVersion := schema.GroupVersion{Group: "apps", Version: "v1"}
|
||||
if requestInfo, found := genericapirequest.RequestInfoFrom(ctx); found {
|
||||
requestGroupVersion := schema.GroupVersion{Group: requestInfo.APIGroup, Version: requestInfo.APIVersion}
|
||||
if _, ok := replicasPathInReplicaSet[requestGroupVersion.String()]; ok {
|
||||
groupVersion = requestGroupVersion
|
||||
} else {
|
||||
klog.Fatal("Unrecognized group/version in request info %q", requestGroupVersion.String())
|
||||
}
|
||||
}
|
||||
|
||||
managedFieldsHandler := fieldmanager.NewScaleHandler(
|
||||
replicaset.ManagedFields,
|
||||
schema.GroupVersion{Group: "apps", Version: "v1"},
|
||||
groupVersion,
|
||||
replicasPathInReplicaSet,
|
||||
)
|
||||
|
||||
|
@@ -25,9 +25,11 @@ import (
|
||||
"k8s.io/apimachinery/pkg/runtime"
|
||||
"k8s.io/apimachinery/pkg/runtime/schema"
|
||||
"k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager"
|
||||
genericapirequest "k8s.io/apiserver/pkg/endpoints/request"
|
||||
"k8s.io/apiserver/pkg/registry/generic"
|
||||
genericregistry "k8s.io/apiserver/pkg/registry/generic/registry"
|
||||
"k8s.io/apiserver/pkg/registry/rest"
|
||||
"k8s.io/klog/v2"
|
||||
"k8s.io/kubernetes/pkg/apis/apps"
|
||||
appsv1beta1 "k8s.io/kubernetes/pkg/apis/apps/v1beta1"
|
||||
appsv1beta2 "k8s.io/kubernetes/pkg/apis/apps/v1beta2"
|
||||
@@ -48,9 +50,16 @@ type StatefulSetStorage struct {
|
||||
Scale *ScaleREST
|
||||
}
|
||||
|
||||
// ReplicasPathMappings returns the mappings between each group version and a replicas path
|
||||
func ReplicasPathMappings() fieldmanager.ResourcePathMappings {
|
||||
return replicasPathInStatefulSet
|
||||
}
|
||||
|
||||
// maps a group version to the replicas path in a statefulset object
|
||||
var replicasPathInStatefulSet = fieldmanager.ResourcePathMappings{
|
||||
schema.GroupVersion{Group: "apps", Version: "v1"}.String(): fieldpath.MakePathOrDie("spec", "replicas"),
|
||||
schema.GroupVersion{Group: "apps", Version: "v1beta1"}.String(): fieldpath.MakePathOrDie("spec", "replicas"),
|
||||
schema.GroupVersion{Group: "apps", Version: "v1beta2"}.String(): fieldpath.MakePathOrDie("spec", "replicas"),
|
||||
schema.GroupVersion{Group: "apps", Version: "v1"}.String(): fieldpath.MakePathOrDie("spec", "replicas"),
|
||||
}
|
||||
|
||||
// NewStorage returns new instance of StatefulSetStorage.
|
||||
@@ -271,9 +280,19 @@ func (i *scaleUpdatedObjectInfo) UpdatedObject(ctx context.Context, oldObj runti
|
||||
return nil, errors.NewNotFound(apps.Resource("statefulsets/scale"), i.name)
|
||||
}
|
||||
|
||||
groupVersion := schema.GroupVersion{Group: "apps", Version: "v1"}
|
||||
if requestInfo, found := genericapirequest.RequestInfoFrom(ctx); found {
|
||||
requestGroupVersion := schema.GroupVersion{Group: requestInfo.APIGroup, Version: requestInfo.APIVersion}
|
||||
if _, ok := replicasPathInStatefulSet[requestGroupVersion.String()]; ok {
|
||||
groupVersion = requestGroupVersion
|
||||
} else {
|
||||
klog.Fatal("Unrecognized group/version in request info %q", requestGroupVersion.String())
|
||||
}
|
||||
}
|
||||
|
||||
managedFieldsHandler := fieldmanager.NewScaleHandler(
|
||||
statefulset.ManagedFields,
|
||||
schema.GroupVersion{Group: "apps", Version: "v1"},
|
||||
groupVersion,
|
||||
replicasPathInStatefulSet,
|
||||
)
|
||||
|
||||
|
Reference in New Issue
Block a user