mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-29 14:37:00 +00:00
Expose new REST strategy methods for Pods
This commit is contained in:
parent
a8df434c35
commit
abe8adc2e2
@ -87,12 +87,12 @@ func CheckGeneratedNameError(strategy RESTCreateStrategy, err error, obj runtime
|
|||||||
}
|
}
|
||||||
|
|
||||||
// objectMetaAndKind retrieves kind and ObjectMeta from a runtime object, or returns an error.
|
// objectMetaAndKind retrieves kind and ObjectMeta from a runtime object, or returns an error.
|
||||||
func objectMetaAndKind(strategy RESTCreateStrategy, obj runtime.Object) (*api.ObjectMeta, string, error) {
|
func objectMetaAndKind(typer runtime.ObjectTyper, obj runtime.Object) (*api.ObjectMeta, string, error) {
|
||||||
objectMeta, err := api.ObjectMetaFor(obj)
|
objectMeta, err := api.ObjectMetaFor(obj)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, "", errors.NewInternalError(err)
|
return nil, "", errors.NewInternalError(err)
|
||||||
}
|
}
|
||||||
_, kind, err := strategy.ObjectVersionAndKind(obj)
|
_, kind, err := typer.ObjectVersionAndKind(obj)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, "", errors.NewInternalError(err)
|
return nil, "", errors.NewInternalError(err)
|
||||||
}
|
}
|
||||||
|
@ -23,6 +23,27 @@ import (
|
|||||||
"github.com/GoogleCloudPlatform/kubernetes/pkg/runtime"
|
"github.com/GoogleCloudPlatform/kubernetes/pkg/runtime"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// ObjectFunc is a function to act on a given object. An error may be returned
|
||||||
|
// if the hook cannot be completed. An ObjectFunc may transform the provided
|
||||||
|
// object.
|
||||||
|
type ObjectFunc func(obj runtime.Object) error
|
||||||
|
|
||||||
|
// AllFuncs returns an ObjectFunc that attempts to run all of the provided functions
|
||||||
|
// in order, returning early if there are any errors.
|
||||||
|
func AllFuncs(fns ...ObjectFunc) ObjectFunc {
|
||||||
|
return func(obj runtime.Object) error {
|
||||||
|
for _, fn := range fns {
|
||||||
|
if fn == nil {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if err := fn(obj); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// rcStrategy implements behavior for Replication Controllers.
|
// rcStrategy implements behavior for Replication Controllers.
|
||||||
// TODO: move to a replicationcontroller specific package.
|
// TODO: move to a replicationcontroller specific package.
|
||||||
type rcStrategy struct {
|
type rcStrategy struct {
|
||||||
@ -60,7 +81,7 @@ type podStrategy struct {
|
|||||||
|
|
||||||
// Pods is the default logic that applies when creating and updating Pod
|
// Pods is the default logic that applies when creating and updating Pod
|
||||||
// objects.
|
// objects.
|
||||||
var Pods RESTCreateStrategy = podStrategy{api.Scheme, api.SimpleNameGenerator}
|
var Pods = podStrategy{api.Scheme, api.SimpleNameGenerator}
|
||||||
|
|
||||||
// NamespaceScoped is true for pods.
|
// NamespaceScoped is true for pods.
|
||||||
func (podStrategy) NamespaceScoped() bool {
|
func (podStrategy) NamespaceScoped() bool {
|
||||||
@ -70,7 +91,9 @@ func (podStrategy) NamespaceScoped() bool {
|
|||||||
// ResetBeforeCreate clears fields that are not allowed to be set by end users on creation.
|
// ResetBeforeCreate clears fields that are not allowed to be set by end users on creation.
|
||||||
func (podStrategy) ResetBeforeCreate(obj runtime.Object) {
|
func (podStrategy) ResetBeforeCreate(obj runtime.Object) {
|
||||||
pod := obj.(*api.Pod)
|
pod := obj.(*api.Pod)
|
||||||
pod.Status = api.PodStatus{}
|
pod.Status = api.PodStatus{
|
||||||
|
Phase: api.PodPending,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Validate validates a new pod.
|
// Validate validates a new pod.
|
||||||
@ -79,6 +102,16 @@ func (podStrategy) Validate(obj runtime.Object) errors.ValidationErrorList {
|
|||||||
return validation.ValidatePod(pod)
|
return validation.ValidatePod(pod)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// AllowCreateOnUpdate is false for pods.
|
||||||
|
func (podStrategy) AllowCreateOnUpdate() bool {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
// ValidateUpdate is the default update validation for an end user.
|
||||||
|
func (podStrategy) ValidateUpdate(obj, old runtime.Object) errors.ValidationErrorList {
|
||||||
|
return validation.ValidatePodUpdate(obj.(*api.Pod), old.(*api.Pod))
|
||||||
|
}
|
||||||
|
|
||||||
// svcStrategy implements behavior for Services
|
// svcStrategy implements behavior for Services
|
||||||
// TODO: move to a service specific package.
|
// TODO: move to a service specific package.
|
||||||
type svcStrategy struct {
|
type svcStrategy struct {
|
||||||
|
59
pkg/api/rest/update.go
Normal file
59
pkg/api/rest/update.go
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
/*
|
||||||
|
Copyright 2014 Google Inc. All rights reserved.
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package rest
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/GoogleCloudPlatform/kubernetes/pkg/api"
|
||||||
|
"github.com/GoogleCloudPlatform/kubernetes/pkg/api/errors"
|
||||||
|
"github.com/GoogleCloudPlatform/kubernetes/pkg/runtime"
|
||||||
|
)
|
||||||
|
|
||||||
|
// RESTUpdateStrategy defines the minimum validation, accepted input, and
|
||||||
|
// name generation behavior to update an object that follows Kubernetes
|
||||||
|
// API conventions. A resource may have many UpdateStrategies, depending on
|
||||||
|
// the call pattern in use.
|
||||||
|
type RESTUpdateStrategy interface {
|
||||||
|
runtime.ObjectTyper
|
||||||
|
// NamespaceScoped returns true if the object must be within a namespace.
|
||||||
|
NamespaceScoped() bool
|
||||||
|
// AllowCreateOnUpdate returns true if the object can be created by a PUT.
|
||||||
|
AllowCreateOnUpdate() bool
|
||||||
|
// ValidateUpdate is invoked after default fields in the object have been filled in before
|
||||||
|
// the object is persisted.
|
||||||
|
ValidateUpdate(obj, old runtime.Object) errors.ValidationErrorList
|
||||||
|
}
|
||||||
|
|
||||||
|
// BeforeUpdate ensures that common operations for all resources are performed on update. It only returns
|
||||||
|
// errors that can be converted to api.Status. It will invoke update validation with the provided existing
|
||||||
|
// and updated objects.
|
||||||
|
func BeforeUpdate(strategy RESTUpdateStrategy, ctx api.Context, obj, old runtime.Object) error {
|
||||||
|
objectMeta, kind, kerr := objectMetaAndKind(strategy, obj)
|
||||||
|
if kerr != nil {
|
||||||
|
return kerr
|
||||||
|
}
|
||||||
|
if strategy.NamespaceScoped() {
|
||||||
|
if !api.ValidNamespace(ctx, objectMeta) {
|
||||||
|
return errors.NewBadRequest("the namespace of the provided object does not match the namespace sent on the request")
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
objectMeta.Namespace = api.NamespaceNone
|
||||||
|
}
|
||||||
|
if errs := strategy.ValidateUpdate(obj, old); len(errs) > 0 {
|
||||||
|
return errors.NewInvalid(kind, objectMeta.Name, errs)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
@ -561,7 +561,8 @@ func ValidatePodSpec(spec *api.PodSpec) errs.ValidationErrorList {
|
|||||||
return allErrs
|
return allErrs
|
||||||
}
|
}
|
||||||
|
|
||||||
// ValidatePodUpdate tests to see if the update is legal
|
// ValidatePodUpdate tests to see if the update is legal for an end user to make. newPod is updated with fields
|
||||||
|
// that cannot be changed.
|
||||||
func ValidatePodUpdate(newPod, oldPod *api.Pod) errs.ValidationErrorList {
|
func ValidatePodUpdate(newPod, oldPod *api.Pod) errs.ValidationErrorList {
|
||||||
allErrs := errs.ValidationErrorList{}
|
allErrs := errs.ValidationErrorList{}
|
||||||
|
|
||||||
@ -584,6 +585,7 @@ func ValidatePodUpdate(newPod, oldPod *api.Pod) errs.ValidationErrorList {
|
|||||||
allErrs = append(allErrs, errs.NewFieldInvalid("spec.containers", newPod.Spec.Containers, "some fields are immutable"))
|
allErrs = append(allErrs, errs.NewFieldInvalid("spec.containers", newPod.Spec.Containers, "some fields are immutable"))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
newPod.Status = oldPod.Status
|
||||||
return allErrs
|
return allErrs
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user